【问题标题】:Incremental Data Storage增量数据存储
【发布时间】:2019-03-01 04:53:50
【问题描述】:

我有运行模型的时间序列每日数据。该模型在 Spark 中运行。

我只想每天运行模型,并将结果附加到历史结果中。拥有一个包含历史数据的“合并的单一数据源”对于模型成功运行非常重要。

我必须使用 AWS 服务来存储结果。如果我存储在 S3 中,我最终将每天存储回填 + 1 个文件(文件太多)。如果我存储在 Redshift 中,它不会合并 + upsert,因此变得复杂。面向客户的数据位于 Redshift 中,因此不能选择删除表并每天重新加载。

我不确定如何巧妙地(定义为最低成本和后续处理)存储增量数据,而无需每天重新处理所有内容以获得单个文件。

【问题讨论】:

  • "如果我存储在 Redshift 中,它不会合并 + upsert,因此变得复杂。" - 你能扩展一下吗?为什么无法在 Redshift 中创建插入/更新逻辑?

标签: apache-spark amazon-s3 time-series amazon-redshift


【解决方案1】:

S3 仍然是您的最佳选择。由于您的工作似乎不需要以实时方式访问,因此它更像是一个滚动数据集。

如果您担心它生成的文件量,您至少可以做两件事:

  1. S3 对象生命周期管理 您可以定义要在 x 天后删除或转换到另一个存储类(更便宜)的对象。 更多示例:https://docs.aws.amazon.com/AmazonS3/latest/dev/lifecycle-configuration-examples.html

  2. S3 通知 基本上,您可以在您的 S3 存储桶中设置一个侦听器,“侦听”与您指定的前缀和后缀匹配的所有对象,以触发其他 AWS 服务。您可以做的一件简单的事情是触发 Lambda,进行处理,然后您可以做任何您想做的事情。 https://docs.aws.amazon.com/AmazonS3/latest/user-guide/enable-event-notifications.html

尽可能使用 S3 作为您的数据库。它非常便宜,而且是 AWS 的支柱。

【讨论】:

  • 问题是我们有很多“数据库”进入模型。因此,您最终会得到包含数百个文件(每天一个)的子文件夹,并且变得非常混乱。如果某天某项工作失败,那么该文件就会丢失,并且会破坏 Redshift 的负载。此外,在 S3 中,我认为 Redshift 仍然需要“删除表格”(它将包含所有历史数据,因此很难从 S3 中移出)。总的来说,我非常喜欢 S3,只是想了解如何使其工作。与 S3 相比,“更便宜”的存储选项是什么?
  • 这里有 4 个存储类:docs.aws.amazon.com/AmazonS3/latest/dev/…。我不认为它像您想的那么混乱,因为 AWS 也使用该约定。例如,我的一个访问日志存储桶(我为我的一个应用程序 LB 启用了访问日志)看起来像:s3://mybucket/AWSLogs/123456/elasticloadbalancing/us-east-1/2018/08/20/123456_alb.log .gz。对人类来说,这看起来很乱,但如果你为你的文件夹使用像上面这样的好的文件夹命名方案,S3 事件通知 + lambda 或任何应该为你工作的东西。
【解决方案2】:

您也可以切换到 ETL。 Pentaho Data Integrator 是一个非常高效的开源软件,它是专门研究大数据的、完全自动化且易于使用的。

它配备了适用于 S3、Redshift(和其他)的现成插件,并且只需一步即可与以前的值进行比较。根据我的经验,它运行得非常快。此外,它在夜间为您工作,并在早上向您发送一封邮件,说明一切正常(或不正常)。

版主注意:这是一个不可知论的观点,我本可以推荐很多其他的,但这个接缝最适合 OP 的需要。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多