Amazon redshift 从MySQL到Redshift的近实时ETL

Amazon redshift 从MySQL到Redshift的近实时ETL,amazon-redshift,amazon-kinesis,mysqlbinlog,amazon-kinesis-firehose,Amazon Redshift,Amazon Kinesis,Mysqlbinlog,Amazon Kinesis Firehose,我试图找出从MySQL中提取数据、转换数据并以近乎实时的方式加载到红移的最有效方法。 目前,我们有夜间ETL过程(使用Pentaho),持续约40分钟,我们希望用近实时(小批量1-5分钟)来代替它 我找到了两个用于从MySQL binlog(即)中提取数据的工具,它们带有连接到AWS Kinese的连接器,我计划使用Apache Spark或AWS Lambda转换和连接数据,并将其写入S3,然后从那里COPY命令将其写入Redshift 有人对这个或类似的解决方案有什么建议吗? 提前谢谢 这实

我试图找出从MySQL中提取数据、转换数据并以近乎实时的方式加载到红移的最有效方法。 目前,我们有夜间ETL过程(使用Pentaho),持续约40分钟,我们希望用近实时(小批量1-5分钟)来代替它

我找到了两个用于从MySQL binlog(即)中提取数据的工具,它们带有连接到AWS Kinese的连接器,我计划使用Apache Spark或AWS Lambda转换和连接数据,并将其写入S3,然后从那里
COPY
命令将其写入Redshift

有人对这个或类似的解决方案有什么建议吗?
提前谢谢

这实际上取决于您希望对来自MySQL的数据执行什么转换,以及什么语言和框架最适合您的环境

以下是我的建议

  • 在MySQL和Redshift之间添加中间存储,例如S3
  • 考虑数据重新加载机制,以防数据加载到红移失败
  • 我会考虑这一点,因为它已经准备好使用模板、重试机制和内置日志和监控。 它可能是这样的:

    MySQL->S3->红移(暂存)->SQL->红移(生产)

    MySQL->S3

    此数据管道将以“”模板开始

    您可以将存储MySQL增量数据的S3路径参数化,以便更容易使用S3前缀管理这些增量。如果不再使用S3上的数据,可以使用S3对象生命周期管理定期删除这些对象

    但是,将数据存储在S3上还提供了其他一些好处,您可以使用AWS Athena查询数据,使用QuickSight可视化数据,或者使用不频繁访问或冰川存储类进行归档,以降低存储成本,但保留数据以备将来使用

    S3->红移(暂存)

    当然,对于您的用例,它必须转到Redshift,所以我推荐AWS Redshift Loader Lambda。它的设置有点复杂,但一旦成功完成,就像他们所说的那样,它几乎是零管理。看

    使用AWS红移加载器,每次数据到达定义的S3前缀时,它都被加载到红移集群(一个或多个),您可以配置SNS来通知您或某个日志系统。还有其他选项,例如,在加载之前等待x文件,或者每y分钟加载一次

    此外,您可能需要将S3中的部分数据加载到测试或开发环境中。使用AWS红移加载器,您只能定义一个特定的S3前缀,例如/data/2017/11以加载到红移

    通过使用红移加载器,您可以使数据加载异步化,因此,减少和控制该过程有点困难。这可能是您的案例中的一个问题

    如果数据加载到Redshift失败,您可以使用Redshfit Loader命令行工具将特定对象重新加载到Redshfit

    红移(暂存)->红移(生产)

    请注意,红移不会强制引用完整性,例如唯一键,这意味着您必须具有防止将重复行插入红移表的机制。如果您不担心重复,这是无关的,您的数据已经处于红移状态

    为什么这很重要?因为,如果从源(即MySQL)检索到的数据已经处于红移状态,您必须知道要采取什么操作。你是覆盖它,还是忽略它

    通过使用红移本身,可以很容易地使用唯一列比较新行和现有行,或者删除和插入,或者只是更新。在Redshfit之外执行此操作,可能意味着在它之外的Redshift中跟踪已经可用的唯一关键点,并在那里进行比较。哪里何时更新?怎么用?也许你已经有了解决办法

    因此,在上一步中,您将数据插入到红移(暂存)。为了在将数据移动到生产表时确保数据的完整性,我们必须进行合并。AWS推荐在Redsift中合并数据的技术

    如果是这样的话,为什么不同时使用SQL进行转换以减少要管理的组件

    您可以使用SQL定义转换作业,将这些SQL脚本存储在S3上,并在中引用它们,以便与数据合并脚本一起在Redsshift集群上执行


    考虑到AWS Kinesis的转换和存储到S3的能力,它也可能是合适的。我上面提到的一些要点也适用于使用Kinesis。

    您是否考虑过将mysql表的精确副本复制到redshift中,然后在redshift中运行etl?然后您可以使用DMS同步mysql->redshift。DMS使用binlog,因此效率高且最新。