[英]Kafka Streams – best way to get KTable and KStream on same topic?
我對Kafka Streams有一個問題(0.10.1.1)。 我正在嘗試在同一主題上創建KStream
和KTable
。
我嘗試的第一種方法是簡單地在同一主題上調用流和表的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.