我正试图找出最有效的方法从MySQL中提取数据,将其转换并加载到几乎实时的红移。目前,我们有通宵ETL工艺(使用宾得),持续时间~40分钟,我们希望用近实时(小批1-5分钟)取代它。
我找到了从MySQL binlog (即http://maxwells-daemon.io)与AWS连接的数据提取工具,我计划使用Apache或AWS转换和连接数据,并将其写入S3,然后从COPY命令将其写入Redshift。
是否有人对此或类似的解决方案有任何建议或建议?提前感谢!
发布于 2017-11-20 22:50:17
这实际上取决于您希望对来自MySQL的数据进行哪些转换,以及在您的环境中最适合使用哪种语言和框架。
以下是我的建议
为此,我会考虑AWS数据管道,因为它有现成的模板、重试机制以及内置的日志记录和监视。
看起来可能是这样的:
MySQL -> S3 ->红移(暂存) -> SQL ->红移(生产)
MySQL -> S3
这个数据管道将从"RDS MySQL到S3的增量复制“模板开始。
您可以对存储来自S3的增量数据的MySQL路径进行参数化,这样就更容易使用S3前缀来管理这些增量。如果不再使用S3上的数据,则可以定期使用S3对象生命周期管理删除这些对象。
但是,拥有S3上的数据提供了其他一些好处,您可以使用AWS雅典娜查询数据,使用QuickSight可视化,或者只使用不频繁访问或Glacier存储类进行存档,以降低存储成本,但将其保留以供将来使用。
S3 ->红移(分期)
当然,对于您的用例,它必须转到Redshift,所以我建议使用AWS Redshift Loader Lambda。它的设置有点复杂,但一旦成功完成,它非常接近于零管理,正如他们所声称的。请参阅这
使用,每次数据在定义的S3前缀上到达时,它都被加载到Redshift集群(再一次),您可以配置SNS来通知您或某个日志系统。还有其他选项,例如,在加载之前等待x文件,或每y分钟加载一次。
此外,您可能需要只从S3加载部分数据,然后转移到测试或开发环境中。使用,您只能定义一个特定的S3前缀,例如/data/2017/11来加载到Redshift。
通过使用Redshift Loader,可以使数据加载是异步的,因此,更难次要和控制该进程。这对你的案子来说可能是个问题。
如果将数据加载到Redshift失败,则使用Redshfit命令行工具将特定对象重新加载到Redshfit。
红移(分期) ->红移(生产)
请注意,Redshift并不强制引用完整性,例如唯一键,这意味着您必须有防止将重复行插入Redshift表的机制。如果您不担心重复,这是不相干的,您的数据已经在红移。
为什么这很重要?因为,如果从源检索到的数据,即MySQL,已经在Redshift中,那么您必须知道要采取什么操作。你是覆盖了它还是忽略了它。
通过在Redshift本身中这样做,就很容易使用唯一的列来比较新行和现有行,或者删除和插入行,或者只进行更新。在Redshift之外这样做,可能意味着跟踪Redshift之外已有的唯一键,并在那里进行比较。哪里?什么时候更新?多么?也许你已经有解决办法了。
因此,在前面的步骤中,您将数据插入Redshift (暂存)。为了确保数据在移动到生产表时的完整性,我们必须进行合并。AWS推荐下面是技术来合并Redsift中的数据。
如果是这样的话,为什么不使用SQL进行转换,这样就可以管理更少的组件了?
您可以使用SQL定义转换作业,将这些SQL脚本存储在S3上,并在SQLActivity中引用它们,以便与数据合并脚本一起在Redsshift集群上执行。
考虑到AWS的转换和存储到S3的功能,AWS也可能是合适的。我上面提到的一些观点也将适用于使用Kinesis。
https://stackoverflow.com/questions/47387341
复制相似问题