Flink动态表格与Kafka流Ktable?

时间:2019-07-19 18:40:32

标签: apache-flink apache-kafka-streams

我正在阅读kafka流中当前对连接的一些限制,例如Ktable KTable非键连接或KTable GlobalKTable...。

我发现Flink似乎支持所有这些功能。根据我的阅读,动态表听起来像KTable。

我首先想知道它们是否是相同的概念,然后以某种方式Flink如何实现这一点,但我找不到有关基础结构的文档。例如,我没有发现GlobalKtable发生的广播联接的概念。底层基础结构是否实现了动态表分布式?

2 个答案:

答案 0 :(得分:3)

Flink的动态表和Kafka的KTable不同。

在Flink中,动态表是一个非常通用且笼统的概念,即随着时间而变化的表。这包括任意更改(INSERTDELETEUPDATE)。动态表不需要主键或唯一属性,但是它可以有一个。

  • KStream是动态表的一种特殊类型,即仅接收INSERT更改的动态表,即不断增长的仅追加表。

  • KTable是动态表的另一种类型,即具有唯一键并随INSERTDELETEUPDATE而变化的动态表。更改键。

Flink在动态表上支持以下types of joins请注意,对Kafka联接的引用可能不是100%准确(乐意修复错误!)。

  • Time-windowed joins应对应KSQL的KStream-KStream连接
  • Temporal table joins与KSQL的KStream-KTable连接相似。需要在查询中明确指定两个表之间的时间关系,以便能够对批处理/脱机数据运行具有相同语义的相同查询。
  • Regular joins比KSQL的KTable-KTable连接更通用,因为它们不需要输入表具有唯一键。而且,Flink不区分主键联接或外键联接,而是要求联接是等联接,即至少具有一个相等谓词。此时,流式SQL计划程序不支持广播转发联接(我认为应该大致对应于KTable-GlobalKTable联接)。

答案 1 :(得分:2)

我不确定100%,因为我不知道Flink的“动态表格”概念的所有细节,但是在我看来,它与Kafka Streams中的KTable相同。

但是,Kafka Streams中的KTableGlobalKTable之间是有区别的,两者并不完全相同。 (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