我在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);
}
当我将“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)
答案 0 :(得分:2)
由于您尝试访问记录KeyedStateStore
here的CheckpointedFunction
,我认为您正在进入NPE。但是,既然你没有键控流,那么你的工作就没有这样的状态存储。
获取系统键/值状态的句柄。只有在KeyedStream上执行该函数时,才能访问键/值状态。在每次访问时,状态都会公开函数当前处理的元素的键值。每个函数可能有多个分区状态,使用不同的名称进行寻址。
因此,如果您在未加密的上游实施snapshotMetadata = context.getOperatorStateStore.getUnionListState(descriptor)
(记录here)(并且您赢了),您应该考虑访问运营商状态商店
.getUnionListState
operator state允许您为每个并行的作业实例设置一个状态,相反于每个状态实例依赖于键控流生成的键的键控状态。
请注意,在上面的示例中,我们请求add_custom_command
将导致运算符状态的所有并行实例(格式化为状态列表)。
如果你找一个具体的例子,你可以给这个source一个镜头:它是一个实现运营商状态的运营商。
最后,如果您需要密钥流,那么您可能会考虑将解决方案移近keyed state Flink backend。