使用 Kinesis Firehose 可以在 S3 和 Redshift 之间进行 ETL 吗?

ETL Possible Between S3 and Redshift with Kinesis Firehose?

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

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

  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 的功能,然后在 COPY 微批次(500-1000 行)后执行所需的更新。

    我已经完成了这样的实现(我们需要根据新记录更新旧记录)并且从一致性的角度来看它工作正常,但由于 Redshift 性能不佳,我一般建议不要使用这种架构关于更新。根据我的经验,关键规则是 Redshift 数据是仅附加的,使用过滤器删除不必要的行(使用可选的定期修剪,如每天)通常比 delete/update 这些行更快 -时间.

  3. 另一种选择是让 Firehose 将数据转储到暂存区 table(s),然后安排作业获取其中的任何内容 table,进行处理,移动数据,旋转tables.

作为实时插入到 Redshift 的通用参考架构,看看这个:https://blogs.aws.amazon.com/bigdata/post/Tx2ANLN1PGELDJU/Best-Practices-for-Micro-Batch-Loading-on-Amazon-Redshift

这已实施多次,效果很好。