apache flink 运算符和键控状态如何处理并行实例?



我无法理解运算符状态如何在并行运算符实例之间分配以获得所需的结果。

下面是一个简单的例子:

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 个并行运算符(乘数(实例(运算符 1 和运算符 2(

如果运算符状态(即乘数列表(分布在这些实例中,则说: 运算符 1 有 2,3 作为乘数,运算符 2 有 4,5 作为乘数。

现在,假设我们有键控整数流作为输入。所有偶数的键是"偶数",所有奇数的键是"奇数"。

Flink 会将所有偶数发送到操作员 1,将所有奇数发送到操作员 2(反之亦然(。

这意味着所有偶数应乘以 2 和 3,所有奇数应乘以 4 和 5。

但这不是我所期望的结果。我希望所有数字都乘以 2,3,4,5,这是并行度为 1 的结果。

首先,你例子中的乘数不是 Flink 的状态。它是每个运算符 java 对象实例的本地实例。如果你想使用 Flink 的状态,我建议通读文档中的这一部分。

在您的情况下,我认为最有用的状态类型是 flink 1.5 中引入的BroadcastState(链接(,它是专门为您描述的用例实现的。

相关内容

  • 没有找到相关文章

最新更新