簡體   English   中英

Kafka Stream:KTable 物化

[英]Kafka Stream: KTable materialization

如何識別主題的 KTable 實現何時完成?

例如,假設 KTable 有幾百萬行。 偽代碼如下:

KTable<String, String> kt = kgroupedStream.groupByKey(..).reduce(..); //Assume this produces few million rows

在某個時間點,我想安排一個線程來調用以下寫入主題的線程: kt.toStream().to("output_topic_name");

我想確保所有數據都作為上述調用的一部分寫入。 此外,一旦調用上述“to”方法,是否可以在下一個計划中調用它,或者第一個調用是否始終保持活動狀態?

后續問題:

約束
1)好的,我看到一旦 kafkastream 啟動,kstream 和 ktable 是無界/無限的。 但是,ktable 實現(到壓縮的主題)不會在指定時間段內為同一鍵發送多個條目。

因此,除非壓縮過程嘗試清理這些並僅保留最新的,否則下游應用程序將使用從主題查詢的相同鍵的所有可用條目,從而導致重復。 即使壓縮過程進行了某種程度的清理,也總是不可能在給定的時間點,隨着壓縮過程的追趕,某些鍵具有多個條目。

我假設 KTable 在 RocksDB 中只有一個給定鍵的記錄。 如果我們有辦法安排實現,這將有助於避免重復。 此外,減少在主題中持久化的數據量(增加存儲),增加網絡流量,額外的壓縮過程開銷來清理它。

2) 也許 ReadOnlyKeyValueStore 將允許從存儲中進行受控檢索,但它仍然缺乏調度鍵、值和寫入主題的方法,這需要額外的編碼。

是否可以改進 API 以允許受控實現?

KTable 實現永遠不會完成,您也不能“調用” to()

當您使用 Streams API 時,您“插入”了一個 DAG 運算符。 實際的方法調用,不會觸發任何計算,而是修改算子的 DAG。

只有在您通過KafkaStreams#start()開始計算后才會處理數據。 請注意,您指定的所有運算符都將在計算開始后連續並發運行。

沒有“計算結束”,因為輸入預計是無界/無限的,因為上游應用程序可以隨時將新數據寫入輸入主題。 因此,您的程序永遠不會自行終止。 如果需要,您可以通過KafkaStreams#close()停止計算。

在執行期間,您無法更改 DAG。 如果你想改變它,你需要停止計算並創建一個新的KafkaStreams實例,將修改后的 DAG 作為輸入

跟進:

是的。 您必須將 KTable 視為“版本化表”,當條目更新時,它會隨着時間的推移而演變。 因此,所有更新都寫入變更日志主題並作為變更記錄發送到下游(注意,KTables 也做了一些緩存,以“刪除”對同一鍵的連續更新:參見https://docs.confluent .io/current/streams/developer-guide/memory-mgmt.html )。

將消耗從主題查詢的相同鍵的所有可用條目,從而導致重復。

我不會將它們視為“重復”,而是將其視為更新 是的,應用程序需要能夠正確處理這些更新。

如果我們有辦法安排實現,這將有助於避免重復。

具體化是一個連續的過程,只要輸入主題中有新的輸入記錄可用並被處理,KTable 就會更新。 因此,在任何時間點都可能有特定密鑰的更新。 因此,即使您完全控制何時向變更日志主題和/或下游發送更新,稍后也可能會有新的更新。 這就是流處理的本質。

此外,減少在主題中持久化的數據量(增加存儲),增加網絡流量,額外的壓縮過程開銷來清理它。

如上所述,緩存用於節省資源。

是否可以改進 API 以允許受控實現?

如果提供的 KTable 語義不符合您的要求,您始終可以將自定義運算符編寫為ProcessorTransformer ,為其附加鍵值存儲,並實現您需要的任何內容。

暫無
暫無

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

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