我正在使用Flink v1.4.0
,我已经设置了两个不同的工作。第一个是使用来自Kafka主题的数据并将它们存储到可查询状态(QS)的管道。数据按日期键入。第二个向QS作业提交查询并处理返回的数据。
这两项工作都与Flink v.1.3.2
合作得很好。但随着新的更新,一切都破裂了。以下是第一份工作代码的一部分:
private void runPipeline() throws Exception {
StreamExecutionEnvironment env = configurationEnvironment();
QueryableStateStream<String, DataBucket> dataByDate = env.addSource(sourceDataFromKafka())
.map(NewDataClass::new)
.keyBy(data.date)
.asQueryableState("QSName", reduceIntoSingleDataBucket());
}
以下是客户端的代码:
QueryableStateClient client = new QueryableStateClient("localhost", 6123);
// the state descriptor of the state to be fetched.
ValueStateDescriptor<DataBucket> descriptor = new ValueStateDescriptor<>(
"QSName",
TypeInformation.of(new TypeHint<DataBucket>() {}));
jobId = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
String key = "2017-01-06";
CompletableFuture<ValueState<DataBucket> resultFuture = client.getKvState(
jobId,
"QSName",
key,
BasicTypeInfo.STRING_TYPE_INFO,
descriptor);
try {
ValueState<DataBucket> valueState = resultFuture.get();
DataBucket bucket = valueState.value();
System.out.println(bucket.getLabel());
} catch (IOException | InterruptionException | ExecutionException e) {
throw new RunTimeException("Unable to query bucket key: " + key , e);
}
我按照以下链接按照说明操作: https://ci.apache.org/projects/flink/flink-docs-release-1.4/dev/stream/state/queryable_state.html
通过将Flink发行版的flink-queryable-state-runtime_2.11-1.4.0.jar
文件夹中的opt/
添加到lib/
文件夹并确保在任务管理器中运行,确保在我的Flink群集上启用可查询状态
我一直收到以下错误:
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)
知道发生了什么?我认为我的要求根本没有达到QS ......真的不知道我是否以及如何改变任何东西。谢谢。
答案 0 :(得分:2)
因此,事实证明,导致此错误的是两件事。第一个是使用错误的构造函数在客户端创建descriptor
。我不得不使用仅作为输入QS和TypeHint的名称的那个,而是使用另一个,其中keySerialiser
以及默认值如下所示:
ValueStateDescriptor<DataBucket> descriptor = new ValueStateDescriptor<>(
"QSName",
TypeInformation.of(new TypeHint<DataBucket>() {}).createSerializer(new ExecutionConfig()),
DataBucket.emptyBucket()); // or anything that can be used as a default value
第二个与主机和端口值相关。端口与v1.3.2
现在设置为9069不同,localhost在我的情况下也不同。您可以通过检查该行的任何任务管理器的日志来验证两者:
Started the Queryable State Proxy Server @ ...
。
最后,如果您在这里是因为您希望允许可查询状态客户端代理的端口范围,我建议您在此处遵循相应的问题(FLINK-7788):https://issues.apache.org/jira/browse/FLINK-7788。