Database DynamoDB:如何在一个月内分配工作负载?

Database DynamoDB:如何在一个月内分配工作负载?,database,mapreduce,amazon-dynamodb,Database,Mapreduce,Amazon Dynamodb,TL;DR 我有一张表,每月大约有200万次写入,0次读取。每个月的第一天,我需要读取上个月写的所有行,并生成CSVs+统计数据 在这种情况下,如何使用DynamoDB?如何选择读吞吐量 详细描述 我有一个记录客户端请求的应用程序。它有大约200个客户。客户需要在每个月的第一天收到一份CSV,其中包含他们提出的所有请求。他们还需要计费,为此,我们需要根据他们发出的请求计算一些统计数据,并按请求类型分组 因此,在月底,客户会收到如下报告: 我已经提出了两个解决方案,但我对其中任何一个都不相信

TL;DR

我有一张表,每月大约有200万次写入,0次读取。每个月的第一天,我需要读取上个月写的所有行,并生成CSVs+统计数据

在这种情况下,如何使用DynamoDB?如何选择读吞吐量

详细描述

我有一个记录客户端请求的应用程序。它有大约200个客户。客户需要在每个月的第一天收到一份CSV,其中包含他们提出的所有请求。他们还需要计费,为此,我们需要根据他们发出的请求计算一些统计数据,并按请求类型分组

因此,在月底,客户会收到如下报告:

我已经提出了两个解决方案,但我对其中任何一个都不相信

1st solution:好的,每个月的最后一天我都会增加读取吞吐量,然后运行map reduce作业。作业完成后,我会将容量降低回原始值

缺点:未完全自动化,作业开始时发电机容量不可用的风险

第二种解决方案:我可以将CSV+统计数据的生成分解为每天或每小时的小作业。我可以将部分CSV存储在S3上,在每个月的第一天,我可以加入这些文件并生成一个新文件。统计数据更容易生成,只需根据每日/每小时统计数据进行一些计算

缺点:我觉得我在把简单的东西变成复杂的东西

你有更好的解决办法吗?如果没有,您会选择什么解决方案?为什么?

我会使用这项服务生成每日几乎实时的账单。 为此,我将创建一个专门用于计算数据的DynamoDB表。 (其他选项是在平面文件上运行) 然后,我将添加一个进程,它将在您更新常规DynamoDB表之后将事件发送到kinesis服务

因此,当您到达月底时,您可以只执行您拥有的任何记账后计算,并从已计算的表中创建您的CSV文件


我希望这能有所帮助。

我以前也曾在类似的地方工作过,现在我向您推荐以下方法来处理原始数据:

  • 尽可能经常(从每天开始)
  • 以尽可能接近所需报告输出的格式
  • 尽可能多地完成计算/CPU密集型工作
在报告时尽可能少地留下事情做

这种方法是完全可伸缩的-增量频率可以是:

  • 缩小到所需的最小窗口
  • 如果需要,并联
它还可以根据需要重新运行过去几个月的报告,因为报告生成时间应该很短

在我的示例中,我每小时将非规范化的预处理(财务计算)数据发送到数据仓库,然后报告只涉及一个非常基本(快速)的SQL查询


这还有一个额外的好处,就是将生产数据库服务器上的负载分散到许多小块区域,而不是在发票时间每周将其压垮一次(每周生产30000张发票)。

请查看。当您需要时,它将增加/减少吞吐量,而无需任何手动干预。好消息是,您不需要改变出口工作的方式。

您有没有看一下?这解决了你的用例吗?嗨,@MikeKobit。我见过这个,但它看起来像是一个类似于我提到的第一个解决方案。我看到的问题是,我需要在运行作业之前和之后更改读取吞吐量容量。这可能会成为一个失败点。您是否考虑过在本月生成月度报告,并在1日发货+重置?似乎是一个很好的去规范化适合我的mind@ChenHarel我认为这可以解决一半的问题:统计数据的生成。但是,我仍然需要生成一个CSV(完整的请求列表),其中包含DynamoDB表中每一行的一行。这就是为什么我认为我可以每小时生成一个CSV,每天加入他们,并在计费周期结束时加入大约30个CSV。这样,读取吞吐量可以是可预测的且恒定的。你怎么看?我想这和波希米亚人的答案没有什么不同,我来这里是为了帮助你,不是为了要点:)祝你好运!我以前从未使用过动觉,但这不会是个问题。在计费周期结束时,我需要从DynamoDB表(可能有数百万行)生成一个CSV,这仍然是一个月内不规则读取吞吐量的问题。我认为这个答案并不能解决我的问题,但我感谢你的回答。你的回答是概念性的,而不是实用性的,但我同意你的立场。我相信这种方法增加了复杂性,但解决了问题。我会等几个小时看看是否有新的/更好的东西出现,否则我会接受你的回答。谢谢你的帮助。我用crontab把这一切都连接起来了。我启动了一个伪
query中的脚本:将myview复制到'file.dat'
,然后
scp file.dat svr2
然后
ssh svr2查询:从'file.dat'复制表。
感谢您的建议,非常有趣,尽管它不能解决作业开始时容量不可用的风险/假设您有适当的重试策略,这应该是一个问题。而且,根据我的经验,除非得到结果不是很关键,否则在处理像DynamoDB这样的依赖关系时,应该进行指数级重试。有许多因素不在您的控制之下(网络问题、吞吐量限制、AWS AZ故障等),简单的重试策略可以缓解这些问题