我需要在一个DynamoDB表中执行大约1.3亿个项目(总共5个Gb)的初始上传.在我使用应用程序中的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 …Run Code Online (Sandbox Code Playgroud) 此问题已在AWS论坛上发布,但尚未得到答复https://forums.aws.amazon.com/thread.jspa?threadID=94589
我正在尝试执行一个很长的短项目列表(大约1.2亿个)的初始上传,以后通过唯一键检索它们,这似乎是DynamoDb的完美案例.
但是,我目前的写入速度非常慢(每100次写入大约8-9秒),这使得初始上传几乎不可能(以当前速度花费大约3个月).
我已阅读AWS论坛寻找答案,并已尝试以下事项:
我从单个"put_item"调用切换到25个项目的批量写入(建议的最大批量写入大小),并且我的每个项目都小于1Kb(这也是建议).即使我的25个项目也低于1Kb也是非常典型的,但是不能保证(并且无论如何都不重要,因为我理解只有单个项目大小对DynamoDB很重要).
我使用最近引入的欧盟地区(我在英国)通过调用set_region('dynamodb.eu-west-1.amazonaws.com')直接指定其入口点,因为在PHP中显然没有其他方法可以做到这一点. API.AWS控制台显示该表位于适当的区域,以便工作.
我通过调用disable_ssl()来禁用SSL(每100条记录获得1秒).
仍然,一个包含100个项目的测试集(4个批次写入调用25个项目)的索引编制时间不会少于8秒.每个批处理写请求大约需要2秒,因此它不像第一个是即时的,随后的请求会很慢.
我的表配置吞吐量是100写入和100个读取单位到目前为止应该足够(尝试更高的限制,以防万一,没有影响).
我也知道请求序列化有一些费用,所以我可以使用队列来"累积"我的请求,但这对batch_writes来说真的那么重要吗?而且我认为这不是问题,因为即使是单个请求也需要太长时间.
我发现有些人修改了API中的cURL标题(特别是"Expect:")以加快请求速度,但我不认为这是一种正确的方法,而且自从发布该建议后API也已更新.
我的应用程序运行的服务器也很好 - 我读过有时CPU负载通过屋顶,但在我的情况下一切都很好,这只是网络请求需要太长时间.
我现在被困住了 - 还有什么我可以尝试的吗?如果我没有提供足够的信息,请随时询问更多信息.
还有其他最近的线程,显然是在同一个问题上,这里(到目前为止没有答案).
这项服务应该是超快的,所以我在一开始就对这个问题感到困惑.