Amazon DynamoDB
开发人员指南 (API Version 2012-08-10)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

在 DynamoDB 与 HDFS 之间复制数据

如果您的 DynamoDB 表中包含数据,您可以使用 Hive 将数据复制到 Hadoop 分布式文件系统 (HDFS)。

如果您运行的 MapReduce 作业需要 DynamoDB 中的数据,则可以这样做。如果您将数据从 DynamoDB 复制到 HDFS,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;

复制数据而不指定列映射

您可以从 DynamoDB 复制原始格式的数据,并将其写入到 HDFS,而不指定任何数据类型或列映射。您可以使用此方法创建 DynamoDB 数据的存档,并将其存储在 HDFS 中。

注意

如果 DynamoDB 表包含映射、列表、布尔值或 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 命令执行这些任务。

以下步骤假设您已使用本部分中的一种程序将数据从 DynamoDB 复制到 HDFS。

  1. 如果您当前处于 Hive 命令提示符下,请退出至 Linux 命令提示符。

    Copy
    hive> exit;
  2. 列出 HDFS 中的 /user/hadoop/hive-test 目录的内容。(这是 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

    此命令不会覆盖文件。

    注意

    主节点上的本地文件系统容量有限。请勿使用此命令处理超过本地文件系统可用空间的文件。