DynamoDB:如何在一个月内分配工作量?

时间:2014-12-07 22:25:42

标签: database mapreduce amazon-dynamodb

TL; DR

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

如何在此方案中使用DynamoDB?如何选择READ吞吐量?

详细说明

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

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

Full list of requests

Billing Summary

我已经来到两个解决方案,但我还没有确信任何一个

第一个解决方案:好的,每个月的最后一天我都会增加READ吞吐量,然后运行map reduce工作。作业完成后,我将容量减少回原始值。

缺点:未完全自动化,在作业启动时无法使用DynamoDB容量的风险。

第二个解决方案:我可以在每日或每小时的例行程序中将CSVs +统计数据的生成分解为小型工作。我可以在S3上存储部分CSV,并且在每个月的第一天我可以加入这些文件并生成一个新文件。统计数据将更容易生成,只是从每日/每小时统计数据中得出一些计算结果。

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

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

3 个答案:

答案 0 :(得分:5)

之前我曾经在一个类似的地方,我用过,现在建议您处理原始数据:

  • 尽可能经常(每天开始)
  • 到尽可能接近所需报告输出的格式
  • 尽可能多地完成计算/ CPU密集型工作

尽可能少地在报告时间做。

这种方法完全可扩展 - 增量频率可以是:

  • 根据需要缩小到一个小窗口
  • 如果需要,
  • 并行化

由于报告生成时间应该非常短,因此可以根据需要重新运行过去几个月的报告。

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

这样做的另一个好处是可以将生产数据库服务器上的负载分散到许多小的位置,而不是在发票时间每周一次(每周生产30000个发票)使其瘫痪。

答案 1 :(得分:2)

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

因此,当您到达月末时,您可以执行您拥有的任何过帐结算计算,并从已计算的表格中创建CSV文件。

我希望有所帮助。

答案 2 :(得分:1)

看看Dynamic DynamoDB。它会在您需要时增加/减少吞吐量,无需任何人工干预。好消息是你不需要改变导出工作的方式。