对Amazon DynamoDB(PHP API)的写入速度慢得离谱

对Amazon DynamoDB(PHP API)的写入速度慢得离谱,php,amazon-web-services,amazon-dynamodb,Php,Amazon Web Services,Amazon Dynamodb,这个问题已经发布在AWS论坛上,但仍然没有答案 我正在尝试执行一个长的短项目列表(大约1.2亿个)的初始上载,以便稍后通过唯一键检索它们,这对于DynamoDb来说似乎是一个完美的例子 然而,我目前的写入速度非常慢(大约每100次写入8-9秒),这使得最初的上传几乎不可能(按照目前的速度大约需要3个月) 我读过AWS论坛寻找答案,并尝试过以下方法: 我从单个“put_item”调用切换到25个项的批写入(建议最大批写入大小),并且我的每个项都小于1Kb(这也是建议的)。这是非常典型的,即使我的2

这个问题已经发布在AWS论坛上,但仍然没有答案

我正在尝试执行一个长的短项目列表(大约1.2亿个)的初始上载,以便稍后通过唯一键检索它们,这对于DynamoDb来说似乎是一个完美的例子

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

我读过AWS论坛寻找答案,并尝试过以下方法:

  • 我从单个“put_item”调用切换到25个项的批写入(建议最大批写入大小),并且我的每个项都小于1Kb(这也是建议的)。这是非常典型的,即使我的25个项目是在1Kb以下,但这是不能保证的(而且应该没有关系,因为我理解只有单一项目的大小是重要的DynamoDB)

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

  • 我通过调用disable_SSL()禁用了SSL(每100条记录获得1秒)

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

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

    我还知道,请求序列化有一些开销,因此我可能可以使用队列“累积”请求,但这对批处理写入是否真的那么重要?我不认为这是个问题,因为即使是一个请求也需要很长时间

    我发现有些人修改了API中的cURL头(“Expect:”Expect),以加快请求速度,但我认为这不是一种合适的方法,而且自从该建议发布以来,API已经进行了更新

    我的应用程序运行的服务器也很好——我已经读到,有时CPU负载会达到极限,但在我的情况下,一切都很好,只是网络请求花费的时间太长

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

    最近还有其他线程,显然是关于同一个问题的(不过目前还没有答案)


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

    如果你是从本地机器上传的,速度会受到你和服务器之间各种流量/防火墙等的影响。如果我打电话给DynamoDB,每个请求需要0.3秒,这仅仅是因为往返澳大利亚的时间

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

    如果您对自己使用LAMP设置EC2没有信心,那么他们有一个新的服务“Elastic Beanstalk”,可以为您完成这一切。当您完成上传后,只需烧掉服务器即可——希望您可以在他们的“免费层”定价结构中完成这一切:)


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

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

    我在AmazonDynamoDB类上使用批处理方法成功地使用了php sdk。我能够从EC2实例每秒运行大约50个项目。该方法的工作原理是将请求排队,直到调用send方法,此时它使用Curl同时执行多个请求。以下是一些很好的参考资料:


    我认为您还可以使用HiveSQL,使用弹性映射减少从CSV文件大容量加载数据。EMR可以使用多台机器来分散工作负载并实现高并发性。

    谢谢您的回答。我没有尝试Beanstalk,而是尝试使用Elastic MapReduce-这里仍然存在一个问题,我已经为其创建了另一个问题:就像你提到的,即使是从澳大利亚,它对你来说仍然不到0.5秒,所以我从伦敦到爱尔兰的时间不可能是2秒。我们的连接非常好,到目前为止我排除了这一点。2秒的速度非常慢,但它可能很简单,比如服务器上的防火墙进行一些“检查”,或者路由器上的防火墙进行其他“检查”。(或者,愤世嫉俗地说,这是Amzon将您推向两个EC2的一种方式,可能吗?!)正如我所说的——这不是一个长期的解决方案,只是完成上传而已。如果你想把它保留在本地,为什么不看看卡桑德拉或蒙戈?但是,如果你使用亚马逊并付费,只需将服务器转移到那里——这会让他们感到高兴:)听起来你需要一个像SQL server这样的关系数据库。只需
    SqlBulkCopy
    中的数据即可。如果你问的话,SQL Server是web级的。我这里不需要关系数据库(它是一个没有实际关系的平面索引),但是是的,如果没有其他选择,我正在考虑退回到mySQL或Solr。但是现在我仍然很想知道这种方法有什么问题。你的论坛帖子已经回复:谢谢,如果需要的话,我会再试一次。谢谢,乔纳森,但是我已经重新编写了使用本地索引的功能。关于蜂巢,它也有一个问题,当它涉及到DynamoDB,这已被Am确认