使用Kafka进行数据集成以及更新和删除

arc*_*zee 5 data-integration data-synchronization apache-kafka

所以有一点背景 - 我们有大量的数据源,从RDBMS到S3文件.我们希望将这些数据与其他各种数据仓库,数据库等同步和集成.

起初,这似乎是卡夫卡的典型模式.我们希望通过Kafka将数据更改流式传输到数据输出源.在我们的测试案例中,我们使用Oracle Golden Gate捕获更改并成功将更改推送到Kafka队列.但是,将这些更改推送到数据输出源已经证明具有挑战性.

我意识到如果我们只是向Kafka主题和队列添加新数据,这将非常有效.我们可以缓存更改并将更改写入各种数据输出源.然而,这种情况并非如此.我们将更新,删除,修改分区等.处理此问题的逻辑似乎要复杂得多.

我们尝试使用登台表和连接来更新/删除数据,但我觉得这会很快变得非常笨拙.

这就是我的问题 - 我们可以采取哪些不同的方法来处理这些操作?或者我们应该完全朝着不同的方向前进?

任何建议/帮助非常感谢.谢谢!

Ofr*_*viv 6

您可以采取以下三种方法:

  1. 完全转储负载
  2. 增量转储负载
  3. Binlog复制

完全转储负载

定期将RDBMS数据源表转储到文件中,然后将其加载到数据仓库中,替换以前的版本.这种方法主要用于小型表,但实现起来非常简单,并且支持轻松更新和删除数据.

增量转储负载

定期获取自上次查询以来更改的记录,并将它们发送到数据仓库.有点像

SELECT *
FROM my_table
WHERE last_update > #{last_import}
Run Code Online (Sandbox Code Playgroud)

这种方法实现起来稍微复杂一些,因为你必须维护状态(上面代码片段中的"last_import"),并且它不支持删除.它可以扩展为支持删除,但这使它更复杂.这种方法的另一个缺点是它需要你的表有一个last_update列.

Binlog复制

编写一个程序,持续监听RDBMS的binlog,并将这些更新发送到数据仓库中的中间表,包含行的更新值,以及是删除操作还是更新/创建.然后编写一个定期合并这些更新的查询,以创建一个镜像原始表的表.此合并过程背后的想法是为每个ID选择所有更新中或最后一个版本的统一表中显示的最后(最高级)版本.

这种方法实现起来稍微复杂一些,但即使在大型表上也可以实现高性能,并支持更新和删除.

Kafka与此方法相关,因为它可以用作binlog侦听器和加载到数据仓库中间表之间的行更新的管道.


您可以在此博客文章中阅读有关这些不同复制方法的更多信息.

披露:我在Alooma工作(一位同事写了上面链接的博客文章,我们提供数据管道作为服务,解决这样的问题).