DynamoDB 写入太慢

Posted

技术标签:

【中文标题】DynamoDB 写入太慢【英文标题】:DynamoDB write is too slow 【发布时间】:2020-07-28 06:59:35 【问题描述】:

我使用 Lambda 从 JSON Api 读取并通过 http 请求写入 DynamoDB。 JSON Api 非常大(有 200k 个对象),我的函数在写入 DynamoDB 时非常慢。我使用了常规写入功能,10 分钟后我只能在我的 DynamoDB 表中填充 5k 行。我正在考虑使用 BatchWriteItem 但由于它只能在一批中执行 25 次放置,因此写入所有 200k 行仍然需要太多时间。有没有更好的解决办法?

【问题讨论】:

【参考方案1】:

这是因为你被限制了。

对于 Lambda

一次可以运行的 Lambda 并发调用的最大数量为default limit is 1000 concurrent requests。

如果您同时有超过 1000 个并发请求,您需要联系 AWS Support 以增加此请求,您还需要提供一个业务用例说明它为什么需要支持此请求。

对于 DynamoDB

无论您使用批处理还是单个PutItem,您的DynamoDB 表都配置了多个WCU (Write Credit Units) and RCU (Read Credit Units)。

单个写入信用单位涵盖 1 KB 或更小的项目的 1 次写入(每个额外的 kb 是另一个单位)。如果超过此值,您将开始受到写入请求的限制,如果您使用的是 SDK,它也可能会使用指数退避来继续尝试写入。

作为解决方案,您应该执行以下操作之一:

如果这是一次性过程,您可以将 WCU 调整为固定数字,然后等待 5 分钟使其增大,然后按比例缩小。 如果这是您应用程序上的自然流程,则启用 DynamoDB 自动缩放以全天自然增加和减少

此外,请查看您的数据建模,因为这也会导致限制。

在极端情况下,如果单个分区接收超过 3,000 个 RCU 或 1,000 个 WCU,则可能会发生限制

【讨论】:

感谢您的详尽回答,非常有帮助!每天都会使用写入操作,因此我遵循了您的第二个解决方案并启用了 Auto Scaling,并将容量设置为 70% 的目标利用率。我能再问你一个关于主键的问题吗?我使用 Date.now() 为每个项目生成 id,但这会导致冲突,因为写操作工作得如此之快。我可以使用什么作为主键?不幸的是,数据集中没有 id。 当然,您通常如何检索数据?您始终可以连接多个字段以形成主键,但这实际上取决于您如何检索它 数据集看起来有点像这样:日期、自行车型号、生产时间(以分钟为单位)。我按日期检索数据,因为我想计算每天的平均生产时间并将其放在第二个表中。由于每天生产多次相同的自行车模型,连接这两个字段仍然不会给我一个唯一的键。 我个人会选择 Bike Model 作为分区键,然后有一个日期时间的排序键。否则很难做到独一无二:( 没错,在这种情况下时间戳会很有帮助。不幸的是,我只有日期。还有办法让它发挥作用吗?

以上是关于DynamoDB 写入太慢的主要内容,如果未能解决你的问题,请参考以下文章

DynamoDB 有条件写入

如何将大型 Pyspark DataFrame 写入 DynamoDB

Amazon DynamoDB:警告“配置的 dynamodb 表 JobDetails 的写入吞吐量小于集群映射容量”

DynamoDB 中的批量写入操作是不是使用多线程策略?

AWS:从 Pandas 数据帧写入 DynamoDB

Python Boto3 - 数据未正确写入DynamoDB