为什么在Apache Flink中使用initializeState()时会出现NullPointerException?

时间:2018-03-18 16:02:48

标签: 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);
}

当我将“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)

1 个答案:

答案 0 :(得分:2)

由于您尝试访问记录KeyedStateStore hereCheckpointedFunction,我认为您正在进入NPE。但是,既然你没有键控流,那么你的工作就没有这样的状态存储。

  

获取系统键/值状态的句柄。只有在KeyedStream上执行该函数时,才能访问键/值状态。在每次访问时,状态都会公开函数当前处理的元素的键值。每个函数可能有多个分区状态,使用不同的名称进行寻址。

因此,如果您在未加密的上游实施snapshotMetadata = context.getOperatorStateStore.getUnionListState(descriptor) (记录here)(并且您赢了),您应该考虑访问运营商状态商店

.getUnionListState

operator state允许您为每个并行的作业实例设置一个状态,相反于每个状态实例依赖于键控流生成的键的键控状态。

请注意,在上面的示例中,我们请求add_custom_command将导致运算符状态的所有并行实例(格式化为状态列表)。

如果你找一个具体的例子,你可以给这个source一个镜头:它是一个实现运营商状态的运营商。

最后,如果您需要密钥流,那么您可能会考虑将解决方案移近keyed state Flink backend