Streaming 设置和访问Flink可查询状态(NullPointerException)

Streaming 设置和访问Flink可查询状态(NullPointerException),streaming,apache-flink,Streaming,Apache Flink,我使用的是Flinkv1.4.0,我设置了两个不同的作业。第一种是管道,它使用来自卡夫卡主题的数据并将其存储到可查询状态(QS)。数据按日期键入。第二个向QS作业提交查询并处理返回的数据 这两项工作在Flinkv.1.3.2上都运行良好。但有了新的更新,一切都坏了。以下是第一个作业的部分代码: private void runPipeline()引发异常{ StreamExecutionEnvironment env=configurationEnvironment(); QueryableSt

我使用的是Flink
v1.4.0
,我设置了两个不同的作业。第一种是管道,它使用来自卡夫卡主题的数据并将其存储到可查询状态(QS)。数据按日期键入。第二个向QS作业提交查询并处理返回的数据

这两项工作在Flink
v.1.3.2
上都运行良好。但有了新的更新,一切都坏了。以下是第一个作业的部分代码:

private void runPipeline()引发异常{
StreamExecutionEnvironment env=configurationEnvironment();
QueryableStateStream dataByDate=env.addSource(sourceDataFromKafka())
.map(NewDataClass::new)
.keyBy(data.date)
.asQueryableState(“QSName”,reduceIntoSingleDataBucket());
}
以下是客户端的代码:

QueryableStateClient=newqueryablestateclient(“localhost”,6123);
//要获取的状态的状态描述符。
ValueStateDescriptor描述符=新的ValueStateDescriptor(
“名称”,
TypeInformation.of(newtypehint(){});
jobId=“xxxxxxxxxxxxxxxxxxxxxxxxxxxx”;
字符串key=“2017-01-06”;

CompletableFuture因此,事实证明,是两个因素导致了这个错误。第一个是使用错误的构造函数在客户端创建
描述符。我没有使用只接受QS名称和TypeHint作为输入的方法,而是使用另一种方法,其中提供了
keySerialiser
和默认值,如下所示:

ValueStateDescriptor=新的ValueStateDescriptor(
“名称”,
TypeInformation.of(new TypeHint(){}).createSerializer(new ExecutionConfig()),
DataBucket.emptyBucket());//或者任何可以用作默认值的内容
第二个与主机和端口值相关。端口不同于现在设置为9069的
v1.3.2
,本地主机在我的例子中也不同。您可以通过检查该行的任何任务管理器的日志来验证这两者:
启动了可查询状态代理服务器@…

最后,如果您在这里是因为希望允许可查询状态客户端代理的端口范围,我建议您在这里遵循相应的问题(FLINK-7788):

Exception in thread "main" java.lang.NullPointerException
    at org.apache.flink.api.java.typeutils.GenericTypeInfo.createSerializer(GenericTypeInfo.java:84)
    at org.apache.flink.api.common.state.StateDescriptor.initializeSerializerUnlessSet(StateDescriptor.java:253)
    at org.apache.flink.queryablestate.client.QueryableStateClient.getKvState(QueryableStateClient.java:210)
    at org.apache.flink.queryablestate.client.QueryableStateClient.getKvState(QueryableStateClient.java:174)
    at com.company.dept.query.QuerySubmitter.main(QuerySubmitter.java:37)