1

我的团队正在尝试使用 Redshift 来整合来自多个不同数据库的信息。在我们第一次尝试实施此解决方案时,我们使用 Kinesis Firehose 将 POST 记录写入我们的 API 到 S3,然后发出 COPY 命令将插入的数据写入 Redshift 中的正确表。但是,这仅允许我们插入新数据,而不允许我们转换数据、在更改时更新行或删除行。

在不使用批量转换的情况下,在 Redshift 中维护更新的数据仓库的最佳方法是什么?理想情况下,只要本地数据库中的数据发生更改,我们希望“自动”(< 5 分钟)进行更新。

4

1 回答 1

6
  1. Firehose 或 Redshift 没有触发器,但是您可以使用 Lambda 和 Firehose 的方法在数据插入之前对其进行预处理,如下所述:https ://blogs.aws.amazon.com/bigdata/post/ Tx2MUQB5PRWU36K/Persist-Streaming-Data-to-Amazon-S3-using-Amazon-Kinesis-Firehose-and-AWS-Lambda

    在您的情况下,您可以将其扩展为在 S3 上使用 Lambda,因为 Firehose 正在创建新文件,然后执行 COPY/SQL 更新。

  2. 另一种选择是编写自己的 KCL 客户端来实现 Firehose 的功能,然后在复制微批处理(500-1000 行)之后执行所需的更新。

    我已经完成了这样的实现(我们需要根据新记录更新旧记录)并且从一致性的角度来看它工作正常,尽管我建议不要使用这种架构,因为 Redshift 在更新方面的性能不佳。根据我的经验,关键规则是 Redshift 数据只能追加,并且使用过滤器删除不必要的行(使用可选的定期修剪,例如每天)通常比实时删除/更新这些行更快。

  3. 另一个选择是让 Firehose 将数据转储到暂存表中,然后让计划的作业获取该表中的任何内容,进行处理、移动数据和轮换表。

作为实时插入 Redshift 的通用参考架构,请查看以下内容:https ://blogs.aws.amazon.com/bigdata/post/Tx2ANLN1PGELDJU/Best-Practices-for-Micro-Batch-Loading-on -亚马逊-Redshift

这已经实施了多次,并且效果很好。

于 2016-03-30T01:14:50.790 回答