如何使用可查询状态客户端在flink中获取多个keyBy的状态?

时间:2018-04-11 05:09:22

标签: apache-flink flink-streaming

我正在使用Flink 1.4.2,我有一个场景,我需要使用两个键。 对于例如

KeyedStream<UsageStatistics, Tuple> keyedStream = stream.keyBy("clusterId", "ssid");
usageCounts = keyedStream.process(new CustomProcessFunction(windowSize,queryableStateName));

值描述

ValueStateDescriptor<SsidTotalUsage> descriptor = new ValueStateDescriptor(queryableStateName, SsidTotalUsage.class);
        descriptor.setQueryable(queryableStateName);

任何人都可以建议我使用可查询状态客户端获取状态,以便在flink中使用多个密钥吗?

在QueryableClient下面,单个键'clusterId'的效果很好。

kvState = queryableStateClient.getKvState(JobID.fromHexString(jobId), queryableStateName, clusterId, BasicTypeInfo.STRING_TYPE_INFO, descriptor);

多个密钥的 type_info 应该是什么?任何与此相关的建议/示例或参考都会非常有用吗?

2 个答案:

答案 0 :(得分:3)

我找到了解决方案。

我在valueStateDescription中给出了TypeHint。

在Flink工作中:

TypeInformation<SsidTotalUsage> typeInformation = TypeInformation.of(new TypeHint<SsidTotalUsage>() {});

ValueStateDescriptor<SsidTotalUsage> descriptor = new ValueStateDescriptor(queryableStateName, typeInformation);

在客户端:

ValueStateDescriptor<SsidTotalUsage> descriptor = new ValueStateDescriptor(queryableStateName, typeInformation);

我有两个键,所以我使用了 Tuple2 类并设置了我的键的值,如下所示。 注意:如果您有两个以上的密钥,那么您必须根据您的密钥选择Tuple3,Tuple4类。

 Tuple2<String, String> tuple = new Tuple2<>();
 tuple.f0 = clusterId;
 tuple.f1 = ssid;

然后我提供了TypeHint。

TypeHint<Tuple2<String, String>> typeHint = new TypeHint<Tuple2<String, String>>() {};

CompletableFuture<ValueState<SsidTotalUsage>> kvState = queryableStateClient.getKvState(JobID.fromHexString(jobId), queryableStateName, tuple, typeHint, descriptor);

在上面的代码中, getState 方法将返回 ImmutableValueState 所以我需要像下面那样得到我的pojo。

ImmutableValueState<SsidTotalUsage> state = (ImmutableValueState<SsidTotalUsage>) kvState.get();

totalUsage = state.value();

答案 1 :(得分:0)

感谢您将解决方案发布到您自己的问题上,这对其他人有帮助。 Flink文档是否遗漏了这些信息?如果是这样,请打开一个Jira问题来添加它,因为它会让更多人受益,谢谢。