15

这个问题已经发布在 AWS 论坛上,但仍未得到解答https://forums.aws.amazon.com/thread.jspa?threadID=94589

我正在尝试执行一长串短项目(大约 1.2 亿个)的初始上传,以便稍后通过唯一键检索它们,这似乎是 DynamoDb 的完美案例。

但是,我目前的写入速度非常慢(每 100 次写入大约需要 8-9 秒),这使得初始上传几乎不可能(按照目前的速度大约需要 3 个月)。

我已阅读 AWS 论坛以寻找答案,并且已经尝试了以下方法:

  1. 我从单个“put_item”调用切换到批量写入 25 个项目(推荐的最大批量写入大小),并且我的每个项目都小于 1Kb(这也是推荐的)。即使我的 25 个项目也低于 1Kb,这也是非常典型的,但不能保证(并且无论如何都应该无关紧要,因为我理解只有单个项目的大小对 DynamoDB 很重要)。

  2. 我使用最近引入的欧盟区域(我在英国)通过调用 set_region('dynamodb.eu-west-1.amazonaws.com') 直接指定其入口点,因为在 PHP 中显然没有其他方法可以做到这一点API。AWS 控制台显示该表位于适当的区域,因此可以正常工作。

  3. 我通过调用 disable_ssl() 禁用了 SSL(每 100 条记录获得 1 秒)。

尽管如此,一个包含 100 个项目的测试集(25 个项目的 4 批写入调用)的索引时间永远不会少于 8 秒。每个批量写入请求大约需要 2 秒,所以它不像第一个是即时的,随后的请求就会很慢。

我的表配置吞吐量是 100 个写入和 100 个读取单元,到目前为止应该足够了(也尝试了更高的限制以防万一,没有效果)。

我也知道请求序列化有一些费用,所以我可以使用队列来“累积”我的请求,但这对于 batch_writes 真的那么重要吗?而且我认为这不是问题,因为即使是单个请求也需要很长时间。

我发现有些人修改了 API 中的 cURL 标头(特别是“期望:”)以加快请求速度,但我认为这不是正确的方法,而且自从该建议发布以来,API 已经更新。

我的应用程序运行的服务器也很好 - 我读过有时 CPU 负载会飙升,但在我的情况下一切都很好,只是网络请求需要太长时间。

我现在被困住了 - 我还有什么可以尝试的吗?如果我没有提供足够的信息,请随时询问更多信息。

还有其他最近的线程,显然是关于同样的问题,here(虽然到目前为止还没有答案)。

这项服务应该是超快的,所以我一开始就对这个问题感到困惑。

4

3 回答 3

11

如果您从本地计算机上传,速度将受到您和服务器之间的各种流量/防火墙等的影响。如果我调用 DynamoDB,每个请求只需要 0.3 秒,因为往返澳大利亚的时间很长。

我的建议是使用 PHP 创建自己的 EC2 实例(服务器),将脚本和所有文件作为一个块上传到 EC2 服务器,然后从那里进行转储。EC2 服务器应该拥有 DynamoDB 服务器的极快速度。

如果您对自己使用 LAMP 设置 EC2 没有信心,那么他们有一项新服务“Elastic Beanstalk”可以为您完成这一切。完成上传后,只需烧录服务器 - 希望您可以在他们的“免费套餐”定价结构内完成所有这些工作:)

不能解决长期的连接问题,但会减少三个月的上传时间!

于 2012-05-21T11:17:32.167 回答
1

我会尝试多线程上传以增加吞吐量。也许一次添加一个线程,看看吞吐量是否线性增加。作为测试,您可以同时运行两个当前的加载程序,看看它们是否都以您现在观察的速度运行。

于 2012-06-01T19:10:09.050 回答
0

通过使用 AmazonDynamoDB 类上的批处理方法,我使用 php sdk 取得了很好的成功。我能够从 EC2 实例每秒运行大约 50 个项目。该方法通过对请求进行排队,直到您调用 send 方法,此时它使用 Curl 执行多个同时请求。这里有一些很好的参考:

http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/LoadData_PHP.html

http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/LowLevelPHPItemOperationsExample.html

我认为您还可以使用 Elastic Map Reduce 使用 HIVE sql 从 CSV 文件批量加载数据。EMR 可以使用多台机器来分散工作负载,实现高并发。

于 2012-07-02T14:36:19.973 回答