2017-08-31 119 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

關於左外連接:這就像在一個數據庫中的左外的全外分別加入。因此,對於左外連接,如果左邊的連接不匹配,則可能會「鬆散」右輸入流的數據。對於(完整)外連接,不會丟棄任何數據,並且兩個流的每個輸入記錄都將位於結果流中。