メニュー
Amazon DynamoDB
開発者ガイド (API Version 2012-08-10)

DynamoDB と HDFS 間のデータのコピー

DynamoDB テーブルにデータが存在する場合は、Hive を使用して、Hadoop Distributed File System (HDFS) にデータをコピーできます。

DynamoDB からのデータを必要とする MapReduce ジョブを実行しているなら、これを行う場合があります。HDFS からのデータを DynamoDB コピーする場合、Hadoop はクラスターで利用可能なすべてのノードを使用して、並列 Amazon EMR 処理できます。MapReduce ジョブが完了すると、HDFS から DDB に結果を記述できます。

次の例では、Hive は次の HDFS ディレクトリで読み取りと書き込みを行います。/user/hadoop/hive-test

このセクションの例は、チュートリアル: Amazon DynamoDB および Apache Hive の使用 の手順に従ったこと、また DynamoDB (ddb_features) でマスターされている外部テーブルがあることを前提にしています。

Hive のデフォルト形式を使用してデータをコピーする

例 DynamoDB から HDFS へ

INSERT OVERWRITE ステートメントを使用して HDFS に直接書き込みます。

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

HDFS のデータファイルは次のようになります。

Copy
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

各フィールドは SOH 文字 (ヘッダーの開始、0x01) で区切ります。ファイルで、SOH は ^A と表示されます。

例 HDFS から DynamoDB へ

  1. HDFS で未フォーマットデータにマッピングされる外部テーブルを作成します。

    Copy
    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. データを DynamoDB にコピーします。

    Copy
    INSERT OVERWRITE TABLE ddb_features SELECT * FROM hdfs_features_unformatted;

ユーザー指定の形式でのデータのコピー

別のフィールド区切り文字を使用する場合は、HDFS ディレクトリにマッピングされる外部テーブルを作成します。カンマ区切り値 (CSV) を使用したデータファイルを作成するためにこの手法を使用する場合があります。

例 DynamoDB から HDFS へ

  1. HDFS にマッピングする Hive 外部テーブルを作成します。これを行うとき、データ型が、DynamoDB 外部テーブルのデータ型に準拠していることを確認します。

    Copy
    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. DynamoDB からデータをコピーします。

    Copy
    INSERT OVERWRITE TABLE hdfs_features_csv SELECT * FROM ddb_features;

HDFS のデータファイルは次のようになります。

Copy
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

例 HDFS から DynamoDB へ

単一の HiveQL ステートメントを使用すると、HDFS からのデータを DynamoDB テーブルに表示することができます。

Copy
INSERT OVERWRITE TABLE ddb_features SELECT * FROM hdfs_features_csv;

列のマッピングなしでのデータのコピー

RAW 形式で DynamoDB からデータをコピーし、データ型または列マッピングを指定しないで HDFSに書き込めます。この方法を使用すると、DynamoDB データのアーカイブを作成して、HDFS に保存できます。

注記

DynamoDB テーブルにタイプ Map、List、Boolean、または Null の属性が含まれる場合、この方法でのみ Hive を使用してデータを DynamoDB から HDFS へコピーできます。

例 DynamoDB から HDFS へ

  1. DynamoDB テーブルに関連付けられる外部テーブルを作成します。(この HiveQL ステートメントには dynamodb.column.mapping はありません。)

    Copy
    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. HDFS ディレクトリに関連付けられた別の外部テーブルを作成します。

    Copy
    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. DynamoDB から HDFS へデータをコピーします。

    Copy
    INSERT OVERWRITE TABLE hdfs_features_no_mapping SELECT * FROM ddb_features_no_mapping;

HDFS のデータファイルは次のようになります。

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

各フィールドは STX 文字 (テキスト開始 0x02) で始まり ETX 文字 (テキスト終了 0x03) で終わります。ファイルで、STX は ^B、ETX は ^C と表示されます。

例 HDFS から DynamoDB へ

単一の HiveQL ステートメントを使用すると、HDFS からのデータを DynamoDB テーブルに表示することができます。

Copy
INSERT OVERWRITE TABLE ddb_features_no_mapping SELECT * FROM hdfs_features_no_mapping;

HDFS でデータにアクセスする

HDFS は、Amazon EMR クラスターのすべてのノードにアクセス可能な分散ファイルシステムです。SSHを使用してマスターノードに接続する場合、コマンドラインツールを使用して、Hive が HDFS に書き込んだデータにアクセスできます。

HDFS は、マスターノードのローカルファイルシステムと同じものではありません。標準 Linux コマンド (catcpmvrm など) を使用して HDFS のファイルとディレクトリで作業することはできません。代わりに、hadoop fs コマンドを使用してこれらのタスクを実行します。

次のステップは、このセクションの手順の 1 つを使用して DynamoDB から HDFS にデータをコピーしたと想定しています。

  1. 現在 Hive コマンドプロンプトである場合は、Linux コマンドプロンプトに戻ります。

    Copy
    hive> exit;
  2. /user/hadoop/hive-testディレクトリの内容を HDFS に表示します。(これは、Hive が DynamoDB からデータをコピーした場所です。)

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

    レスポンスは以下のようになります。

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

    ファイル名 (000000_0) は、システムで生成されます。

  3. ファイルのコンテンツを表示します。

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

    注記

    この例では、ファイルは比較的小さくなっています (約29 KB)。大きなファイルまたは印刷不可の文字を含むファイルでこのコマンドを使用する場合は注意する必要があります。

  4. (オプション) HDFS から マスターノードのローカルファイルシステムにデータファイルをコピーできます。その後、ファイルのデータを運用するために Linux 標準コマンドラインユーティリティを使用できます。

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

    このコマンドはファイルを上書きしません。

    注記

    マスターノードのローカルファイルシステムは容量が限定されています。ローカルファイルシステムで利用可能なスペースより大きなファイルでこのコマンドを使用しないでください。