apache-flink - 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 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/

相关文章:

apache-flink - Apache Flink DataStream API 没有 mapPartition 转换

apache-kafka - Kafka 的 OPC-da 连接器 - 可用的解决方案

apache-flink - 如何在 Flink Standalone 中查看日志或 Sysout

java - 在 Apache Flink 中从 SQL 数据库读取 DataSet 时找不到 JDBC 驱动程序

apache-flink - 以下几种在 Apache Flink 中进行字数统计的方法有什么区别?

configuration - Yarn可以动态分配资源给Flink吗?

apache-flink - Flink - 用于一系列 API 调用的异步 IO 运算符

hadoop - 远程滚动窗口聚合——时间序列 kudu vs influxdb vs opentsdb

java - Cassandra Pojo Sink Flink 中的动态表名

kubernetes - Apache Flink-作业部署期间重复的消息处理,以ActiveMQ作为源