Copia di dati tra DynamoDB e HDFS - Amazon DynamoDB

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Copia di dati tra DynamoDB e HDFS

Se si dispone di dati in una tabella DynamoDB, è possibile utilizzare Hive per copiare i dati nel file di sistema distribuito Hadoop (HDFS).

Questa operazione può essere eseguita se si esegue un MapReduce processo che richiede dati provenienti da DynamoDB. Se si copiano i dati da DynamoDB in HDFS, Hadoop può elaborarli utilizzando tutti i nodi disponibili nel cluster Amazon EMR in parallelo. Una volta completato il MapReduce processo, è possibile scrivere i risultati da HDFS a DDB.

Negli esempi seguenti, Hive leggerà e scriverà nella seguente directory HDFS: /user/hadoop/hive-test

Nota

Gli esempi in questa sezione presuppongono che sia stata seguita la procedura in Tutorial: Utilizzo di Amazon DynamoDB e Apache Hive e che sia presente una tabella esterna in DynamoDB denominata ddb_features.

Copia di dati utilizzando il formato predefinito Hive

Esempio Da DynamoDB a HDFS

Utilizza un'istruzione INSERT OVERWRITE per scrivere direttamente su HDFS.

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

Il file di dati in HDFS ha il seguente aspetto:

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

Ogni campo è separato da un carattere SOH (inizio dell'intestazione, 0x01). Nel file, SOH appare come ^A.

Esempio Da HDFS a DynamoDB
  1. Crea una tabella esterna che si mappa ai dati non formattati in 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. Copiare i dati in DynamoDB.

    INSERT OVERWRITE TABLE ddb_features SELECT * FROM hdfs_features_unformatted;

Copia di dati con un formato specificato dall'utente

Se desideri utilizzare un carattere di separatore di campo diverso, è possibile creare una tabella esterna mappata alla directory HDFS. È possibile utilizzare questa tecnica per creare file di dati con valori separati da virgole (CSV).

Esempio Da DynamoDB a HDFS
  1. Crea una tabella esterna Hive mappata ad HDFS. Quando si esegue questa operazione, assicurarsi che i tipi di dati siano coerenti con quelli della tabella esterna 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. Copiare i dati da DynamoDB.

    INSERT OVERWRITE TABLE hdfs_features_csv SELECT * FROM ddb_features;

Il file di dati in HDFS ha il seguente aspetto:

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
Esempio Da HDFS a DynamoDB

Con una singola istruzione HiveQL, è possibile popolare la tabella DynamoDB utilizzando i dati da HDFS:

INSERT OVERWRITE TABLE ddb_features SELECT * FROM hdfs_features_csv;

Copia di dati senza mappature di colonne

È possibile copiare i dati da DynamoDB in un formato non elaborato e scriverli in HDFS senza specificare alcun tipo di dati o mappatura di colonne. Questo metodo può essere utilizzato per creare un archivio dei dati DynamoDB e memorizzarlo in HDFS.

Nota

Se la tabella DynamoDB contiene attributi di tipo Map, List, Boolean o Null, allora questo è l'unico modo per utilizzare Hive per copiare i dati da DynamoDB a HDFS.

Esempio Da DynamoDB a HDFS
  1. Crea una tabella esterna associata alla tabella DynamoDB. In questa istruzione HiveQL non c'è dynamodb.column.mapping.

    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. Crea un'altra tabella esterna associata alla directory 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. Copiare i dati da DynamoDB ad HDFS.

    INSERT OVERWRITE TABLE hdfs_features_no_mapping SELECT * FROM ddb_features_no_mapping;

Il file di dati in HDFS ha il seguente aspetto:

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"}

Ogni campo inizia con un carattere STX (inizio del testo, 0x02) e termina con un carattere ETX (fine del testo, 0x03). Nel file, STX viene visualizzato come ^B e ETX viene visualizzato come ^C.

Esempio Da HDFS a DynamoDB

Con una singola istruzione HiveQL, è possibile popolare la tabella DynamoDB utilizzando i dati da HDFS:

INSERT OVERWRITE TABLE ddb_features_no_mapping SELECT * FROM hdfs_features_no_mapping;

Accesso ai dati in HDFS

HDFS è un file system distribuito, accessibile a tutti i nodi del cluster Amazon EMR. Se per connettersi al nodo principale si utilizza SSH, è possibile utilizzare gli strumenti a riga di comando per accedere ai dati che Hive ha scritto su HDFS.

HDFS non è la stessa cosa del file system locale sul nodo principale. Non è possibile lavorare con file e directory in HDFS utilizzando comandi Linux standard (come cat, cp, mv o rm). Invece, queste attività vengono eseguite utilizzando il comando hadoop fs.

I passaggi seguenti presuppongono che siano stati copiati i dati da DynamoDB ad HDFS utilizzando una delle procedure descritte in questa sezione.

  1. Se ti trovi attualmente al prompt dei comandi di Hive, passa al prompt dei comandi di Linux.

    hive> exit;
  2. Elencare il contenuto della directory /user/hadoop/hive-test in HDFS. Questo è il percorso in cui Hive ha copiato i dati da DynamoDB.

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

    La risposta dovrebbe essere simile alla seguente:

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

    Il nome del file (000000_0) è generato dal sistema.

  3. Visualizzare il contenuto del file :

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

    In questo esempio, il file è relativamente piccolo (circa 29 KB). Fare attenzione quando si utilizza questo comando con file molto grandi o contenenti caratteri non stampabili.

  4. (Facoltativo) È possibile copiare il file di dati da HDFS nel file system locale sul nodo principale. Successivamente, sarà possibile utilizzare le utilità della riga di comando Linux standard per lavorare con i dati nel file.

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

    Questo comando non sovrascriverà il file.

    Nota

    Il file system locale sul nodo principale ha una capacità limitata. Non utilizzare questo comando con file più grandi dello spazio disponibile nel file system locale.