我试图找出从MySQL中提取数据的最有效方法,将其转换并近乎实时地加载到Redshift。 目前我们有隔夜ETL过程(使用Pentaho),持续约40分钟,我们希望用近实时(迷你批次1-5分钟)替换它。
我发现了几个用于从MySQL binlog(即http://maxwells-daemon.io)提取数据的工具以及AWS Kineses的连接器,我计划使用Apache Spark或AWS Lambda转换和连接数据并将其写入S3并从那里{ {1}}命令将其写入Redshift。
是否有人对此或类似解决方案有任何建议或建议? 提前谢谢!
答案 0 :(得分:2)
这实际上取决于您希望对来自MySQL的数据进行哪些转换,以及哪种语言和框架最适合您的环境。
以下是我的建议
我会考虑AWS Data Pipeline,因为它有现成的模板,重试机制以及内置的日志记录和监控。
看起来像这样:
MySQL - > S3 - > Redshift(分期) - > SQL - > Redshift(制作)
MySQL - > S3 强>
此数据管道将以" Incremental copy of RDS MySQL to S3"模板。
您可以对存储来自MySQL的增量数据的S3路径进行参数化,因此使用S3前缀可以更轻松地管理这些增量。如果不再使用S3上的数据,则可以定期使用S3 Object Lifecycle Management删除这些对象。
但是,拥有S3的数据还有其他一些好处,您可以使用AWS Athena进行查询,使用QuickSight进行可视化,或者使用不常访问或Glacier存储类进行存档以降低存储成本,但保留以备将来使用。
S3 - > Redshift(升级)
当然,对于您的用例,它必须转到Redshift,因此我建议使用AWS Redshift Loader Lambda。它的设置有点复杂,但一旦成功完成,它就非常接近零管理,正如他们声称的那样。见this
使用AWS Redshift Loader,每次数据到达定义的S3前缀时,它都会加载到Redshift集群(再多一个),您可以配置SNS以通知您或某些日志记录系统。还有其他选项,例如,在加载前等待x文件,或者每y分钟加载一次。
此外,您可能需要仅将部分数据从S3加载到Redshift进入测试或开发环境。使用AWS Redshift Loader,您只能定义特定的S3前缀,例如/ data / 2017/11加载到Redshift。
通过使用Redshift Loader,您将使数据加载异步,因此,稍微更难以控制该过程。这可能是您的案件的问题。
如果加载到Redshift的数据失败,则使用Redshfit Loader命令行工具将特定对象重新加载到Redshfit。
Redshift(升级) - >红移(生产)强>
请注意,Redshift不会强制引用完整性,例如唯一键,这意味着您必须具有防止将重复行插入Redshift表的机制。如果您不担心重复项,则无关紧要,您的数据已经在Redshift中。
为什么重要?因为,如果从源(即MySQL)检索的数据已经在Redshift中,您必须知道要采取的操作。你是否覆盖它,或者只是忽略它。
通过在Redshift中进行操作,可以很容易地使用唯一列比较新行和现有行,并删除和插入或只更新。在Redshfit之外进行,可能意味着要跟踪Redshift中已有的唯一键,并在那里进行比较。哪里?什么时候更新?怎么样?也许你已经有了解决方案。
因此,在上一步中,您将数据插入Redshift(分段)。为了确保将数据移动到生产表时的数据完整性,我们必须进行合并。 AWS建议使用following技术在Redsift中合并数据。
如果是这样,为什么不使用SQL进行转换,以便管理更少的组件?
您可以使用SQL定义转换作业,在S3上存储这些SQL脚本并在SQLActivity中引用它们,以便在Redsshift集群上与数据合并脚本一起执行。
AWS Kinesis也可能适合其转换和存储到S3功能。我上面提到的一些观点也适用于使用Kinesis。