1

我仍在苦苦思考 flink 如何在不同运营商之间“交换/传输”数据,以及运营商之间的实际数据会发生什么。

以上面的 DAG 为例: 执行的 DAG

  1. DataSet 被转发/传输到 GroupReduce Operator 的所有并行实例,Data 根据 GroupReduce 转换得到缩减。

  2. 所有新数据都被转发到 Filter->Map->Map Operand,即 GroupReduce 运算符的并行实例之一消耗的所有数据都被转移到 Filter->Map->Map 运算符的一个实例(不需要用于序列化/反序列化,因此 Operator 访问由 GroupReduce Operator 生成的数据)

  3. 所有GroupReduces 输出数据都经过哈希处理,并在 (Filter->Map) 运算符的所有并行实例之间均匀分布/传输(运算符之间需要序列化/反序列化)

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

我很困惑为什么在 GroupReduce 之后和过滤步骤之前有这么多网络流量。在将现在减少的数据发送给后续操作员之前将 GroupRedcue 和 Filter 步骤链接在一起会更好吗?

4

1 回答 1

1

GroupReduce功能与使用 MapReduce 编程模型中的组合器相同

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

因此,在组合器之后,总会有一个洗牌阶段/分区,将所有上游运营商连接到所有下游运营商。检查此答案以阐明什么是组合器。

于 2020-11-10T12:03:58.127 回答