我正在阅读kafka流中当前对连接的一些限制,例如Ktable KTable非键连接或KTable GlobalKTable...。
我发现Flink似乎支持所有这些功能。根据我的阅读,动态表听起来像KTable。
我首先想知道它们是否是相同的概念,然后以某种方式Flink如何实现这一点,但我找不到有关基础结构的文档。例如,我没有发现GlobalKtable发生的广播联接的概念。底层基础结构是否实现了动态表分布式?
答案 0 :(得分:3)
Flink的动态表和Kafka的KTable
不同。
在Flink中,动态表是一个非常通用且笼统的概念,即随着时间而变化的表。这包括任意更改(INSERT
,DELETE
,UPDATE
)。动态表不需要主键或唯一属性,但是它可以有一个。
KStream
是动态表的一种特殊类型,即仅接收INSERT
更改的动态表,即不断增长的仅追加表。
KTable
是动态表的另一种类型,即具有唯一键并随INSERT
,DELETE
和UPDATE
而变化的动态表。更改键。
Flink在动态表上支持以下types of joins。 请注意,对Kafka联接的引用可能不是100%准确(乐意修复错误!)。
KStream
-KStream
连接KStream
-KTable
连接相似。需要在查询中明确指定两个表之间的时间关系,以便能够对批处理/脱机数据运行具有相同语义的相同查询。KTable
-KTable
连接更通用,因为它们不需要输入表具有唯一键。而且,Flink不区分主键联接或外键联接,而是要求联接是等联接,即至少具有一个相等谓词。此时,流式SQL计划程序不支持广播转发联接(我认为应该大致对应于KTable
-GlobalKTable
联接)。答案 1 :(得分:2)
我不确定100%,因为我不知道Flink的“动态表格”概念的所有细节,但是在我看来,它与Kafka Streams中的KTable
相同。
但是,Kafka Streams中的KTable
和GlobalKTable
之间是有区别的,两者并不完全相同。 (1)KTable
被分发/分片,而GlobalKTable
被复制/广播。 (2)KTable
是事件时间同步的,而GlobalKTable
不是。出于同样的原因,GlobalKTable
在启动时已完全加载/引导,而KTable
根据更改日志在适当的时候记录了事件时间戳(与其他输入流的事件时间戳有关),从而进行了更新。此外,在处理期间,对KTable
的更新是事件时间同步的,而对GlobalKTable
的更新则是不同步的(即,它们是立即应用的,因此可以被认为是不确定的)。
最后注意:Kafka Streams在即将发布的2.4版本中添加了外键KTable-KTable
。还有一张添加KTable-GlobalKTabel
联接的票证,但此功能尚未被经常请求,因此尚未添加:https://issues.apache.org/jira/browse/KAFKA-4628