DataWorks Data Integration permet de lire et d'écrire des données dans le système de fichiers distribué Hadoop (HDFS) via les plug-ins HDFS Reader et HDFS Writer.
Apsara File Storage for HDFS n'est pas pris en charge.
Formats de fichiers pris en charge
|
Plugin |
Formats pris en charge |
|
HDFS Reader |
TextFile, ORCFile, RCFile, SequenceFile, CSV, Parquet |
|
HDFS Writer |
TextFile, ORCFile, Parquet |
Exigences relatives aux groupes de ressources
HDFS utilise une liste blanche réseau pour sécuriser les données. Le groupe de ressources par défaut ne garantit pas un accès réseau fiable aux endpoints NameNode et DataNode de HDFS. Pour les tâches de synchronisation HDFS, utilisez un groupe de ressources serverless ou un groupe de ressources exclusif pour Data Integration.
|
Plugin |
Groupes de ressources pris en charge |
|
HDFS Reader |
Groupe de ressources serverless (recommandé), groupe de ressources exclusif pour Data Integration |
|
HDFS Writer |
Groupe de ressources exclusif pour Data Integration uniquement |
Limitations
HDFS Reader
La lecture simultanée multithread d'un fichier unique n'est pas prise en charge en raison de l'algorithme de découpage interne. Si vous spécifiez plusieurs fichiers, HDFS Reader les lit de manière concurrente : le nombre réel de threads correspond au minimum entre le nombre de fichiers et la valeur du paramètre
concurrent.HDFS Reader ne peut pas accéder au metastore de Hive. Spécifiez explicitement les types de données lors de la conversion.
Les données TIMESTAMP stockées dans TextFile et ORCFile sont précises à la nanoseconde près (par exemple,
2015-08-21 22:40:47.397898389). La conversion vers le typedatesupprime la partie nanoseconde. Pour la conserver, mappez la colonne sur le typestring.Lorsque vous configurez une tâche de synchronisation HDFS dans l'éditeur de code, le test de connectivité réseau pour la source de données HDFS n'est pas obligatoire. Ignorez les erreurs éventuelles.
Data Integration s'exécute sous le compte
admin. Le compteadmindu système d'exploitation doit disposer des autorisations de lecture et d'écriture sur les fichiers HDFS concernés. Si ce n'est pas le cas, basculez vers l'éditeur de code et ajoutez"hdfsUsername": "user_with_permissions"au script.
HDFS Writer
Seuls les formats TextFile, ORCFile et Parquet sont pris en charge. L'écriture dans RCFile, SequenceFile ou CSV n'est pas prise en charge.
L'écriture dans un sous-ensemble de colonnes n'est pas prise en charge. Comme HDFS est un système de fichiers sans schéma, vous devez spécifier toutes les colonnes.
Les types de données Hive suivants ne sont pas pris en charge : DECIMAL, BINARY, ARRAY, MAP, STRUCT et UNION.
Pour les tables partitionnées Hive, seules les écritures sur une partition unique sont prises en charge.
Pour TextFile, le délimiteur de champ utilisé lors de l'écriture doit correspondre à celui défini lors de la création de la table Hive, afin que les données soient correctement associées aux champs de la table.
Compatibilité des versions de plug-in
HDFS Reader et HDFS Writer reposent tous deux sur Hive 1.1.1 et Hadoop 2.7.1 (Apache, adapté pour JDK 1.6 pour Reader et JDK 1.7 pour Writer). Les plug-ins ont été testés avec Hadoop 2.5.0, Hadoop 2.6.0 et Hive 1.2.0.
Fonctionnement de HDFS Writer
HDFS Writer utilise une stratégie d'écriture suivie d'un renommage pour éviter les conflits de fichiers et empêcher la lecture de fichiers partiellement écrits par d'autres processus :
Crée un dossier temporaire dans HDFS selon le chemin spécifié, en appliquant la règle de nommage
path_random.Écrit tous les fichiers dans le dossier temporaire.
Une fois l'écriture terminée, déplace les fichiers du dossier temporaire vers le chemin de destination.
Supprime le dossier temporaire.
En cas d'interruption réseau ou d'erreur de connexion durant l'étape 2 ou 3, supprimez manuellement le dossier temporaire ainsi que les fichiers écrits.
Le compte admin doit disposer des autorisations de lecture et d'écriture sur les fichiers HDFS concernés.
Types de champs pris en charge
Mappage des types pour HDFS Reader
Par défaut, HDFS Reader convertit les types de données Hive en types internes Data Integration comme suit :
|
Catégorie de type |
Type Data Integration |
Types de données Hive |
|
Entier |
|
TINYINT, SMALLINT, INT, BIGINT |
|
Virgule flottante |
|
FLOAT, DOUBLE |
|
Chaîne |
|
STRING, CHAR, VARCHAR, STRUCT, MAP, ARRAY, UNION, BINARY |
|
Date/Heure |
|
DATE, TIMESTAMP |
|
Booléen |
|
BOOLEAN |
Remarques sur certains types spécifiques :
long: Valeurs entières dans un fichier HDFS, telles que123456789.double: Valeurs à virgule flottante dans un fichier HDFS, telles que3.1415.boolean: Valeurs booléennes (trueoufalse). Non sensible à la casse.date: Valeurs temporelles dans un fichier HDFS, telles que2014-12-31 00:00:00.
Mappage des types pour HDFS Writer
HDFS Writer prend en charge les types de données Hive suivants. La configuration des colonnes doit correspondre aux types de colonnes de la table Hive.
|
Catégorie de type |
Types de données Hive pris en charge |
|
Entier |
TINYINT, SMALLINT, INT, BIGINT |
|
Virgule flottante |
FLOAT, DOUBLE |
|
Chaîne |
CHAR, VARCHAR, STRING |
|
Booléen |
BOOLEAN |
|
Date/Heure |
DATE, TIMESTAMP |
Configurer une tâche de synchronisation
Pour configurer une tâche de synchronisation hors ligne pour une seule table, consultez :
Pour la description de tous les paramètres et un exemple de script pour l'éditeur de code, consultez Annexe : Démo de script et description des paramètres.
Annexe : Démo de script et description des paramètres
Démo de script pour Reader
Le script suivant présente une configuration de base de HDFS Reader. Tous les exemples utilisent le paramètre datasource pour référencer la source de données HDFS configurée dans 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"
}
]
}
}
L'exemple suivant montre comment configurer HDFS Reader pour lire un fichier Parquet en utilisant parquetSchema. Définissez fileType sur parquet et spécifiez le schéma complet. Utilisez l'index dans le paramètre column pour sélectionner et mapper les colonnes requises.
"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; }"
}
}
Paramètres de Reader
|
Paramètre |
Description |
Obligatoire |
Valeur par défaut |
|
|
Chemin des fichiers à lire. Consultez Spécification du chemin de lecture pour plus de détails sur les chemins statiques, les caractères génériques et les chemins de partition. |
Oui |
Aucune |
|
|
Adresse du NameNode HDFS, par exemple |
Oui |
Aucune |
|
|
Format de fichier : |
Oui |
Aucune |
|
|
Liste des colonnes à lire. |
Oui |
Aucune |
|
|
Délimiteur de champ pour les données TextFile. Non requis pour ORCFile (le délimiteur par défaut de Hive est |
Non |
|
|
|
Encodage du fichier. |
Non |
|
|
|
Chaîne à interpréter comme une valeur null. Par exemple, définir |
Non |
Aucune |
|
|
Format de compression pour les fichiers CSV. Valeurs prises en charge : |
Non |
Aucune |
|
|
Requis lorsque |
Non |
Aucune |
|
|
Configuration avancée pour la lecture des fichiers CSV (type Map). Si non défini, les valeurs par défaut sont utilisées. Consultez Configuration du lecteur CSV. |
Non |
Aucune |
|
|
Paramètres Hadoop avancés, tels que la configuration HA. Consultez Configuration HA de Hadoop. |
Non |
Aucune |
|
|
Indique si l'authentification Kerberos est activée. Si |
Non |
|
|
|
Chemin absolu du fichier keytab Kerberos. Requis si |
Non |
Aucune |
|
|
Nom principal Kerberos, tel que **/hadoopclient@.***. Requis si |
Non |
Aucune |
Spécification du chemin de lecture
Le paramètre path prend en charge trois approches :
Option 1 : Chemin statique — Lit un seul fichier ou tous les fichiers d'un répertoire. Un seul fichier utilise un thread. Exemple :
/user/hive/warehouse/mytable01/data.csv.Option 2 : Chemin avec caractère générique — Lit plusieurs fichiers correspondant à un modèle. HDFS Reader prend en charge
*(correspond à n'importe quels caractères) et?(correspond à un seul caractère). Exemple :/hadoop/data_201704*. Le nombre réel de threads correspond au minimum entre le nombre de fichiers correspondants et la valeur du paramètreconcurrent.-
Option 3 : Chemin de partition — Lit les données d'un répertoire de partition Hive. Lorsqu'une table Hive est créée avec des partitions (par exemple,
partition(day="20150820", hour="09")), la partition apparaît comme une structure de répertoire dans HDFS. Pour lire toutes les données d'un jour donné, définissez le chemin comme suit :"path": "/user/hive/warehouse/mytable01/20150820/*"
Data Integration traite tous les fichiers d'une tâche de synchronisation comme une seule table. Tous les fichiers doivent respecter le même schéma, et le compte admin doit disposer des autorisations de lecture sur ces fichiers. Si les noms de fichiers suivent un modèle basé sur le temps, utilisez les paramètres de planification pour remplacer dynamiquement le chemin en fonction de l'heure métier.
Notes sur l'analyse des formats de fichier
TextFile et ORCFile analysent différemment les types complexes Hive. Pour le type map, un fichier ORCFile produit {job=80, team=60} tandis qu'un fichier TextFile produit {job:80, team:60}. Les données sont identiques, mais le format diffère. Si vos données incluent des types complexes Hive, utilisez un format de fichier cohérent sur tout le chemin. Pour uniformiser le format, exportez les tables TextFile vers ORCFile dans le client Hive.
Format du schéma Parquet
message MessageTypeName {
RequiredStatus DataType ColumnName;
...;
}
MessageTypeName : Nom du type de message.
RequiredStatus : Utilisez
requiredpour les colonnes non nulles etoptionalpour les colonnes pouvant être nulles. Définissez toutes les colonnes suroptional.DataType : Types pris en charge :
BOOLEAN,INT32,INT64,INT96,FLOAT,DOUBLE,BINARY(à utiliser pour les types chaîne) etFIXED_LEN_BYTE_ARRAY.Terminez chaque définition de colonne par un point-virgule, y compris la dernière.
Exemple :
"parquetSchema": "message m { optional int32 minute_id; optional int32 dsp_id; optional int64 req; optional double revenue; }"
Configuration du lecteur CSV
"csvReaderConfig": {
"safetySwitch": false,
"skipEmptyRecords": false,
"useTextQualifier": false
}
Tous les champs disponibles et leurs valeurs par défaut :
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;
Configuration 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"
}
Les paramètresdfs.data.transfer.protection,dfs.datanode.use.datanode.hostnameetdfs.client.use.datanode.hostnameactivent l'authentification Kerberos dans le plug-in HDFS Reader. Si l'authentification Kerberos est déjà configurée sur la source de données HDFS, ces paramètres ne sont pas requis dans la configuration du plug-in. Consultez Configurer une source de données HDFS .
Exemple de configuration Kerberos
"haveKerberos": true,
"kerberosKeytabFilePath": "/opt/datax/**.keytab",
"kerberosPrincipal": "**/hadoopclient@**.**"
Comme Kerberos nécessite le chemin absolu vers le fichier keytab, déployez cette configuration sur un groupe de ressources.
Démo de script pour Writer
Le script suivant présente une configuration de base 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"
}
]
}
}
Paramètres de Writer
|
Paramètre |
Description |
Obligatoire |
Valeur par défaut |
|
|
Adresse NameNode pour HDFS, par exemple |
Oui |
Aucune |
|
|
Format de fichier de sortie : |
Oui |
Aucune |
|
|
Chemin de destination dans HDFS. HDFS Writer écrit plusieurs fichiers dans ce répertoire en fonction du paramètre |
Oui |
Aucune |
|
|
Nom de fichier de base pour les fichiers de sortie. Un suffixe aléatoire est ajouté pour créer le nom de fichier réel pour chaque thread. |
Oui |
Aucune |
|
|
Liste des champs à écrire. Spécifiez tous les noms de champs ( |
Oui (non requis pour |
Aucune |
|
|
Comportement lorsque des fichiers avec le même préfixe |
Oui |
Aucune |
|
|
Délimiteur de champ pour les fichiers de sortie. Doit correspondre au délimiteur utilisé lors de la création de la table Hive, sinon les données ne peuvent pas être interrogées dans Hive. Seuls les délimiteurs à caractère unique sont pris en charge. Non requis lorsque |
Oui (non requis pour |
Aucune |
|
|
Type de compression pour les fichiers de sortie. Pour les fichiers texte, |
Non |
Aucune |
|
|
Format d'encodage pour les fichiers de sortie. |
Non |
|
|
|
Requis lorsque |
Non |
Aucune |
|
|
Paramètres Hadoop avancés, tels que la configuration HA. Utilise le même format que le |
Non |
Aucune |
|
|
Mode de synchronisation des fichiers Parquet. |
Non |
|
|
|
Indique si l'authentification Kerberos est activée. Si |
Non |
|
|
|
Chemin absolu du fichier keytab Kerberos. Requis si |
Non |
Aucune |
|
|
Nom principal Kerberos. Requis si |
Non |
Aucune |
Modes d'écriture
HDFS Writer utilise une stratégie d'écriture suivie d'un renommage : il écrit d'abord dans un dossier temporaire, puis déplace les fichiers vers le chemin de destination. Le paramètre writeMode contrôle la gestion des fichiers existants avec le même préfixe fileName avant le début de l'écriture.
|
Mode |
Comportement |
|
|
Aucun nettoyage avant l'écriture. HDFS Writer ajoute des fichiers directement sans vérifier les conflits. |
|
|
Échec de la tâche si un fichier avec le préfixe |
|
|
Supprime tous les fichiers avec le préfixe |
Le format Parquet ne prend pas en charge le modeappend. UtiliseznonConflictpour les fichiers Parquet.
Écriture dans HDFS basé sur OSS
Lorsque dataxParquetMode est fields, HDFS Writer prend en charge OSS comme stockage sous-jacent. Ajoutez les paramètres OSS suivants à 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"
}
}
Remplacez les espaces réservés suivants par des valeurs réelles :
|
Espace réservé |
Description |
|
|
ID AccessKey pour accéder à OSS |
|
|
Secret AccessKey pour accéder à OSS |