KTable vs GlobalKTable 和 left Join() vs outer Join() 有啥区别?

Posted

技术标签:

【中文标题】KTable vs GlobalKTable 和 left Join() vs outer Join() 有啥区别?【英文标题】:What are the differences between KTable vs GlobalKTable and leftJoin() vs outerJoin()?KTable vs GlobalKTable 和 left Join() vs outer Join() 有什么区别? 【发布时间】:2018-02-09 01:45:58 【问题描述】:

在Kafka Stream库中,我想知道KTable和GlobalKTable的区别。

同样在KStream类中,有leftJoin()outerJoin()两种方法。这两种方法还有什么区别?

我阅读了KStream.leftJoin,但没有找到确切的区别。

【问题讨论】:

【参考方案1】:

KTable VS GlobalKTable

KTable 在所有正在运行的 Kafka Streams 实例之间对数据进行分片,而GlobalKTable 拥有每个实例上所有数据的完整副本。 GlobalKTable 的缺点是它显然需要更多的内存。优点是,您可以使用流中的非键属性进行 KStream-GlobalKTable 连接。对于 KStream-KTable 连接和连接的非键流属性,只能通过提取连接属性并将其设置为键,然后再进行连接 - 这将导致在连接之前对流进行重新分区步骤可以被计算出来。

但请注意,还有一个语义差异:对于流表连接,Kafka Stream 对齐基于记录时间戳的记录处理。因此,对表的更新与您流的记录保持一致。对于GlobalKTable,没有时间同步,因此更新为GlobalKTable,并与流记录的处理完全解耦(因此,语义较弱)。

更多详情,请参阅KIP-99: Add Global Tables to Kafka Streams。

leftJoin() VS outerJoin()

关于左连接和外连接:就像在数据库中分别有左外连接和全外连接。

对于左外连接,如果左侧的连接不匹配,您可能会“丢失”右输入流的数据。

对于(完全)外连接,不会删除任何数据,并且两个流的每个输入记录都将在结果流中。

【讨论】:

那么,GlobalKTable 在写入过程中是否很慢?因为它必须将更改的数据写入所有应用程序实例! 不知道你说的慢是什么意思。仅写入“全局”输入主题 - 每个应用程序实例将使用“全局”主题以更新其副本到 GlobalKTable 我认为 GlobalKTable 不是 Kafka 主题,它驻留在应用程序端,需要跨多个实例进行复制。 请阅读文档:docs.confluent.io/current/streams/concepts.html#globalktable

以上是关于KTable vs GlobalKTable 和 left Join() vs outer Join() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

KSQL KTabke+KTable Join重复结果异常。

Kafka Stream 和 KTable 一对多关系加入

当主题有多个分区时,KTable-KTable 外键连接不会产生所有消息

Kafka Streams API:KStream 到 KTable

可以将 Kafka Streams 配置为等待 KTable 加载吗?

Kafka Ktable 还流式传输重复更新