簡體   English   中英

為什么在Apache Flink中使用initializeState()時出現NullPointerException?

[英]Why I got a NullPointerException when using initializeState() in Apache Flink?

我在CheckpointedFuntion中使用運算符狀態,但是在初始化MapState時遇到NullPointerException:

public void initializeState(FunctionInitializationContext context) throws Exception {
    MapStateDescriptor<Long, Long> descriptor
        = new MapStateDescriptor<>(
            "state",
            TypeInformation.of(new TypeHint<Long>() {}),
            TypeInformation.of(new TypeHint<Long>() {})
        );
    state = context.getKeyedStateStore().getMapState(descriptor);
}

當我將“描述符”分配給getMapState()時,我得到了NullPointerException

這是堆棧跟蹤:

java.lang.NullPointerException
at fyp.Buffer.initializeState(Iteration.java:51)
at org.apache.flink.streaming.util.functions.StreamingFunctionUtils.tryRestoreFunction(StreamingFunctionUtils.java:178)
at org.apache.flink.streaming.util.functions.StreamingFunctionUtils.restoreFunctionState(StreamingFunctionUtils.java:160)
at org.apache.flink.streaming.api.operators.AbstractUdfStreamOperator.initializeState(AbstractUdfStreamOperator.java:96)
at org.apache.flink.streaming.api.operators.AbstractStreamOperator.initializeState(AbstractStreamOperator.java:259)
at org.apache.flink.streaming.runtime.tasks.StreamTask.initializeOperators(StreamTask.java:694)
at org.apache.flink.streaming.runtime.tasks.StreamTask.initializeState(StreamTask.java:682)
at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:253)
at org.apache.flink.runtime.taskmanager.Task.run(Task.java:718)
at java.lang.Thread.run(Thread.java:748)

我猜你撞到一個NPE由於你試圖訪問的事實KeyedStateStore記錄在這里 ; 但是,由於您沒有密鑰流,因此在您的工作中沒有這樣的狀態存儲。

獲取系統鍵/值狀態的句柄。 僅當在KeyedStream上執行函數時,鍵/值狀態才可訪問。 每次訪問時,狀態都會公開該函數當前正在處理的元素的鍵的值。 每個功能可能具有多個分區狀態,並以不同的名稱尋址。

因此,如果您在未設置密鑰的上游(而您不會)實現CheckpointedFunction在此處記錄 ),則應考慮訪問操作員狀態存儲

snapshotMetadata = context.getOperatorStateStore.getUnionListState(descriptor)

操作員狀態使您可以在作業的每個並行實例中擁有一個狀態,與之相反,鍵控狀態則是每個狀態實例都取決於鍵控流產生的鍵控。

請注意,在上面的示例中,我們請求.getUnionListState ,該結果將生成您的操作員狀態的所有並行實例(格式為狀態列表)。

如果您尋找一個具體的示例,可以對此進行一下介紹:它是實現操作員狀態的操作員。

最后,如果您需要一個鍵控流,那么您可能會考慮將解決方案移近鍵控狀態Flink backend

暫無
暫無

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

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