在Flink-Job中,目前,我有两个流,一个主要数据流是每分钟从Kafka主题更新的,另一个是流(广播流),它用于KeyedBroadcastProcessFunction的过程元素函数中,用于与主流数据进行某些计算。< / p>
现在我有一个新的要求,即添加一个与其他两个流在结构上完全不同的流。
1)如何传递必须处于Flink状态的第三流以及主要数据和广播状态数据一起进行计算?在keyedBroadcastProcess函数中?
2)我们可以有两个用于主要数据的广播流吗?
3)加入将不起作用,因为流数据是完全不同的数据,广播,并且第三数据流的更改频率不高。它类似于主数据,与主数据流一起用于计算 找不到任何解决方案,请提供帮助。请分享一些我可以参考的链接。
答案 0 :(得分:1)
Flink不提供具有三个输入的任何过程功能。
您可以将两个广播流合并在一起(在广播之前)。我很欣赏它们是非常不同的类型,但是您总是可以找到使它们共存的方法。如果没有更自然的方法来统一这两种类型,则可以使用Either。要将两种不同的类型合并为一个流,可以执行以下操作:
DataStream<String> strings = env.fromElements("one", "two", "three");
DataStream<Integer> ints = env.fromElements(1, 2, 3);
DataStream<Either<String, Integer>> stringsOnTheLeft = strings
.map(new MapFunction<String, Either<String, Integer>>() {
@Override
public Either<String, Integer> map(String s) throws Exception {
return Either.Left(s);
}
});
DataStream<Either<String, Integer>> intsOnTheRight = ints
.map(new MapFunction<Integer, Either<String, Integer>>() {
@Override
public Either<String, Integer> map(Integer i) throws Exception {
return Either.Right(i);
}
});
DataStream<Either<String, Integer>> stringsAndInts = stringsOnTheLeft.union(intsOnTheRight);
或者,如果您可以在不同的阶段将广播流应用于主流,则可以有两个KeyedBroadcastProcessFunction函数的序列,其中一个输出馈入另一个:
events
.keyBy(x -> x.foo)
.connect(broadcast1)
.process(new process1())
.keyBy(x -> x.foo)
.connect(broadcast2)
.process(new process2())
更新:
如果我们像这样合并并广播,那么任何人的更新 流将更新广播状态,或者将创建一个新条目 处于广播状态?
这完全在您的控制之下。广播状态始终是地图状态;我想您会选择一种简单易用的键来使用,因此您将拥有MapState<String, Either<T1, T2>>
之类的东西。映射状态的工作方式与任何哈希图一样:如果重用键,它将替换条目;如果引入新键,则将创建一个新条目。
... [I]如何为[广播]流提供这些密钥的通用密钥?
键不必相同,而必须是相同类型。