了解Flink中的操作员之间的数据传输批次

问题描述

我仍然在努力解决flink如何在不同运营商之间“交换/转移”数据以及运营商之间的实际数据发生什么情况。

以上面的示例DAG为例: DAG of execution

  1. 将数据集转发/传输到GroupReduce运算符的所有并行实例,然后根据GroupReduce转换对数据进行归约。

  2. 所有的新数据将转发到Filter-> Map-> Map操作数,即,GroupReduce运算符的并行实例之一消耗的所有数据都将恰好传输到一个实例Filter-> Map-> Map运算符(不需要序列化/反序列化,因此该运算符可以访问GroupReduce运算符生成的数据)

  3. 全部的GroupReduces输出数据在(Filter-> Map)运算符的所有并行实例之间进行散列并均匀分布/传输(运算符之间需要序列化/反序列化)

因此,例如,如果GroupReduce运算符输出约为100MB,它将转发100MB到(Filter-> Map-> Map)操作数并散列该100MB的副本并将其传输到(Filter-> Map)实例。所以我会再增加100MB的网络流量

我很困惑为什么在GroupReduce之后和Filter Steps之前会有如此多的网络流量。在将现在减少的数据发送给后续运算符之前,最好将GroupRedcue和Filter步骤链接在一起吗?

解决方法

GroupReduce函数与使用MapReduce编程模型中的组合器相同。

部分计算可以显着提高处理器的性能 GroupReduceFunction。此技术也称为应用 合路器。实现GroupCombineFunction接口以启用 部分计算,即此GroupReduceFunction的组合器。

因此,在组合器之后,总是存在将所有上游运算符连接到所有下游运算符的混洗阶段/分区。选中this answer,以了解什么是组合器。