我无法理解运算符状态如何在并行运算符实例之间分布以获得所需的结果。
这是一个简单的例子:
class MultiplyNumber implements FlatMapFunction<Integer, Integer> {
// This is the operator state (this is statically defined for simplicity here in this example, but assume this can dynamic based on control stream)
List<Integer> multipliers = Arrays.asList(2,3,4,5);
void flatMap(Integer value, Collector<Integer> out){
for(Integer multiplier: multipliers){
out.collect(mutiplier*value);
}
}
}
假设我们运行的并行度 = 2,这意味着我们有 2 个并行运算符 (MultiplyNumber) 实例(Operator1 和 Operator2)
如果运算符状态(即乘数列表)分布在这些实例中,则可以说: Operator1 有 2,3 作为乘数,Operator2 有 4,5 作为乘数。
现在,假设我们有键控整数流作为输入。所有偶数的键都是“Even”,所有奇数的键都是“Odd”。
Flink 会将所有偶数发送到 Operator1,并将所有奇数发送到 Operator2(反之亦然)。
这意味着所有偶数都应乘以 2 和 3,所有奇数应乘以 4 和 5。
但这不是我所期望的结果。我希望所有数字都乘以 2,3,4,5,这是并行度为 1 时的结果。
最佳答案
首先,您示例中的乘数不是 Flink 的状态。它是每个操作符的本地java对象实例。如果你想使用 Flink 的状态我建议阅读 this文档中的部分。
就您的情况而言,我认为最有用的 State 类型是 flink 1.5 中引入的 BroadcastState
( link ),它是专门针对您描述的用例实现的。
关于apache-flink - apache flink 运算符和键控状态如何与并行实例一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50538502/