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

aws*_*ion 1 amazon-s3 amazon-web-services aws-sdk aws-lambda amazon-kinesis-firehose

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

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

小智 5

  1. Firehose或Redshift没有触发器,但是您可以潜在地使用使用Lambda和Firehose的方法在插入数据之前对其进行预处理,如下所述:https ://blogs.aws.amazon.com/bigdata/post/ Tx2MUQB5PRWU36K /使用Amazon Kinesis Firehose和AWS Lambda持续流数据到Amazon S3

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

  2. 另一种替代方法是编写您自己的KCL客户端,该客户端将实现Firehose的功能,然后在复制微型批次(500-1000行)之后执行所需的更新。

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

  3. 另一个替代方案是让Firehose将数据转储到临时表中,然后让计划的作业采用该表中的所有内容,进行处理,移动数据并旋转表。

作为将实时插入Redshift的通用参考体系结构,请看一下:https : //blogs.aws.amazon.com/bigdata/post/Tx2ANLN1PGELDJU/Best-Practicess-for-Micro-Batch-Loading-on -亚马逊Redshift

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