Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Kopieren von Daten zwischen DynamoDB und HDFS
Wenn Sie Daten in einer DynamoDB-Tabelle vorliegen haben, können Sie sie mit Hive in das Hadoop Distributed File System (HDFS) kopieren.
Sie können dies tun, wenn Sie einen MapReduce Job ausführen, für den Daten von DynamoDB erforderlich sind. Wenn Sie die Daten aus DynamoDB in HDFS kopieren, kann Hadoop sie verarbeiten, indem alle verfügbaren Knoten im Amazon EMR-Cluster parallel verwendet werden. Wenn der MapReduce Job abgeschlossen ist, können Sie die Ergebnisse von HDFS nach DDB schreiben.
In den folgenden Beispielen verwendet Hive das nachstehende HDFS-Verzeichnis für Lese- und Schreibvorgänge: /user/hadoop/hive-test
Anmerkung
Die Beispiele in diesem Abschnitt setzen voraus, dass Sie die Schritte in Tutorial: Arbeiten mit Amazon DynamoDB und Apache Hive befolgt haben und über eine externe Tabelle, die in DynamoDB verwaltet wird (ddb_features), verfügen.
Themen
Kopieren von Daten mit dem Hive-Standardformat
Beispiel Von DynamoDB in HDFS
Verwenden Sie eine INSERT OVERWRITE
-Anweisung, um direkt in HDFS zu schreiben.
INSERT OVERWRITE DIRECTORY 'hdfs:///user/hadoop/hive-test' SELECT * FROM ddb_features;
Die Datendatei in HDFS sieht folgendermaßen aus:
920709
^A
Soldiers Farewell Hill^A
Summit^A
NM^A
32.3564729^A
-108.33004616135 1178153^A
Jones Run^A
Stream^A
PA^A
41.2120086^A
-79.25920781260 253838^A
Sentinel Dome^A
Summit^A
CA^A
37.7229821^A
-119.584338133 264054^A
Neversweet Gulch^A
Valley^A
CA^A
41.6565269^A
-122.83614322900 115905^A
Chacaloochee Bay^A
Bay^A
AL^A
30.6979676^A
-87.97388530
Jedes Feld wird durch ein SoH-Zeichen getrennt (Anfang der Überschrift, 0x01). In der Datei wird SoH als ^A
angezeigt.
Beispiel Kopieren von HDFS in DynamoDB
-
Erstellen Sie eine externe Tabelle, die den unformatierten Daten in HDFS zugeordnet ist.
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';
-
Kopieren Sie die Daten in DynamoDB
INSERT OVERWRITE TABLE ddb_features SELECT * FROM hdfs_features_unformatted;
Kopieren von Daten in einem benutzerdefinierten Format
Wenn Sie ein anderes Feldtrennzeichen verwenden möchten, können Sie eine externe Tabelle erstellen, die dem HDFS-Verzeichnis zugeordnet ist. Sie können diese Vorgehensweise zum Erstellen von Datendateien mit CSV-Werten verwenden.
Beispiel Von DynamoDB in HDFS
-
Erstellen Sie eine externe Hive-Tabelle, die HDFS zugeordnet ist. Stellen Sie dabei sicher, dass die Datentypen mit den Typen der externen DynamoDB-Tabelle konsistent sind.
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';
-
Kopieren Sie die Daten aus DynamoDB.
INSERT OVERWRITE TABLE hdfs_features_csv SELECT * FROM ddb_features;
Die Datendatei in HDFS sieht folgendermaßen aus:
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
Beispiel Kopieren von HDFS in DynamoDB
Mit einer einzigen HiveQL-Anweisung können Sie die DynamoDB-Tabelle mit den Daten aus HDFS auffüllen:
INSERT OVERWRITE TABLE ddb_features SELECT * FROM hdfs_features_csv;
Kopieren von Daten ohne Spaltenmapping
Sie können Daten aus DynamoDB in einem unformatierten Format kopieren und sie ohne Angabe von Datentypen oder Spaltenmapping in HDFS schreiben. Sie können diese Methode zum Erstellen eines Archivs von DynamoDB-Daten und zum Speichern in HDFS verwenden.
Anmerkung
Wenn Ihre DynamoDB-Tabelle Attribute vom Typ Zuordnung, Liste, Boolescher Wert oder Null enthält, ist dies die einzige Möglichkeit, um Hive zum Kopieren von Daten aus DynamoDB in HDFS zu verwenden.
Beispiel Von DynamoDB in HDFS
-
Erstellen Sie eine externe Tabelle im Zusammenhang mit Ihrer DynamoDB-Tabelle. (In dieser HiveQL-Anweisung ist keine
dynamodb.column.mapping
enthalten.)CREATE EXTERNAL TABLE ddb_features_no_mapping (item MAP<STRING, STRING>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "Features");
-
Erstellen Sie eine weitere externe Tabelle im Zusammenhang mit Ihrem HDFS-Verzeichnis.
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';
-
Kopieren Sie die Daten aus DynamoDB in HDFS.
INSERT OVERWRITE TABLE hdfs_features_no_mapping SELECT * FROM ddb_features_no_mapping;
Die Datendatei in HDFS sieht folgendermaßen aus:
Name
^C
{"s":"Soldiers Farewell Hill"}^B
State^C
{"s":"NM"}^B
Class^C
{"s":"Summit"}^B
Elevation^C
{"n":"6135"}^B
Latitude^C
{"n":"32.3564729"}^B
Id^C
{"n":"920709"}^B
Longitude^C
{"n":"-108.3300461"} Name^C
{"s":"Jones Run"}^B
State^C
{"s":"PA"}^B
Class^C
{"s":"Stream"}^B
Elevation^C
{"n":"1260"}^B
Latitude^C
{"n":"41.2120086"}^B
Id^C
{"n":"1178153"}^B
Longitude^C
{"n":"-79.2592078"} Name^C
{"s":"Sentinel Dome"}^B
State^C
{"s":"CA"}^B
Class^C
{"s":"Summit"}^B
Elevation^C
{"n":"8133"}^B
Latitude^C
{"n":"37.7229821"}^B
Id^C
{"n":"253838"}^B
Longitude^C
{"n":"-119.58433"} Name^C
{"s":"Neversweet Gulch"}^B
State^C
{"s":"CA"}^B
Class^C
{"s":"Valley"}^B
Elevation^C
{"n":"2900"}^B
Latitude^C
{"n":"41.6565269"}^B
Id^C
{"n":"264054"}^B
Longitude^C
{"n":"-122.8361432"} Name^C
{"s":"Chacaloochee Bay"}^B
State^C
{"s":"AL"}^B
Class^C
{"s":"Bay"}^B
Elevation^C
{"n":"0"}^B
Latitude^C
{"n":"30.6979676"}^B
Id^C
{"n":"115905"}^B
Longitude^C
{"n":"-87.9738853"}
Jedes Feld beginnt mit einem STX-Zeichen (Textanfang, 0x02) und endet mit einem ETX-Zeichen (Textende, 0x03). In der Datei wird für STX ^B
und für ETX ^C
angegeben.
Beispiel Kopieren von HDFS in DynamoDB
Mit einer einzigen HiveQL-Anweisung können Sie die DynamoDB-Tabelle mit den Daten aus HDFS auffüllen:
INSERT OVERWRITE TABLE ddb_features_no_mapping SELECT * FROM hdfs_features_no_mapping;
Zugriff auf die Daten in HDFS
HDFS ist ein verteiltes Dateisystem, auf das alle Knoten im Amazon EMR-Cluster zugreifen können. Wenn Sie eine Verbindung zum Leader-Knoten über SSH herstellen, können Sie die Befehlszeilen-Tools für den Zugriff auf die Daten verwenden, die von Hive in HDFS geschrieben wurden.
HDFS ist nicht mit dem lokalen Dateisystem auf dem Leader-Knoten identisch. Sie können nicht mit Dateien und Verzeichnissen in HDFS arbeiten und dabei die Linux-Standardbefehle verwenden (wie cat
, cp
, mv
oder rm
). Verwenden Sie stattdessen den Befehl hadoop
fs
für diese Aufgaben.
Die folgenden Schritte setzen voraus, dass Sie die Daten aus DynamoDB in HDFS mit einem der in diesem Abschnitt beschriebenen Verfahren kopiert haben.
-
Wenn Sie sich an der Hive-Eingabeaufforderung befinden, beenden Sie die Linux-Eingabeaufforderung.
hive> exit;
-
Listet den Inhalt des Verzeichnisses the /user/hadoop/hive -test in HDFS auf. (Dies ist der Speicherort, an den Hive die Daten aus DynamoDB kopiert hat.)
hadoop fs -ls /user/hadoop/hive-test
Die Antwort sollte wie folgt aussehen:
Found 1 items -rw-r--r-- 1 hadoop hadoop 29504 2016-06-08 23:40 /user/hadoop/hive-test/000000_0
Der Dateiname (000000_0) wird vom System generiert.
-
Zeigen Sie den Inhalt der -Datei an:
hadoop fs -cat /user/hadoop/hive-test/000000_0
Anmerkung
In diesem Beispiel ist die Datei relativ klein (etwa 29 KB). Seien Sie vorsichtig, wenn Sie diesen Befehl mit Dateien verwenden, die sehr groß sind oder nicht druckbare Zeichen enthalten.
-
(Optional) Sie können die Datendatei aus HDFS in das lokale Dateisystem auf dem Leader-Knoten kopieren. Anschließend können Sie mithilfe von Standardbefehlszeilen-Dienstprogrammen von Linux mit den Daten in der Datei arbeiten.
hadoop fs -get /user/hadoop/hive-test/000000_0
Mit diesem Befehl wird die Datei nicht überschrieben.
Anmerkung
Das lokale Dateisystem auf dem Leader-Knoten verfügt über begrenzte Kapazität. Verwenden Sie diesen Befehl nicht mit Dateien, die größer als der im lokalen Dateisystem verfügbare Platz sind.