DataWorks Data Integration admite la lectura y escritura en Hadoop Distributed File System (HDFS) mediante los plugins HDFS Reader y HDFS Writer.
Apsara File Storage for HDFS no es compatible.
Formatos de archivo compatibles
|
Plugin |
Supported formats |
|
HDFS Reader |
TextFile, ORCFile, RCFile, SequenceFile, CSV, Parquet |
|
HDFS Writer |
TextFile, ORCFile, Parquet |
Requisitos de resource group
HDFS utiliza una lista de permitidos de red para garantizar la seguridad de los datos, y el resource group predeterminado no proporciona acceso de red confiable a los endpoints de NameNode y DataNode de HDFS. Utilice un serverless resource group o un exclusive resource group for Data Integration para las tareas de sincronización de HDFS.
|
Plugin |
Supported resource groups |
|
HDFS Reader |
Serverless resource group (recomendado), exclusive resource group for Data Integration |
|
HDFS Writer |
Exclusive resource group for Data Integration únicamente |
Limitaciones
HDFS Reader
La lectura concurrente con varios hilos de un archivo único no es compatible debido al algoritmo interno de fragmentación. Cuando se especifican varios archivos, HDFS Reader los lee de forma concurrente; la cantidad real de hilos corresponde al valor menor entre el número de archivos y la configuración
concurrent.HDFS Reader no puede acceder al metastore de Hive. Especifique los tipos de datos explícitamente durante la conversión de tipos.
Los datos TIMESTAMP almacenados en TextFile y ORCFile tienen precisión de nanosegundos (por ejemplo,
2015-08-21 22:40:47.397898389). La conversión al tipodateelimina la parte de nanosegundos. Para conservarla, asigne la columna al tipostringen su lugar.Al configurar una tarea de sincronización de HDFS en el editor de código, no es necesario que la prueba de conectividad de red del origen de datos HDFS sea exitosa. Ignore cualquier error resultante.
Data Integration se ejecuta con la cuenta
admin. La cuentaadmindel sistema operativo debe tener permisos de lectura y escritura sobre los archivos de HDFS correspondientes. De lo contrario, cambie al editor de código y agregue"hdfsUsername": "user_with_permissions"al script.
HDFS Writer
Solo se admiten los formatos TextFile, ORCFile y Parquet. No se admite la escritura en RCFile, SequenceFile ni CSV.
No se admite la escritura en un subconjunto de columnas. Dado que HDFS es un sistema de archivos sin esquemas, se deben especificar todas las columnas.
Los siguientes tipos de datos de Hive no son compatibles: DECIMAL, BINARY, ARRAY, MAP, STRUCT y UNION.
Para tablas particionadas de Hive, solo se admite la escritura en una sola partición.
En TextFile, el delimitador de campos utilizado para la escritura debe coincidir con el delimitador usado al crear la tabla de Hive, de modo que los datos puedan asociarse correctamente con los campos de dicha tabla.
Compatibilidad de versiones de plugins
Tanto HDFS Reader como HDFS Writer están basados en Hive 1.1.1 y Hadoop 2.7.1 (Apache, adaptado para JDK 1.6 en Reader y JDK 1.7 en Writer). Los plugins se han probado con Hadoop 2.5.0, Hadoop 2.6.0 y Hive 1.2.0.
Funcionamiento de HDFS Writer
HDFS Writer emplea una estrategia de escritura y renombrado para evitar conflictos de archivos e impedir que otros procesos lean archivos parcialmente escritos:
Crea una carpeta temporal en HDFS basada en la ruta especificada, utilizando la regla de nomenclatura
path_random.Escribe todos los archivos en la carpeta temporal.
Una vez escritos todos los archivos, los mueve de la carpeta temporal a la ruta de destino.
Elimina la carpeta temporal.
Si ocurre una interrupción de red o un error de conexión durante el paso 2 o 3, elimine manualmente la carpeta temporal y cualquier archivo que se haya escrito.
La cuenta admin debe tener permisos de lectura y escritura sobre los archivos de HDFS correspondientes.
Tipos de campo compatibles
Asignación de tipos de HDFS Reader
De forma predeterminada, HDFS Reader convierte los tipos de datos de Hive a los tipos internos de Data Integration de la siguiente manera:
|
Type category |
Data Integration type |
Hive data types |
|
Entero |
|
TINYINT, SMALLINT, INT, BIGINT |
|
Punto flotante |
|
FLOAT, DOUBLE |
|
Cadena |
|
STRING, CHAR, VARCHAR, STRUCT, MAP, ARRAY, UNION, BINARY |
|
Fecha/Hora |
|
DATE, TIMESTAMP |
|
Booleano |
|
BOOLEAN |
Notas sobre tipos específicos:
long: Valores enteros en un archivo HDFS, como123456789.double: Valores de punto flotante en un archivo HDFS, como3.1415.boolean: Valores booleanos (trueofalse). No distingue entre mayúsculas y minúsculas.date: Valores de tiempo en un archivo HDFS, como2014-12-31 00:00:00.
Asignación de tipos de HDFS Writer
HDFS Writer admite los siguientes tipos de datos de Hive. La configuración de columnas debe coincidir con los tipos de columna correspondientes en la tabla de Hive.
|
Type category |
Supported Hive data types |
|
Entero |
TINYINT, SMALLINT, INT, BIGINT |
|
Punto flotante |
FLOAT, DOUBLE |
|
Cadena |
CHAR, VARCHAR, STRING |
|
Booleano |
BOOLEAN |
|
Fecha/Hora |
DATE, TIMESTAMP |
Configurar una tarea de sincronización
Para configurar una tarea de sincronización sin conexión de tabla única, consulte:
Para consultar todos los parámetros y un ejemplo de script para el editor de código, véase Appendix: Script demo and parameter descriptions.
Apéndice: Demostración de scripts y descripción de parámetros
Demostración de script de Reader
El siguiente script muestra una configuración básica de HDFS Reader. Todos los ejemplos utilizan el parámetro datasource para hacer referencia al origen de datos HDFS configurado en 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"
}
]
}
}
El siguiente ejemplo muestra cómo configurar HDFS Reader para leer un archivo Parquet mediante parquetSchema. Establezca fileType en parquet y especifique el esquema completo. Utilice el index en el parámetro column para seleccionar y asignar las columnas necesarias.
"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 de Reader
|
Parameter |
Description |
Required |
Default |
|
|
La ruta de los archivos que se van a leer. Consulte Especificación de la ruta de lectura para obtener detalles sobre rutas estáticas, comodines y rutas de particiones. |
Sí |
Ninguna |
|
|
La dirección del NameNode de HDFS, por ejemplo, |
Sí |
Ninguna |
|
|
El formato de archivo: |
Sí |
Ninguna |
|
|
La lista de columnas que se van a leer. |
Sí |
Ninguna |
|
|
El delimitador de campos para datos TextFile. No es obligatorio para ORCFile (el delimitador predeterminado de Hive es |
No |
|
|
|
La codificación del archivo. |
No |
|
|
|
La cadena que se interpretará como valor nulo. Por ejemplo, establecer |
No |
Ninguna |
|
|
El formato de compresión para archivos CSV. Valores admitidos: |
No |
Ninguna |
|
|
Obligatorio cuando |
No |
Ninguna |
|
|
Configuración avanzada para leer archivos CSV (tipo Map). Si no se establece, se utilizan los valores predeterminados. Consulte Configuración del lector CSV. |
No |
Ninguna |
|
|
Parámetros avanzados de Hadoop, como la configuración de HA. Consulte Configuración de HA de Hadoop. |
No |
Ninguna |
|
|
Indica si la autenticación Kerberos está habilitada. Si es |
No |
|
|
|
La ruta absoluta del archivo keytab de Kerberos. Obligatorio si |
No |
Ninguna |
|
|
El nombre de entidad de seguridad de Kerberos, como |
No |
Ninguna |
Especificación de la ruta de lectura
El parámetro path admite tres enfoques:
Opción 1: Ruta estática — Lee un solo archivo o todos los archivos de un directorio. Un solo archivo utiliza un hilo. Ejemplo:
/user/hive/warehouse/mytable01/data.csv.Opción 2: Ruta con comodines — Lee varios archivos que coinciden con un patrón. HDFS Reader admite
*(coincide con cualquier carácter) y?(coincide con un solo carácter). Ejemplo:/hadoop/data_201704*. La cantidad real de hilos corresponde al valor menor entre el número de archivos coincidentes y la configuraciónconcurrent.-
Opción 3: Ruta de partición — Lee datos de un directorio de partición de Hive. Cuando se crea una tabla de Hive con particiones (por ejemplo,
partition(day="20150820", hour="09")), la partición aparece como una estructura de directorios en HDFS. Para leer todos los datos de un día determinado, establezca la ruta de la siguiente manera:"path": "/user/hive/warehouse/mytable01/20150820/*"
Data Integration trata todos los archivos de una tarea de sincronización como una sola tabla. Todos los archivos deben cumplir con el mismo esquema y la cuenta admin debe tener permisos de lectura sobre ellos. Si los nombres de archivo siguen un patrón basado en tiempo, utilice scheduling parameters para reemplazar la ruta dinámicamente según el tiempo del negocio.
Notas sobre el análisis de formatos de archivo
TextFile y ORCFile analizan los tipos complejos de Hive de manera diferente. Para el tipo map, un ORCFile produce {job=80, team=60}, mientras que un TextFile produce {job:80, team:60}. Los datos son los mismos, pero el formato difiere. Si sus datos incluyen tipos complejos de Hive, utilice un formato de archivo consistente en toda la ruta. Para unificar el formato, exporte las tablas TextFile a ORCFile en el cliente de Hive.
Formato de esquema Parquet
message MessageTypeName {
RequiredStatus DataType ColumnName;
...;
}
MessageTypeName: Un nombre para el tipo de mensaje.
RequiredStatus: Utilice
requiredpara columnas no nulas yoptionalpara columnas que aceptan valores nulos. Establezca todas las columnas comooptional.DataType: Los tipos admitidos son
BOOLEAN,INT32,INT64,INT96,FLOAT,DOUBLE,BINARY(utilizar para tipos de cadena) yFIXED_LEN_BYTE_ARRAY.Finalice cada definición de columna con punto y coma, incluida la última.
Ejemplo:
"parquetSchema": "message m { optional int32 minute_id; optional int32 dsp_id; optional int64 req; optional double revenue; }"
Configuración del lector CSV
"csvReaderConfig": {
"safetySwitch": false,
"skipEmptyRecords": false,
"useTextQualifier": false
}
Todos los campos disponibles y sus valores predeterminados:
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;
Configuración de HA de 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"
}
Los parámetrosdfs.data.transfer.protection,dfs.datanode.use.datanode.hostnameydfs.client.use.datanode.hostnamehabilitan la autenticación Kerberos en el plugin HDFS Reader. Si la autenticación Kerberos ya está configurada en el origen de datos HDFS, estos parámetros no son necesarios en la configuración del plugin. Consulte Configure an HDFS data source .
Ejemplo de configuración de Kerberos
"haveKerberos": true,
"kerberosKeytabFilePath": "/opt/datax/**.keytab",
"kerberosPrincipal": "**/hadoopclient@**.**"
Dado que Kerberos requiere la ruta absoluta al archivo keytab, despliegue esta configuración en un resource group.
Demostración de script de Writer
El siguiente script muestra una configuración básica de 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 de Writer
|
Parameter |
Description |
Required |
Default |
|
|
La dirección del NameNode para HDFS, por ejemplo, |
Sí |
Ninguna |
|
|
El formato de archivo de salida: |
Sí |
Ninguna |
|
|
La ruta de destino en HDFS. HDFS Writer escribe varios archivos en este directorio según la configuración |
Sí |
Ninguna |
|
|
El nombre base para los archivos de salida. Se agrega un sufijo aleatorio para crear el nombre de archivo real de cada hilo. |
Sí |
Ninguna |
|
|
La lista de campos que se van a escribir. Especifique todos los nombres de campo ( |
Sí (no obligatorio para |
Ninguna |
|
|
El comportamiento cuando ya existen archivos con el mismo prefijo |
Sí |
Ninguna |
|
|
El delimitador de campos para los archivos de salida. Debe coincidir con el delimitador utilizado al crear la tabla de Hive; de lo contrario, los datos no se podrán consultar en Hive. Solo se admiten delimitadores de un solo carácter. No es obligatorio cuando |
Sí (no obligatorio para |
Ninguna |
|
|
El tipo de compresión para los archivos de salida. Para archivos de texto, se admiten |
No |
Ninguna |
|
|
El formato de codificación para los archivos de salida. |
No |
|
|
|
Obligatorio cuando |
No |
Ninguna |
|
|
Parámetros avanzados de Hadoop, como la configuración de HA. Utiliza el mismo formato que el |
No |
Ninguna |
|
|
El modo para sincronizar archivos Parquet. |
No |
|
|
|
Indica si la autenticación Kerberos está habilitada. Si es |
No |
|
|
|
La ruta absoluta del archivo keytab de Kerberos. Obligatorio si |
No |
Ninguna |
|
|
El nombre de entidad de seguridad de Kerberos. Obligatorio si |
No |
Ninguna |
Modos de escritura
HDFS Writer utiliza una estrategia de escritura y renombrado: primero escribe en una carpeta temporal y luego mueve los archivos a la ruta de destino. El parámetro writeMode controla cómo se manejan los archivos existentes con el mismo prefijo fileName antes de comenzar la escritura.
|
Mode |
Behavior |
|
|
Sin limpieza previa a la escritura. HDFS Writer anexa archivos directamente sin comprobar si hay conflictos. |
|
|
Falla la tarea si ya existe algún archivo con el prefijo |
|
|
Elimina todos los archivos con el prefijo |
El formato Parquet no admite el modoappend. UtilicenonConflictpara archivos Parquet.
Escritura en HDFS respaldado por OSS
Cuando dataxParquetMode es fields, HDFS Writer admite OSS como almacenamiento subyacente. Agregue los siguientes parámetros de OSS a 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"
}
}
Reemplace los siguientes marcadores de posición con los valores reales:
|
Placeholder |
Description |
|
|
El AccessKey ID para acceder a OSS |
|
|
El AccessKey secret para acceder a OSS |