簡體   English   中英

Kafka Streams:StateStore 在從上下文中獲取時是包含所有數據還是僅包含一些分區數據?

[英]Kafka Streams: does StateStore contains all data or only some partitioned data when get from context?

我有一個帶有多個分區的 kafka 主題和一個讀取該主題的 kafka 流應用程序。

kafka 流應用程序包含一個將數據存儲到本地 RockDB 持久 StateStore DB 的 Transaformer。 Transformer 由框架通過 TransformerSupplier 自動實例化

TransformerSupplier<String, Message, KeyValue<String, Message>> getTransformerSupplier(){
            if(transformerSupplier == null)
                transformerSupplier = () -> new MyTransformer();
            return transformerSupplier;
    }

此外,transformer 會調度一個標點符號,該標點符號需要對同一個 StateStore 執行操作。

我的問題是:當標點符號讀取StateStore時,所有分區的所有元素都被讀取或上下文接收到的StateStore僅限於transformer讀取的分區?

這是我的變壓器的一個例子:

public class MyTransformer implements Transformer<String, Message, KeyValue<String, Message>> {
        private KeyValueStore<String, Message> stateStore;
        private ProcessorContext context;
        private MyScheduler myScheduler;
    
        @Override
        public void init(ProcessorContext context) {
            this.context = context;
            stateStore = this.context.getStateStore(myStateStoreName);
            myScheduler.initAndSchedule(this.context);
        }
@Override
    public KeyValue<String, Message> transform(String key, Message newValue) {
        stateStore.put(key, newValue);
        return null;
    }

這是我的標點符號的內容

public void initAndSchedule(ProcessorContext context) {
        this.context = context;
        stateStore = this.context.getStateStore(myStateStoreName);
        this.context.schedule(Duration.ofSeconds(schedulerSeconds), PunctuationType.WALL_CLOCK_TIME, this);
    }

 @Override
    public void punctuate(long timestamp) {
        stateStore.all().forEachRemaining(keyValue -> {
            logger.info("      StateStore key {}", keyValue.key);
        });
    }

如上所述,StateStore 由 Transformer 的上下文給出,但“stateStore.all().forEachRemaining()”函數允許我掃描主題接收到的所有數據,還是只掃描提供上下文的轉換器准備好的分區?

實際場景:KafkaTopic 包含 10 個分區 -> 我們有 2 個 pod,每個 pod 讀取 5 個分區 -> 每個 pod 的 transformerSupplier 創建 3 個 MyTransformer 實例,每個實例讀取 2 或 1 個分區,因此每個 LocalStore 將包含 5 個分區的數據 - > 每個轉換器實例化一個調度程序,因此每個讀取 LocalStores 的 pod 有 3 個調度程序實例。 他們可以訪問整個 5 個分區還是只能訪問由變壓器處理的 2 個或 1 個分區?

謝謝

我添加了一些日志記錄,實際上是由提供的 StateStore

this.context.getStateStore(myStateStoreName);

標點符號僅包含來自 myTransformer 讀取的分區的數據。 因此,需要標點符號的所有實例來讀取所有數據

暫無
暫無

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

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