Apache flink ApacheFlink操作符和键控状态如何处理并行实例?

Apache flink ApacheFlink操作符和键控状态如何处理并行实例?,apache-flink,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 ba

我很难理解如何在并行操作符实例之间分配操作符状态以获得所需的结果

下面是一个简单的例子:

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);
           }
     }
}
类MultiplyNumber实现FlatMapFunction{
//这是运算符状态(在本例中,为了简单起见,静态定义了该状态,但假设该状态可以基于控制流动态)
列表乘数=数组.asList(2,3,4,5);
void flatMap(整数值,收集器输出){
对于(整数乘数:乘数){
out.COLLET(多路复用器*值);
}
}
}
假设我们以parallelism=2运行,这意味着我们有两个并行运算符(MultiplyNumber)实例(运算符1和运算符2)

如果运算符状态(即乘数列表)分布在这些实例中,则表示: 运算符1将2,3作为乘法器,运算符2将4,5作为乘法器

现在,假设我们对作为输入的整数流进行了键控。所有偶数的键为“偶数”,所有奇数的键为“奇数”

Flink将所有偶数发送给运算符1,所有奇数发送给运算符2(反之亦然)

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


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

首先,示例中的乘数不是Flink的状态。它是每个操作符java对象实例的本地对象。若你们想使用弗林克的状态,我建议你们通读文档中的部分


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

我知道它不是上面代码中所示的flink状态,因为我省略了ListCheckpointed及其方法(snapshotState和restoreState)为了简单起见。我同意BroadcastState是这个场景的正确选择。在Flink 1.4之前,如果我让Flink程序以不同的并行度运行,我会得到不同的结果,这对我来说似乎很奇怪。我认为,增加平行性不应该有任何功能性的影响,而只是在整个过程中增加。