簡體   English   中英

Kafka Streams - 在同一主題上獲得KTable和KStream的最佳方式?

[英]Kafka Streams – best way to get KTable and KStream on same topic?

我對Kafka Streams有一個問題(0.10.1.1)。 我正在嘗試在同一主題上創建KStreamKTable

我嘗試的第一種方法是簡單地在同一主題上調用流和表的KStreamBuilder方法。 這導致了

org.apache.kafka.streams.errors.TopologyBuilderException: Invalid topology building: Topic <topicName> has already been registered by another source.

好吧,這似乎是Kafka Streams內置的一些限制。

我的第二種方法是最初創建一個KTable並在其上使用toStream()方法。 這有一個問題, KTables做了一些內部緩沖/刷新,所以如果一個鍵出現多次,輸出流不會反映所有輸入元素,如我的例子。 這是一個問題,因為我正在計算密鑰的出現次數。

似乎有效的方法是最初創建一個KStream ,按鍵對其進行分組,然后通過丟棄舊聚合並僅保留新值來“減少”它。 我對這種方法不太滿意,因為a)看起來非常復雜,並且b) Reducer接口沒有指定哪一個是已經聚合的值,哪一個是新的。 我參加了會議並保留了第二個,但是......嗯。

所以問題歸結為:有更好的方法嗎? 我錯過了一些非常明顯的東西嗎?

請記住,我沒有處理正確的用例 - 這只是我了解Streams-API。

關於兩次添加主題:這是不可能的,因為Kafka Streams應用程序是單個“消費者組”,因此只能一次為主題提交偏移,而添加主題兩次則表明主題獲取消費者兩次(和獨立進步)。

對於KTable#toStream() ,您可以通過StreamsConfig參數cache.max.bytes.buffering == 0禁用緩存。 但是,這是一個全局設置,並禁用所有KTable的緩存/重復數據刪除(參見http://docs.confluent.io/current/streams/developer-guide.html#memory-management )。

更新:從Kafka 0.11開始,可以通過Materialized參數單獨禁用每個KTable的緩存。

groupBy方法也可以工作,即使它需要一些樣板。 我們考慮將KStream#toTable()添加到API以簡化此轉換。 是的, reduce中的第二個參數是新值 - 因為reduce是組合兩個值,API沒有“old”和“new”的概念,因此參數沒有這樣的命名。

暫無
暫無

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

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