Copie de données entre DynamoDB et HDFS - Amazon DynamoDB

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Copie de données entre DynamoDB et HDFS

Si vous disposez de données dans une table DynamoDB, vous pouvez utiliser Hive pour copier les données vers le système de fichiers distribué Hadoop (HDFS).

Vous pouvez faire cela si vous exécutez une tâche MapReduce nécessitant des données de DynamoDB. Si vous copiez les données de DynamoDB vers HDFS, Hadoop peut les traiter en utilisant tous les nœuds disponibles dans le cluster Amazon EMR en parallèle. Une fois la tâche MapReduce terminée, vous pouvez écrire les résultats de HDFS vers DDB.

Dans les exemples suivants, Hive lit et écrit dans le répertoire HDFS suivant : /user/hadoop/hive-test

Note

Les exemples fournis dans cette section partent du principe que vous avez suivi les étapes décrites dans Didacticiel : Utilisation d'Amazon DynamoDB et d'Apache Hive et disposez d'une table externe dans DynamoDB nommée ddb_features.

Copie de données à l'aide du format par défaut de Hive

Exemple De DynamoDB vers HDFS

Utilisez une instruction INSERT OVERWRITE pour écrire directement sur HDFS.

INSERT OVERWRITE DIRECTORY 'hdfs:///user/hadoop/hive-test' SELECT * FROM ddb_features;

Le fichier de données dans HDFS ressemble à ceci :

920709^ASoldiers Farewell Hill^ASummit^ANM^A32.3564729^A-108.33004616135 1178153^AJones Run^AStream^APA^A41.2120086^A-79.25920781260 253838^ASentinel Dome^ASummit^ACA^A37.7229821^A-119.584338133 264054^ANeversweet Gulch^AValley^ACA^A41.6565269^A-122.83614322900 115905^AChacaloochee Bay^ABay^AAL^A30.6979676^A-87.97388530

Les champs sont séparés par un caractère SOH (début d'en-tête, 0x01). Dans le fichier, SOH s'affiche sous la forme ^A.

Exemple De HDFS vers DynamoDB
  1. Créez une table externe qui mappe à des données non mises en forme dans HDFS.

    CREATE EXTERNAL TABLE hdfs_features_unformatted (feature_id BIGINT, feature_name STRING , feature_class STRING , state_alpha STRING, prim_lat_dec DOUBLE , prim_long_dec DOUBLE , elev_in_ft BIGINT) LOCATION 'hdfs:///user/hadoop/hive-test';
  2. Copiez les données vers DynamoDB.

    INSERT OVERWRITE TABLE ddb_features SELECT * FROM hdfs_features_unformatted;

Copie de données avec un format spécifié par l'utilisateur

Si vous souhaitez utiliser un autre caractère séparateur de champs, vous pouvez créer une table externe qui mappe au répertoire HDFS. Vous pouvez utiliser cette technique pour créer des fichiers de données avec des valeurs séparées par des virgules (CSV).

Exemple De DynamoDB vers HDFS
  1. Créez une table externe Hive qui mappe à HDFS. Lorsque vous effectuez cette opération, assurez-vous que les types de données sont cohérents avec ceux de la table externe DynamoDB.

    CREATE EXTERNAL TABLE hdfs_features_csv (feature_id BIGINT, feature_name STRING , feature_class STRING , state_alpha STRING, prim_lat_dec DOUBLE , prim_long_dec DOUBLE , elev_in_ft BIGINT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 'hdfs:///user/hadoop/hive-test';
  2. Copiez les données à partir de DynamoDB.

    INSERT OVERWRITE TABLE hdfs_features_csv SELECT * FROM ddb_features;

Le fichier de données dans HDFS ressemble à ceci :

920709,Soldiers Farewell Hill,Summit,NM,32.3564729,-108.3300461,6135 1178153,Jones Run,Stream,PA,41.2120086,-79.2592078,1260 253838,Sentinel Dome,Summit,CA,37.7229821,-119.58433,8133 264054,Neversweet Gulch,Valley,CA,41.6565269,-122.8361432,2900 115905,Chacaloochee Bay,Bay,AL,30.6979676,-87.9738853,0
Exemple De HDFS vers DynamoDB

Avec une seule instruction HiveQL, vous pouvez remplir la table DynamoDB à l'aide des données de HDFS :

INSERT OVERWRITE TABLE ddb_features SELECT * FROM hdfs_features_csv;

Copie de données sans mappage de colonnes

Vous pouvez copier des données de DynamoDB dans un format brut et les écrire dans HDFS sans spécifier de types de données ou de mappage de colonnes. Vous pouvez utiliser cette méthode pour créer une archive des données DynamoDB et la stocker dans HDFS.

Note

Si votre table DynamoDB contient des attributs de type Map, List, Boolean ou Null, c'est la seule façon d'utiliser Hive pour copier des données de DynamoDB vers HDFS.

Exemple De DynamoDB vers HDFS
  1. Créez une table externe associée à votre table DynamoDB. (Il n'y a pas de dynamodb.column.mapping dans cette instruction HiveQL.)

    CREATE EXTERNAL TABLE ddb_features_no_mapping (item MAP<STRING, STRING>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "Features");

  2. Créez une autre table externe associée à votre répertoire HDFS.

    CREATE EXTERNAL TABLE hdfs_features_no_mapping (item MAP<STRING, STRING>) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' LOCATION 'hdfs:///user/hadoop/hive-test';
  3. Copiez les données de DynamoDB vers HDFS.

    INSERT OVERWRITE TABLE hdfs_features_no_mapping SELECT * FROM ddb_features_no_mapping;

Le fichier de données dans HDFS ressemble à ceci :

Name^C{"s":"Soldiers Farewell Hill"}^BState^C{"s":"NM"}^BClass^C{"s":"Summit"}^BElevation^C{"n":"6135"}^BLatitude^C{"n":"32.3564729"}^BId^C{"n":"920709"}^BLongitude^C{"n":"-108.3300461"} Name^C{"s":"Jones Run"}^BState^C{"s":"PA"}^BClass^C{"s":"Stream"}^BElevation^C{"n":"1260"}^BLatitude^C{"n":"41.2120086"}^BId^C{"n":"1178153"}^BLongitude^C{"n":"-79.2592078"} Name^C{"s":"Sentinel Dome"}^BState^C{"s":"CA"}^BClass^C{"s":"Summit"}^BElevation^C{"n":"8133"}^BLatitude^C{"n":"37.7229821"}^BId^C{"n":"253838"}^BLongitude^C{"n":"-119.58433"} Name^C{"s":"Neversweet Gulch"}^BState^C{"s":"CA"}^BClass^C{"s":"Valley"}^BElevation^C{"n":"2900"}^BLatitude^C{"n":"41.6565269"}^BId^C{"n":"264054"}^BLongitude^C{"n":"-122.8361432"} Name^C{"s":"Chacaloochee Bay"}^BState^C{"s":"AL"}^BClass^C{"s":"Bay"}^BElevation^C{"n":"0"}^BLatitude^C{"n":"30.6979676"}^BId^C{"n":"115905"}^BLongitude^C{"n":"-87.9738853"}

Chaque champ commence par un caractère STX (début de texte, 0x02) et se termine par un caractère ETX (fin de texte, 0x03). Dans le fichier, STX apparaît sous la forme ^B, et ETX sous la forme ^C.

Exemple De HDFS vers DynamoDB

Avec une seule instruction HiveQL, vous pouvez remplir la table DynamoDB à l'aide des données de HDFS :

INSERT OVERWRITE TABLE ddb_features_no_mapping SELECT * FROM hdfs_features_no_mapping;

Accès aux données dans HDFS

HDFS est un système de fichiers distribué, accessible à tous les nœuds dans le cluster Amazon EMR. Si vous utilisez SSH pour vous connecter au nœud leader, vous pouvez utiliser des outils de ligne de commande pour accéder aux données que Hive a écrites sur HDFS.

HDFS n'est pas la même chose que le système de fichiers local sur le nœud leader. Vous ne pouvez pas utiliser des fichiers et répertoires dans HDFS à l'aide de commandes Linux standard (telles que cat, cp, mv ou rm). Au lieu de cela, vous effectuez ces tâches à l'aide de la commande hadoop fs.

Les étapes suivantes partent du principe que vous avez copié les données de DynamoDB vers HDFS en suivant l'une des procédures décrites dans cette section.

  1. Si vous vous trouvez à l'invite de commande Hive, passez l'invite de commande Linux.

    hive> exit;
  2. Répertoriez le contenu du répertoire /user/hadoop/hive-test dans HDFS. (C'est là que Hive a copié les données de DynamoDB.)

    hadoop fs -ls /user/hadoop/hive-test

    La réponse devrait ressembler à ceci :

    Found 1 items -rw-r--r-- 1 hadoop hadoop 29504 2016-06-08 23:40 /user/hadoop/hive-test/000000_0

    Le nom du fichier (000000_0) est généré par le système.

  3. Affichez le contenu du fichier  :

    hadoop fs -cat /user/hadoop/hive-test/000000_0
    Note

    Dans cet exemple, le fichier est relativement petit (environ 29 Ko). Soyez prudent lorsque vous utilisez cette commande avec des fichiers très volumineux ou qui contiennent des caractères non affichables.

  4. (Facultatif) Vous pouvez copier le fichier de données de HDFS vers le système de fichiers local sur le nœud leader. Après cela, vous pouvez vous servir d'utilitaires de ligne de commande Linux standard pour travailler avec les données dans le fichier.

    hadoop fs -get /user/hadoop/hive-test/000000_0

    Cette commande n'a pas pour effet d'écraser le fichier.

    Note

    Le système de fichiers local sur le nœud leader a une capacité limitée. N'utilisez pas cette commande avec des fichiers plus grands que l'espace disponible dans le système de fichiers local.