apache flink运算符和键控状态如何与并行实例一起工作?

时间:2018-05-26 01:15:11

标签: 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);
           }
     }
}

假设我们运行parallelism = 2,这意味着我们有2个并行运算符(MultiplyNumber)实例(Operator1和Operator2)

如果运算符状态(即乘数列表)在这些实例之间分配,则说: Operator1有2,3作为乘数,而Operator2有4,5作为乘数。

现在,假设我们有作为输入的键控整数流。所有偶数的关键是&#34;偶数&#34;并且所有奇数的关键是&#34;奇数&#34;。

Flink会将所有偶数发送给Operator1,将所有奇数发送给Operator2(反之亦然)。

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

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

1 个答案:

答案 0 :(得分:1)

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

在您的情况下,我认为最有用的状态类型是flink 1.5中引入的BroadcastStatelink),它是专门针对您所描述的用例实现的。