Amazon Elastic MapReduce - 从S3到DynamoDB的大量插入速度非常慢

时间:2012-05-21 09:58:58

标签: amazon-s3 hive amazon-dynamodb amazon-emr

我需要在一个DynamoDB表中执行大约1.3亿个项目(总共5个Gb)的初始上传。在我面对problems使用我的应用程序中的API上传它们之后,我决定尝试使用EMR。

长话短说,即使在最强大的群集上,导入非常平均(对于EMR)数据量也需要很长时间,耗费数百小时且进展很少(大约20分钟处理测试2Mb数据位,并且没有设法在12小时内完成测试700Mb文件。

我已经联系了亚马逊高级支持,但到目前为止他们只是说“出于某种原因,DynamoDB导入速度很慢”。

我在交互式蜂巢会话中尝试了以下说明:

CREATE EXTERNAL TABLE test_medium (
  hash_key string,
  range_key bigint,
  field_1 string,
  field_2 string,
  field_3 string,
  field_4 bigint,
  field_5 bigint,
  field_6 string,
  field_7 bigint
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
LOCATION 's3://my-bucket/s3_import/'
;

CREATE EXTERNAL TABLE ddb_target (
  hash_key string,
  range_key bigint,
  field_1 bigint,
  field_2 bigint,
  field_3 bigint,
  field_4 bigint,
  field_5 bigint,
  field_6 string,
  field_7 bigint
)
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
TBLPROPERTIES (
  "dynamodb.table.name" = "my_ddb_table",
  "dynamodb.column.mapping" = "hash_key:hash_key,range_key:range_key,field_1:field_1,field_2:field_2,field_3:field_3,field_4:field_4,field_5:field_5,field_6:field_6,field_7:field_7"
)
;  

INSERT OVERWRITE TABLE ddb_target SELECT * FROM test_medium;

各种标志似乎没有任何明显的效果。尝试过以下设置而不是默认设置:

SET dynamodb.throughput.write.percent = 1.0;
SET dynamodb.throughput.read.percent = 1.0;
SET dynamodb.endpoint=dynamodb.eu-west-1.amazonaws.com;
SET hive.base.inputformat=org.apache.hadoop.hive.ql.io.HiveInputFormat;
SET mapred.map.tasks = 100;
SET mapred.reduce.tasks=20;
SET hive.exec.reducers.max = 100;
SET hive.exec.reducers.min = 50;

为HDFS而不是DynamoDB目标运行的相同命令在几秒钟内完成。

这似乎是一个简单的任务,一个非常基本的用例,我真的很想知道我在这里做错了什么。

1 个答案:

答案 0 :(得分:15)

以下是我最近从AWS支持获得的答案。希望能帮助处于类似情况的人:

  

EMR工作者目前被实施为单线程工作者,   每个工作人员逐个写项目(使用Put,而不是BatchWrite)。   因此,每次写入消耗1个写入容量单位(IOP)。

     

这意味着您正在建立许多连接   在某种程度上降低性能。如果使用了BatchWrites,那就是   意味着你可以在一次操作中提交最多25行   明智的表现会更便宜(但如果我理解,价格相同)   对的)。这是我们意识到的并且很可能   在EMR中实施。我们不能提供时间表。

     

如前所述,这里的主要问题是您在DynamoDB中的表   正在达到预配置的吞吐量,所以尽量增加它   暂时进口,然后随意减少它   无论你需要什么级别。

     

这可能听起来有点方便,但是有一个问题   当你这样做时发出警报,这就是为什么你从未收到过   警报。这个问题已经解决了。