繁体   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