2012-05-21 20 views
17

我需要将大约1.3亿个项目(总共5+ Gb)的初始上传执行到单个DynamoDB表中。在我面对problems上传使用我的应用程序中的API后,我决定尝试使用EMR。长期以来,即使在最强大的群集中,导入非常平均(用于EMR)的数据量也需要很长时间,耗时数百小时,进展非常小(大约20分钟来处理测试2Mb数据位,并且没有设法在12小时内完成测试700Mb文件)。Amazon Elastic MapReduce - 从S3到DynamoDB的大容量插入速度非常慢

我已经联系了Amazon Premium Support,但到目前为止,他们只告诉“由于某种原因,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目标的相同命令在几秒钟内完成。

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

+0

你在同一个过程中领先我一步,我不喜欢我在这里看到的..有没有人有成功的故事在这里分享(大数据导入到发电机)? –

+0

我已经联系了Amazon Premium Support,他们只确认了这个问题,并承认“DynamoDB中存在某种问题”,几乎在一周内没有更多:(如果知道更多,我会更新。到目前为止,我切换到本地数据库。 – Yuriy

+0

我也尝试在不同地区运行场景,并且也从脚本运行而不是从交互会话运行。 – Yuriy

回答

15

这是我最近从AWS支持获得的答案。希望可以帮助别人了类似的情况:

EMR工人为单线程工作人员目前已实施, 每一个劳动者,写一个项目接一个(使用PUT,不BatchWrite)。 因此,每次写入消耗1个写入容量单位(IOP)。

这意味着您正在建立很多连接,在某种程度上会降低性能。如果使用BatchWrites,则它意味着您可以在单个操作中承诺多达25行,其中 的性能价格较低(但如果我理解 ,则价格相同)。这是我们所知道的,并且可能在将来的EMR中实现 。我们不能提供时间表。

如前所述,这里的主要问题是,您在DynamoDB 表在到达配置的吞吐量,从而尽量提高其 暂时进口,然后随意将其降低到 任何你需要的水平。

这听起来有点方便,但是当您这样做时, 警报出现问题,这就是为什么您从未收到过 警报。自那以后,问题一直得到解决。

+0

+1关于这个奇怪的问题 - 谢谢!这是否意味着您已经设法通过相应地临时提高您的预置写入吞吐量来加速导入? –

+0

我还没有尝试过,但说实话,因为我忙于实施基于本地托管数据库的替代解决方案:(这不再看作是适合我的方法,但不久将做测试,并会考虑到未来的项目 – Yuriy

+1

我把这个搁置的另一个原因是,即使我目前的吞吐量(400个单位)增加了样本60K记录,这个记录用了一个小时,并且它不应该根据这个解释和我的理解 – Yuriy