加入 table 与 Kafka 流/KSQL?
Join table with Kafka stream / KSQL?
我正在导入一个数据库,其中包含一些 link table 代表多对多和一对多关系。
现在让我们关注一对多关系。例如。一个Biossay可以有多个document,一个document只能有一个BioAssay。
因此我有一份 table BioAssay [BioAssay, ..., ..., ...] 和一份 link table [Document, BioAssay]。
最终我需要将这 2 个加入到一个完整的 BioAssay 及其所有文档中,例如[BioAssayxyz, ...., "Document1:Document2:Document3"]
我想知道这里是否有人可以让我了解 Kafka 流需要发生什么?
1 - 到目前为止,根据我对 Kafka 流的理解,似乎我需要每个 link table 的流来执行聚合。 KTable 将不可用,因为记录是按键更新的。但是,聚合的结果可能是 Ktable 中的 a。
2 - 然后是外键连接的问题。似乎唯一的方法就是通过 GlobalKtable。 link-table-主题 -> link-table-流->link-tableGlobaKTable。这可能会导致大量磁盘 space 使用,因为我的 table 非常大。这是一个超大的DB,有很多table,在数据上构建多个逻辑视图的需求是项目核心的一部分,无法避免。
a) 我理解到这里了吗?
b) 这是解决该问题的唯一方法吗?
EDIT1
听起来唯一存在的是 KStream-to-GlobalKTable,看来我需要稍微颠倒一下。我原来的 DB BioAssay Table,需要变成流,而我的 link 文档 table,需要先变成流进行聚合,然后是 GlobalKTable 加入。
无论哪种方式,除非我的流只有一个分区,否则这可能会非常昂贵。
几个月前我碰巧用 Kafka Streams 处理过一个类似的用例,我很高兴分享我的经验。
按照您的建议使用 KStreams-to-KTable 会有点效果,但有一些您可能无法接受的注意事项。
首先,回想一下 stream-to-table 连接仅在流端收到新事件时才由 Kafka Streams 更新,而不是在 ktable 端。
其次,假设您使用 CDC 来导入数据库,那么我的理解是您无法保证更新到达 Kafka 的顺序。这意味着,即使您在 DB 端享受事务隔离,在表 Document 和 BioAssay "all at once" 上显示更新或插入,在 Kafka 端,您也会以任意顺序收到一个,然后另一个。
以上两点希望能清楚说明为什么 Kafka Streams 端的连接结果可能无法像您期望的那样反映数据库内容。
我采取的解决方案是 "under the hood" 并使用处理器 API 手动加入我的流。这允许实现 table-to-table 连接语义,只要任何一方更新就更新。我在该博客中描述了核心思想 post:
https://svend.kelesia.com/one-to-many-kafka-streams-ktable-join.html
使用该技术,我能够从数据库中正确导入 one-to-many 和 many-to-many 关系。
如果您的表共享相同的键(即外键),那么您可以利用这一点并将所有表流式传输到同一主题(您可以使用多个分区来横向扩展)。
我正在导入一个数据库,其中包含一些 link table 代表多对多和一对多关系。
现在让我们关注一对多关系。例如。一个Biossay可以有多个document,一个document只能有一个BioAssay。
因此我有一份 table BioAssay [BioAssay, ..., ..., ...] 和一份 link table [Document, BioAssay]。
最终我需要将这 2 个加入到一个完整的 BioAssay 及其所有文档中,例如[BioAssayxyz, ...., "Document1:Document2:Document3"]
我想知道这里是否有人可以让我了解 Kafka 流需要发生什么?
1 - 到目前为止,根据我对 Kafka 流的理解,似乎我需要每个 link table 的流来执行聚合。 KTable 将不可用,因为记录是按键更新的。但是,聚合的结果可能是 Ktable 中的 a。
2 - 然后是外键连接的问题。似乎唯一的方法就是通过 GlobalKtable。 link-table-主题 -> link-table-流->link-tableGlobaKTable。这可能会导致大量磁盘 space 使用,因为我的 table 非常大。这是一个超大的DB,有很多table,在数据上构建多个逻辑视图的需求是项目核心的一部分,无法避免。
a) 我理解到这里了吗?
b) 这是解决该问题的唯一方法吗?
EDIT1
听起来唯一存在的是 KStream-to-GlobalKTable,看来我需要稍微颠倒一下。我原来的 DB BioAssay Table,需要变成流,而我的 link 文档 table,需要先变成流进行聚合,然后是 GlobalKTable 加入。
无论哪种方式,除非我的流只有一个分区,否则这可能会非常昂贵。
几个月前我碰巧用 Kafka Streams 处理过一个类似的用例,我很高兴分享我的经验。
按照您的建议使用 KStreams-to-KTable 会有点效果,但有一些您可能无法接受的注意事项。
首先,回想一下 stream-to-table 连接仅在流端收到新事件时才由 Kafka Streams 更新,而不是在 ktable 端。
其次,假设您使用 CDC 来导入数据库,那么我的理解是您无法保证更新到达 Kafka 的顺序。这意味着,即使您在 DB 端享受事务隔离,在表 Document 和 BioAssay "all at once" 上显示更新或插入,在 Kafka 端,您也会以任意顺序收到一个,然后另一个。
以上两点希望能清楚说明为什么 Kafka Streams 端的连接结果可能无法像您期望的那样反映数据库内容。
我采取的解决方案是 "under the hood" 并使用处理器 API 手动加入我的流。这允许实现 table-to-table 连接语义,只要任何一方更新就更新。我在该博客中描述了核心思想 post:
https://svend.kelesia.com/one-to-many-kafka-streams-ktable-join.html
使用该技术,我能够从数据库中正确导入 one-to-many 和 many-to-many 关系。
如果您的表共享相同的键(即外键),那么您可以利用这一点并将所有表流式传输到同一主题(您可以使用多个分区来横向扩展)。