O Data Integration do DataWorks permite ler e gravar dados no Hadoop Distributed File System (HDFS) pelos plugins HDFS Reader e HDFS Writer.
O Apsara File Storage for HDFS não é compatível.
Formatos de arquivo compatíveis
|
Plugin |
Formatos compatíveis |
|
HDFS Reader |
TextFile, ORCFile, RCFile, SequenceFile, CSV, Parquet |
|
HDFS Writer |
TextFile, ORCFile, Parquet |
Requisitos de grupo de recursos
O HDFS usa uma lista de permissões de rede para garantir a segurança dos dados. O grupo de recursos padrão não oferece acesso de rede confiável aos endpoints NameNode e DataNode do HDFS. Use um grupo de recursos serverless ou um grupo de recursos exclusivo para Data Integration nas tarefas de sincronização do HDFS.
|
Plugin |
Grupos de recursos compatíveis |
|
HDFS Reader |
Grupo de recursos serverless (recomendado), grupo de recursos exclusivo para Data Integration |
|
HDFS Writer |
Apenas grupo de recursos exclusivo para Data Integration |
Limitações
HDFS Reader
O algoritmo interno de fragmentação impede a leitura simultânea multithread de um único arquivo. Ao especificar vários arquivos, o HDFS Reader os lê simultaneamente. O número real de threads corresponde ao menor valor entre a quantidade de arquivos e a configuração
concurrent.O HDFS Reader não acessa o metastore do Hive. Especifique os tipos de dados explicitamente durante a conversão.
Dados TIMESTAMP armazenados em TextFile e ORCFile têm precisão de nanossegundos (por exemplo,
2015-08-21 22:40:47.397898389). A conversão para o tipodatedescarta os nanossegundos. Para preservá-los, mapeie a coluna para o tipostring.Ao configurar uma tarefa de sincronização HDFS no editor de código, ignore erros de teste de conectividade de rede da fonte de dados HDFS. O sucesso desse teste não é obrigatório.
O Data Integration executa sob a conta
admin. A contaadmindo sistema operacional precisa ter permissões de leitura e gravação nos arquivos HDFS relevantes. Caso contrário, alterne para o editor de código e adicione"hdfsUsername": "user_with_permissions"ao script.
HDFS Writer
Apenas os formatos TextFile, ORCFile e Parquet são compatíveis. Não há suporte para gravação em RCFile, SequenceFile ou CSV.
Não é possível gravar em um subconjunto de colunas. Como o HDFS é um sistema de arquivos sem esquemas, especifique todas as colunas.
Os seguintes tipos de dados do Hive não são compatíveis: DECIMAL, BINARY, ARRAY, MAP, STRUCT e UNION.
Tabelas particionadas do Hive aceitam apenas gravações em partição única.
No formato TextFile, o delimitador de campo usado para gravação deve corresponder ao delimitador definido na criação da tabela Hive. Isso permite associar corretamente os dados aos campos da tabela.
Compatibilidade de versões dos plugins
Tanto o HDFS Reader quanto o HDFS Writer baseiam-se no Hive 1.1.1 e Hadoop 2.7.1 (Apache, adaptado para JDK 1.6 no Reader e JDK 1.7 no Writer). Os plugins foram testados com Hadoop 2.5.0, Hadoop 2.6.0 e Hive 1.2.0.
Funcionamento do HDFS Writer
O HDFS Writer adota uma estratégia de gravação e renomeação para evitar conflitos de arquivos e impedir que outros processos leiam arquivos parcialmente gravados:
Crie uma pasta temporária no HDFS com base no caminho especificado, seguindo a regra de nomenclatura
path_random.Grava todos os arquivos na pasta temporária.
Move os arquivos da pasta temporária para o caminho de destino após concluir a gravação.
Exclui a pasta temporária.
Se ocorrer uma interrupção de rede ou erro de conexão durante a etapa 2 ou 3, exclua manualmente a pasta temporária e quaisquer arquivos gravados.
A conta admin deve ter permissões de leitura e gravação nos arquivos HDFS relevantes.
Tipos de campo compatíveis
Mapeamento de tipos do HDFS Reader
Por padrão, o HDFS Reader converte os tipos de dados do Hive para os tipos internos do Data Integration da seguinte forma:
|
Categoria de tipo |
Tipo do Data Integration |
Tipos de dados do Hive |
|
Inteiro |
|
TINYINT, SMALLINT, INT, BIGINT |
|
Ponto flutuante |
|
FLOAT, DOUBLE |
|
String |
|
STRING, CHAR, VARCHAR, STRUCT, MAP, ARRAY, UNION, BINARY |
|
Data/Hora |
|
DATE, TIMESTAMP |
|
Booleano |
|
BOOLEAN |
Observações sobre tipos específicos:
long: Valores inteiros em um arquivo HDFS, como123456789.double: Valores de ponto flutuante em um arquivo HDFS, como3.1415.boolean: Valores booleanos (trueoufalse). Não diferencia maiúsculas de minúsculas.date: Valores de tempo em um arquivo HDFS, como2014-12-31 00:00:00.
Mapeamento de tipos do HDFS Writer
O HDFS Writer aceita os seguintes tipos de dados do Hive. A configuração das colunas deve corresponder aos tipos de coluna respectivos na tabela Hive.
|
Categoria de tipo |
Tipos de dados do Hive compatíveis |
|
Inteiro |
TINYINT, SMALLINT, INT, BIGINT |
|
Ponto flutuante |
FLOAT, DOUBLE |
|
String |
CHAR, VARCHAR, STRING |
|
Booleano |
BOOLEAN |
|
Data/Hora |
DATE, TIMESTAMP |
Configure uma tarefa de sincronização
Para configurar uma tarefa de sincronização offline de tabela única, consulte:
Para ver todos os parâmetros e um exemplo de script para o editor de código, consulte Apêndice: Exemplo de script e descrições de parâmetros.
Apêndice: Exemplo de script e descrições de parâmetros
Exemplo de script do Reader
O script a seguir mostra uma configuração básica do HDFS Reader. Todos os exemplos usam o parâmetro datasource para referenciar a fonte de dados HDFS configurada no DataWorks.
{
"type": "job",
"version": "2.0",
"steps": [
{
"stepType": "hdfs",
"parameter": {
"datasource": "",
"path": "",
"fileType": "",
"column": [
{
"index": 0,
"type": "string"
},
{
"index": 1,
"type": "long"
},
{
"index": 2,
"type": "double"
},
{
"index": 3,
"type": "boolean"
},
{
"index": 4,
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss"
}
],
"fieldDelimiter": ",",
"encoding": "UTF-8",
"hadoopConfig": {
"dfs.data.transfer.protection": "integrity",
"dfs.datanode.use.datanode.hostname": "true",
"dfs.client.use.datanode.hostname": "true"
}
},
"name": "Reader",
"category": "reader"
},
{
"stepType": "stream",
"parameter": {},
"name": "Writer",
"category": "writer"
}
],
"setting": {
"errorLimit": {
"record": ""
},
"speed": {
"concurrent": 3,
"throttle": true,
"mbps": "12"
}
},
"order": {
"hops": [
{
"from": "Reader",
"to": "Writer"
}
]
}
}
O exemplo a seguir demonstra como configurar o HDFS Reader para ler um arquivo Parquet usando parquetSchema. Defina fileType como parquet e especifique o esquema completo. Use o index no parâmetro column para selecionar e mapear as colunas necessárias.
"reader": {
"name": "hdfsreader",
"parameter": {
"path": "/user/hive/warehouse/addata.db/dw_ads_rtb_monitor_minute/thedate=20170103/hour_id=22/*",
"defaultFS": "h10s010.07100.149:8020",
"fileType": "parquet",
"encoding": "UTF-8",
"column": [
{
"index": 0,
"type": "string"
},
{
"index": 1,
"type": "long"
},
{
"index": 2,
"type": "double"
}
],
"parquetSchema": "message m { optional int32 minute_id; optional int32 dsp_id; optional int32 adx_pid; optional int64 req; optional int64 res; optional int64 suc; optional int64 imp; optional double revenue; }"
}
}
Parâmetros do Reader
|
Parâmetro |
Descrição |
Obrigatório |
Padrão |
|
|
Caminho dos arquivos a serem lidos. Consulte Especificando o caminho de leitura para detalhes sobre caminhos estáticos, curingas e caminhos de partição. |
Sim |
Nenhum |
|
|
Endereço do NameNode do HDFS, por exemplo, |
Sim |
Nenhum |
|
|
Formato do arquivo: |
Sim |
Nenhum |
|
|
Lista de colunas a serem lidas. |
Sim |
Nenhum |
|
|
Delimitador de campo para dados TextFile. Não é necessário para ORCFile (o delimitador padrão do Hive é |
Não |
|
|
|
Codificação do arquivo. |
Não |
|
|
|
String a ser interpretada como valor nulo. Por exemplo, definir |
Não |
Nenhum |
|
|
Formato de compactação para arquivos CSV. Valores compatíveis: |
Não |
Nenhum |
|
|
Obrigatório quando |
Não |
Nenhum |
|
|
Configuração avançada para leitura de arquivos CSV (tipo Map). Se não definido, valores padrão são usados. Consulte Configuração do leitor CSV. |
Não |
Nenhum |
|
|
Parâmetros avançados do Hadoop, como configuração de HA. Consulte Configuração de HA do Hadoop. |
Não |
Nenhum |
|
|
Indica se a autenticação Kerberos está ativada. Se |
Não |
|
|
|
Caminho absoluto do arquivo keytab do Kerberos. Obrigatório se |
Não |
Nenhum |
|
|
Nome do principal Kerberos, como **/hadoopclient@.***. Obrigatório se |
Não |
Nenhum |
Especificando o caminho de leitura
O parâmetro path aceita três abordagens:
Opção 1: Caminho estático — Lê um único arquivo ou todos os arquivos em um diretório. Um único arquivo utiliza uma thread. Exemplo:
/user/hive/warehouse/mytable01/data.csv.Opção 2: Caminho com curinga — Lê múltiplos arquivos correspondentes a um padrão. O HDFS Reader aceita
*(corresponde a quaisquer caracteres) e?(corresponde a um único caractere). Exemplo:/hadoop/data_201704*. O número real de threads corresponde ao menor valor entre a quantidade de arquivos correspondentes e a configuraçãoconcurrent.-
Opção 3: Caminho de partição — Lê dados de um diretório de partição do Hive. Quando uma tabela Hive é criada com partições (por exemplo,
partition(day="20150820", hour="09")), a partição aparece como uma estrutura de diretórios no HDFS. Para ler todos os dados de um determinado dia, defina o caminho da seguinte forma:"path": "/user/hive/warehouse/mytable01/20150820/*"
O Data Integration trata todos os arquivos em uma tarefa de sincronização como uma única tabela. Todos os arquivos devem estar em conformidade com o mesmo esquema, e a conta admin deve ter permissões de leitura sobre eles. Se os nomes dos arquivos seguirem um padrão baseado em tempo, use parâmetros de agendamento para substituir o caminho dinamicamente com base no horário comercial.
Notas sobre análise de formato de arquivo
TextFile e ORCFile analisam tipos complexos do Hive de maneira diferente. Para o tipo map, um ORCFile produz {job=80, team=60}, enquanto um TextFile produz {job:80, team:60}. Os dados são os mesmos, mas o formato difere. Se seus dados incluírem tipos complexos do Hive, use um formato de arquivo consistente em todo o caminho. Para unificar o formato, exporte tabelas TextFile para ORCFile no cliente Hive.
Formato de esquema Parquet
message MessageTypeName {
RequiredStatus DataType ColumnName;
...;
}
MessageTypeName: Nome para o tipo de mensagem.
RequiredStatus: Use
requiredpara colunas não nulas eoptionalpara colunas anuláveis. Defina todas as colunas comooptional.DataType: Os tipos compatíveis são
BOOLEAN,INT32,INT64,INT96,FLOAT,DOUBLE,BINARY(use para tipos string) eFIXED_LEN_BYTE_ARRAY.Termine cada definição de coluna com ponto e vírgula, incluindo a última.
Exemplo:
"parquetSchema": "message m { optional int32 minute_id; optional int32 dsp_id; optional int64 req; optional double revenue; }"
Configuração do leitor CSV
"csvReaderConfig": {
"safetySwitch": false,
"skipEmptyRecords": false,
"useTextQualifier": false
}
Todos os campos disponíveis e seus padrões:
boolean caseSensitive = true;
char textQualifier = 34;
boolean trimWhitespace = true;
boolean useTextQualifier = true; // Whether to use a CSV escape character
char delimiter = 44; // Separator
char recordDelimiter = 0;
char comment = 35;
boolean useComments = false;
int escapeMode = 1;
boolean safetySwitch = true; // Whether to limit a single column to 100,000 characters
boolean skipEmptyRecords = true; // Whether to skip empty rows
boolean captureRawRecord = true;
Configuração de HA do Hadoop
"hadoopConfig": {
"dfs.nameservices": "testDfs",
"dfs.ha.namenodes.testDfs": "namenode1,namenode2",
"dfs.namenode.rpc-address.testDfs.namenode1": "",
"dfs.namenode.rpc-address.testDfs.namenode2": "",
"dfs.client.failover.proxy.provider.testDfs": "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider",
"dfs.data.transfer.protection": "integrity",
"dfs.datanode.use.datanode.hostname": "true",
"dfs.client.use.datanode.hostname": "true"
}
Os parâmetrosdfs.data.transfer.protection,dfs.datanode.use.datanode.hostnameedfs.client.use.datanode.hostnamehabilitam a autenticação Kerberos no plugin HDFS Reader. Se a autenticação Kerberos já estiver configurada na fonte de dados HDFS, esses parâmetros não são necessários na configuração do plugin. Consulte Configure uma fonte de dados HDFS .
Exemplo de configuração Kerberos
"haveKerberos": true,
"kerberosKeytabFilePath": "/opt/datax/**.keytab",
"kerberosPrincipal": "**/hadoopclient@**.**"
Como o Kerberos requer o caminho absoluto para o arquivo keytab, implante esta configuração em um grupo de recursos.
Exemplo de script do Writer
O script a seguir mostra uma configuração básica do HDFS Writer.
{
"type": "job",
"version": "2.0",
"steps": [
{
"stepType": "stream",
"parameter": {},
"name": "Reader",
"category": "reader"
},
{
"stepType": "hdfs",
"parameter": {
"datasource": "",
"path": "",
"fileName": "",
"fileType": "text",
"column": [
{
"name": "col1",
"type": "string"
},
{
"name": "col2",
"type": "int"
},
{
"name": "col3",
"type": "double"
},
{
"name": "col4",
"type": "boolean"
},
{
"name": "col5",
"type": "date"
}
],
"writeMode": "",
"fieldDelimiter": ",",
"encoding": "UTF-8",
"compress": ""
},
"name": "Writer",
"category": "writer"
}
],
"setting": {
"errorLimit": {
"record": ""
},
"speed": {
"concurrent": 3,
"throttle": false
}
},
"order": {
"hops": [
{
"from": "Reader",
"to": "Writer"
}
]
}
}
Parâmetros do Writer
|
Parâmetro |
Descrição |
Obrigatório |
Padrão |
|
|
Endereço do NameNode para HDFS, por exemplo, |
Sim |
Nenhum |
|
|
Formato do arquivo de saída: |
Sim |
Nenhum |
|
|
Caminho de destino no HDFS. O HDFS Writer grava vários arquivos neste diretório com base na configuração |
Sim |
Nenhum |
|
|
Nome base para os arquivos de saída. Um sufixo aleatório é anexado para criar o nome real do arquivo para cada thread. |
Sim |
Nenhum |
|
|
Lista de campos a serem gravados. Especifique todos os nomes ( |
Sim (não necessário para |
Nenhum |
|
|
Comportamento adotado quando arquivos com o mesmo prefixo |
Sim |
Nenhum |
|
|
Delimitador de campo para arquivos de saída. Deve corresponder ao delimitador usado ao criar a tabela Hive, caso contrário, os dados não poderão ser consultados no Hive. Apenas delimitadores de caractere único são compatíveis. Não é necessário quando |
Sim (não necessário para |
Nenhum |
|
|
Tipo de compactação para arquivos de saída. Para arquivos de texto, |
Não |
Nenhum |
|
|
Formato de codificação para arquivos de saída. |
Não |
|
|
|
Obrigatório quando |
Não |
Nenhum |
|
|
Parâmetros avançados do Hadoop, como configuração de HA. Usa o mesmo formato do |
Não |
Nenhum |
|
|
Modo para sincronizar arquivos Parquet. |
Não |
|
|
|
Indica se a autenticação Kerberos está ativada. Se |
Não |
|
|
|
Caminho absoluto do arquivo keytab do Kerberos. Obrigatório se |
Não |
Nenhum |
|
|
Nome do principal Kerberos. Obrigatório se |
Não |
Nenhum |
Modos de gravação
O HDFS Writer usa uma estratégia de gravação e renomeação: ele grava primeiro em uma pasta temporária e depois move os arquivos para o caminho de destino. O parâmetro writeMode controla como os arquivos existentes com o mesmo prefixo fileName são tratados antes do início da gravação.
|
Modo |
Comportamento |
|
|
Nenhuma limpeza antes da gravação. O HDFS Writer anexa arquivos diretamente sem verificar conflitos. |
|
|
Falha a tarefa se qualquer arquivo com o prefixo |
|
|
Exclui todos os arquivos com o prefixo |
O formato Parquet não aceita o modoappend. UsenonConflictpara arquivos Parquet.
Gravação em HDFS com base em OSS
Quando dataxParquetMode é fields, o HDFS Writer aceita OSS como armazenamento subjacente. Adicione os seguintes parâmetros OSS ao hadoopConfig:
"writer": {
"name": "hdfswriter",
"parameter": {
"defaultFS": "oss://test-bucket",
"fileType": "parquet",
"path": "/datasets/oss_demo/kpt",
"fileName": "test",
"writeMode": "truncate",
"encoding": "UTF-8",
"hadoopConfig": {
"fs.oss.accessKeyId": "<your-access-key-id>",
"fs.oss.accessKeySecret": "<your-access-key-secret>",
"fs.oss.endpoint": "oss-cn-hangzhou.aliyuncs.com"
},
"parquetSchema": "message test {\n required int64 id;\n optional binary name (UTF8);\n optional int64 gmt_create;\n required group map_col (MAP) {\n repeated group key_value {\n required binary key (UTF8);\n required binary value (UTF8);\n }\n }\n required group array_col (LIST) {\n repeated group list {\n required binary element (UTF8);\n }\n }\n required group struct_col {\n required int64 id;\n required binary name (UTF8);\n }\n}",
"dataxParquetMode": "fields"
}
}
Substitua os seguintes espaços reservados pelos valores reais:
|
Espaço reservado |
Descrição |
|
|
AccessKey ID para acessar o OSS |
|
|
AccessKey secret para acessar o OSS |