2017-08-31 100 views
2

在Kafka Stream库中,我想知道KTable和GlobalKTable之间的区别。Kafka Stream:KTable vs GlobalKTable and KStream - leftJoin()vs outerJoin()

另外在KStream类中,有两个方法leftJoin()和outerJoin()。这两种方法还有什么区别。

我读http://docs.confluent.io/current/streams/javadocs/org/apache/kafka/streams/kstream/KStream.html#leftJoin-org.apache.kafka.streams.kstream.KStream-org.apache.kafka.streams.kstream.ValueJoiner-org.apache.kafka.streams.kstream.JoinWindows-

,但没有得到确切的差异。

回答

6

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

请注意,还有一个语义上的区别:对于流表连接,Kafka Stream根据记录时间戳对齐记录处理。因此,表格的更新与您流的记录对齐。对于GlobalKTable,没有时间同步,因此更新为GlobalKTable,并且完全与流记录的处理分离(因此,您会得到较弱的语义)。

有关详细信息,请参阅相应KIP:https://cwiki.apache.org/confluence/display/KAFKA/KIP-99%3A+Add+Global+Tables+to+Kafka+Streams

关于左外连接:这就像在一个数据库中的左外的全外分别加入。因此,对于左外连接,如果左边的连接不匹配,则可能会“松散”右输入流的数据。对于(完整)外连接,不会丢弃任何数据,并且两个流的每个输入记录都将位于结果流中。