批量更新 Amazon DynamoDB 表格与 AWS Step Functions 数据库博客

使用 AWS Step Functions 批量更新 Amazon DynamoDB 表

关键要点

  • 本文介绍了一种利用 AWS Step Functions 进行 Amazon DynamoDB 表批量更新的高效解决方案。
  • 开发者可以通过批量更新添加、修改属性,或处理不再需要的项目。
  • AWS Step Functions 具备无服务器架构、可并行处理和恢复失败的能力,适合用于大规模批量更新。
  • 解决方案的上限为包含 1800 亿条,每条平均 4KB 的项目的 DynamoDB 表。

批量更新的需求

开发者经常需要对其 表进行批量更新。进行批量更新的原因可能包括:

  • 添加或更新属性 :例如,为了支持新的访问模式或全球二级索引(GSI),为现有项目填充 Time to Live(TTL)值,或者从另一个数据集中丰富数据。
  • 主动查找并删除不再需要的项目 :无需使用原生 TTL 功能,特别是在游戏行业,可能需要查找并删除过期的玩家统计数据。

需要注意的是,DynamoDB 不提供原生支持批量更新的功能,因此开发者必须构建和管理自己的解决方案。可考虑的多种方法包括使用 或 。

在本文中,我们将介绍如何利用 高效进行 DynamoDB 表的批量更新。该无服务器编排服务使您能够与 Lambda 函数及其他 AWS服务进行集成。您可以根据需要修改、部署并测试该解决方案,以满足自己的批量更新需求。

AWS Step Functions 特性

选择 Step Functions 作为解决方案的原因有以下几点:

  • 无服务器架构
  • 支持大规模并行工作负载 ,包括任务队列和故障恢复
  • 允许在批量更新过程中调整表的需求和速度
  • 易于与已经使用 的开发者进行整合
  • 可通过、(AWS CLI)或 SDK 进行监控

方案概述

一个高效的批量更新应该在 DynamoDB

之间分配工作。通过 ,您可以将表逻辑上划分为指定数量的分段。在此方案中,会随机处理这些分段,以提高工作效率。StepFunctions 将分段分配给并发的 Lambda 函数调用。每个 Lambda 函数调用逐一迭代并更新其分配的分段中的项目。

以下是三个 Lambda 函数的示意图,每个函数处理一个随机选定的分段,共有十个分段覆盖一个由四个分区组成的 DynamoDB 表。

![Lambda删除)

下面的架构示意图展示了解决方案的整体构成:

删除)

该解决方案包含以下关键组件:

  • Step Functions :此无服务器编排服务允许您与 Lambda 函数和其他 AWS 服务集成,用于构建关键业务应用。Step Functions 将控制批量更新过程,采用 状态。
  • Lambda :此计算服务使您无须配置或管理服务器即可运行代码。解决方案中包含两个 Lambda 函数由 Step Functions 调用和监控:
  • GenerateSegments :此函数一次性调用以生成所需数量的分段并将它们随机排序进行处理。
  • ScanAndUpdateTable :此函数被多次调用。每次调用更新分配分段中的所有项目。
  • Amazon Simple Storage Service (Amazon S3) :此对象存储服务提供行业领先的可扩展性、数据可用性、安全性和性能。S3 用于存储批量更新作业配置。
  • DynamoDB :此完全管理的无服务器 NoSQL 数据库旨在支持不同规模的高性能应用。该方案参考了两个表:一个用于读取要处理的项目,另一个用于存储修改后的项目。这可以是同一表进行就地更新,也可以是不同表用于带更新的迁移。

解决方案参数

当您部署方案时,可以控制一组参数:

  • SourceTable 包含要更新的项目的 DynamoDB 表名称。该表必须与部署解决方案的账户和区域相同。
  • ConsistentRead 该过程是否使用 。最终一致性读取的价格是强一致性读取的一半。_限制_部分提供了该参数的指导。默认使用强一致性读取。
  • TotalSegments 将 SourceTable 划分的逻辑分段数量。提高此值意味着需要更多的 Lambda 函数调用来处理表,但每个调用处理的项目更少且完成时间更短。所有调用必须在最大的 Lambda 时长(撰写时为 15 分钟)内完成。默认为 1,000,最大值为 1,000,000。_基准和估计_部分提供了该参数的指导。
  • DestinationTable – 更新后的项目将写入的 DynamoDB 表名称。这可以是 SourceTable 相同的表,该表必须在与部署解决方案的账户和区域相同。
  • ParallelLambdaFunctions 允许的最大并发 Lambda 函数调用数量。提高此值意味着批量更新进度加快,但会进一步增加对表的需求。默认值为 10。
  • RateLimiter – 每个 Lambda 调用将尽可能快地处理项目。将此参数设置为每秒每个 Lambda 函数将处理的最大项目数量,或者 -1 表示不限制速率。默认没有速率限制。_基准和估计_部分提供了该参数的指导。

ScanAndUpdateTable Lambda 包含一个名为 process_item 的 Python函数,您可以根据需要修改以实现您的项目更新逻辑。具体细节请见 修改 ScanAndUpdateTable Lambda 部分。

基准和估计

我通过更新一个包含 1 亿条项目的 DynamoDB 表来基准测试此解决方案。

基准测试结果显示,每个 Lambda 调用在没有速率限制的情况下,平均每秒处理约 200 条项目。我们称之为 速率 并用其进行一些估计:

估计项数值
每秒额外表写入(WCU)ParallelLambdaFunctions * 速率 * 平均项目 KB
每秒额外表读取(RCU) (最终一致性读取则减半)(ParallelLambdaFunctions * 速率 * 平均项目 KB) / 4
完成总时间(秒)表中估计项目数量 / (ParallelLambdaFunctions * 速率)
TotalSegments 参数的最小值表中估计项目数量 / (期望 Lambda 调用持续时间(秒) * 速率)

如果项目的平均大小是 4KB 或更大,则应设置 RateLimiter 以避免产生热分区。使用公式来估计您可能的最大速率: 1000 / 平均项目大小(KB) 。在上述估计中选择您所需的 速率 值。您还可以设置 RateLimiter 以获得每次 Lambda 调用可预测的吞吐量。

限制

通过将速率、TotalSegments 的最大值和最大 Lambda 函数持续时间 900秒相乘(撰写时),可以计算出该解决方案的估计上限。以下是一些示例:

平均项目大小计算速率估计上限
1 KB200 (无速率限制)1800 亿条项目
5 KB200 (无速率限制)1800 亿条项目
100 KB1090 亿条项目
200 KB545 亿条项目
400 KB218 亿条项目

用于处理 SourceTable。即使设置了 ConsistentRead 参数,DynamoDB 在扫描操作时也不提供快照隔离。DynamoDB扫描操作并不能保证在请求扫描操作时,扫描中的所有读取都能看到表的一致快照。

在批量更新期间,您应考虑可能出现的竞争条件。使用强一致性读取可以降低这种可能性。如果竞争条件是一个问题,您可以在执行批量更新期间暂停其他更新表的工作负载,或投入额外的工程精力来消除竞争条件,例如,通过包含 。

更新单个项目是原子操作,但不利用 。如果您需要事务(例如,确保多个项目要么全部更新成功要么全部不更新),则不应使用此解决方案。

Step Function 可能会失败,例如,如果更新遇到限制并且 耗尽。虽然您可以 (这是一种良好的策略),但某些项目将被重新处理。您应确保项目更新是幂等的,以便安全完成重新处理。

克隆、修改和部署解决方案

接下来,我们将演示如何克隆该解决方案,修改 ScanAndUpdateTable Lambda 函数,部署并运行批量更新。

克隆解决方案

运行以下命令以克隆解决方案:

bash git clone https://github.com/aws-samples/bulk-update-amazon-dynamodb- tables-with-aws-step-functions.git

进入该解决方案的目录:

bash cd bulk-update-amazon-dynamodb-tables-with-aws-step-functions

修改 ScanAndUpdateTable Lambda

文件 functions/scan-and-update-table.py 包含 ScanAndUpdateTable Lambda函数的源代码。它包含一个名为 process_item 的 Python 函数。使用您喜欢的文本编辑器修改并保存此函数,以实现您的项目更新逻辑。

函数中包括了几个更新示例,您可以用来添加额外属性、删除特定项目以及将项目从源表复制到目标表。

在本篇文章中,让我们将函数修改为添加 processed_at 属性,并使用

操作将项目保存到 DestinationTable

删除)

部署解决方案

要部署解决方案,您需要安装 和 。

安装完成后,使用引导式 开始部署,并在提示时提供参数值:

bash sam deploy --guided

解决方案将被部署,并创建所有必要的资源,包括 (IAM)角色。它会显示部署的 Step Function 的 Amazon资源编号 (ARN)。

![部署完成时的 SAM CLI 截图,显示已部署的 Step Function删除)

启动并监控批量更新

您可以使用 AWS CLI 或控制台启动和监控批量更新。

要启动批量更新,运行以下 AWS CLI 命令,将 <arn> 替换成您的已部署 Step Function 的 ARN:

bash aws stepfunctions start-execution --state-machine-arn <arn>

或者,您也可以在 AWS 控制台访问已部署的 Step Function,选择 开始执行

![AWS控制台中的开始执行按钮](https://d2908q01vomqb2.cloudfront.net/887309d048beef83ad3eabf2a79a64a389ab1c9f/2024/03/02/DBBLOG-3756-start- 删除)

AWS 控制台提供一页显示正在运行的 Step Function 的概述,您可以选择 Map Run 链接以开启页面,查看批量更新的进度。

![Map Run链接](https://d2908q01vomqb2.cloudfront.net/887309d048beef83ad3eabf2a79a64a389ab1c9f/2024/03/02/DBBLOG-3756-state- 删除)

每个分段的处理状态将被显示。您可以随时通过更新此页面上的 最大并发性 值来调整批量更新的速度及其对 DynamoDB 表的影响。

删除)

您可以使用 AWS CLI 监控和更新 Step Function,使用 、、 和 命令。

清理

删除 S3 配置存储桶中的所有对象,并使用 命令删除此解决方案创建的所有资源。

结论

在本文中,我们提供了一种利用 Step Functions 高效执行 DynamoDB表批量更新的方案。您可以部署该解决方案并根据自己的批量更新需求进行修改。请务必在对生产表进行操作之前测试任何修改,并确保适当的表备份。

提供的解决方案将批量更新处理分散在表上,以提高性能并最小化对其他工作负载的影响。在更新过程中,您可以随时控制批量更新的速度及其对表的负担。

该解决方案的估计上限为包含 1800 亿条,平均大小为 4KB 的 DynamoDB 表。如果您的表超过此限制,或者表中项目的平均大小超过 4KB,请查阅本帖的限制部分 — EMR 或 Glue 方法可能更适合您。

如需开始使用该解决方案,请遵循本文中提供的步骤或访问 。

要了解更多关于 DynamoDB 的信息,请查看 。


作者介绍

![ChrisGillespie](https://d2908q01vomqb2.cloudfront.net/887309d048beef83ad3eabf2a79a64a389ab1c9f/2023/09/26/DBBLOG-2281-gllesch- 删除) Chris Gillespie 是一名总部位于英国的高级解决方案架构师。他大部分时间与快速发展的“云原生”客户合作。在工作之外,他过着家庭生活,并努力保持健康。

Leave a Reply

Required fields are marked *