繁体   English   中英

用Kafka流/ KSQL连接表吗?

[英]Join table with Kafka stream / KSQL?

我正在导入一个数据库,其中包含一些表示多对多和一对多关系的链接表。

现在让我们集中讨论一对多关系。 例如,一份生物测定可以有很多文件,但一个文件只能有一个生物测定。

因此,我有一个BioAssay表[BioAssay,...,...,...]和一个链接表[Document,BioAssay]。

最终,我需要将这2个文档及其全部文档加入完整的BioAssay中,例如[BioAssayxyz,....,“ Document1:Document2:Document3”]

我想知道这里是否有人可以为我提供Kafka流需要发生的情况?

1-到目前为止,根据我对Kafka流的了解,似乎我需要为每个链接表提供一个流,以便执行聚合。 KTable将无法使用,因为记录是按键更新的。 但是,聚合的结果可能是在Ktable中。

2-然后是外键联接的问题。 看来唯一的方法就是通过GlobalKtable。 link-table-topic-> link-table-stream-> link-tableGlobaKTable。 由于我的表很大,因此可能会占用大量磁盘空间。 这是一个具有大量表的超大型数据库,并且在数据上构建多个逻辑视图的要求是项目核心的一部分,无法避免。

a)我在这里理解吗?

b)这是解决该问题的唯一方法吗?

编辑1

听起来唯一存在的就是KStream-to-GlobalKTable,似乎我需要将事情倒过来一点。 我的原始DB BioAssay表需要转换为流,而我的链接文档表首先需要转换为流以进行聚合,然后需要转换为GlobalKTable以进行连接。

无论哪种方式,除非我的流仅具有一个分区,否则这将非常昂贵。

几个月前,我碰巧曾在Kafka Streams上处理过一个类似的用例,我很高兴分享自己的经验。

按照您的建议使用KStreams-to-KTable可能会奏效,尽管有些注意事项可能对您来说是不可接受的。

首先,回想一下,只有当在流端而不是ktable端接收到新事件时,Kafka Streams才会更新流到表的连接。

其次,假设您使用CDC来导入数据库,那么我的理解是您无法保证更新在Kafka上的顺序。 这意味着即使您在数据库方面享受事务隔离,从而使“文档和BioAssay”表一次全部更新或插入到表中,但在Kafka方面,您会以任意顺序收到一个,然后收到另一个。

以上两点希望可以清楚地说明为什么Kafka Streams端的联接结果可能无法反映您期望的数据库内容。

我采取的解决方案是“深入了解”并使用Processor API手动加入我的流。 这允许实现表对表的连接语义,每当更新任一侧时都进行更新。 我在该博客文章中描述了核心思想:

https://svend.kelesia.com/one-to-many-kafka-streams-ktable-join.html

使用该技术,我能够从DB正确导入一对多和多对多关系。

如果您的表共享相同的键(即外键),则可以利用它来发挥优势,并将所有表流式传输到同一主题(可以使用多个分区进行扩展)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM