簡體   English   中英

了解Kafka Stream中的max.task.idle.ms以獲取KStream-KTable連接

[英]Understanding max.task.idle.ms in Kafka Stream for a KStream-KTable join

在Kafka 2.2中使用max.task.idle.ms時,我需要幫助理解Kafka流行為。

我有一個KStream-KTable連接,其中KStream已被重新鍵入:

KStream stream1 = builder.stream("topic1", Consumed.with(myTimeExtractor));
KStream stream2 = builder.stream("topic2", Consumed.with(myTimeExtractor));

KTable table = stream1
       .groupByKey()
       .aggregate(myInitializer, myAggregator, Materialized.as("myStore"))

stream2.selectKey((k,v)->v)
       .through("rekeyedTopic")
       .join(table, myValueJoiner)
       .to("enrichedTopic");

所有主題都有10個分區,為了測試,我將max.task.idle.ms設置為2分鍾。 myTimeExtractor只有在標記為“snapshot”時才更新消息的事件時間:stream1中的每個快照消息都將其事件時間設置為某個常量T,stream2中的消息將其事件時間設置為T + 1。

當我調用KafkaStreams #start時,在topic1和topic2中每個都有200條消息,所有標記為“snapshot”,之后不再添加任何消息。 我可以看到,在一秒鍾左右,myStore和rekeyedTopic都會被填滿。 由於表中消息的事件時間低於流中消息的事件時間我的理解(來自閱讀https://cwiki.apache.org/confluence/display/KAFKA/KIP-353%3A+Improve + Kafka + Streams + Timestamp + Synchronization )是我應該在myStore和rekeyedTopic填滿后不久看到連接的結果(在enrichedTopic中)。 實際上我應該能夠首先填充rekeyedTopic,只要myStore在此之后不到2分鍾被填滿,連接仍然應該產生預期的結果。

這不是發生的事情。 會發生的事情是myStore和rekeyedTopic在第一秒左右被填滿,然后2分鍾內沒有任何事情發生,只有那時,richhedTopic才會填滿預期的消息。

我不明白為什么在richhedTopic被填滿之前有2分鍾的暫停,因為很久以前一切都“准備好了”。 我錯過了什么?

基於它所聲明的文檔:

max.task.idle.ms - 當流任務並非所有分區緩沖區都包含記錄時,流任務將保持空閑的最長時間,以避免跨多個輸入流的潛在無序記錄處理。

我會說這可能是由於某些分區緩沖區不包含記錄所以它基本上等待避免亂序處理直到您為該屬性配置的定義時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM