Flink:随机平行移动= 1

时间:2015-12-13 21:03:28

标签: apache-flink

我只在Flink的一个节点上运行Parallelism = 1,以便将其性能与单线程应用程序进行比较。我想知道Flink是否仍在使用Shuffle,尽管它不是并行运行的。如果是,例如执行以下命令:

var counts = text.flatMap { _.toLowerCase.split("\\W+") filter { _.nonEmpty } }
  .map { (_, 1) }
  .groupBy(0)
  .sum(1)

Shuffle之前是否会使用groupBy?有没有办法检查这个?

(在互动Scala Shell的输出中,有一个FlatMapMapCombine,最后一个Reduce要观察。同样适用于与Parallelism > 1一起运行。)

1 个答案:

答案 0 :(得分:2)

Flink为操作ds.groupBy(0).sum(1)生成独立于实际并行度的作业图... -> Combiner -> Reducer。在CombinerReducer之间引入了一个散列分区器(shuffle步骤)。这对所有parallelism > 1都有意义。

对于parallelism = 1,优化器理论上可以删除shuffle步骤,因为它不是必需的。但是,它实际上不应该影响程序的性能。

原因是对于parallelism = 1,所有工作都将在本地组合器中完成。这意味着组合器计算结果总和,然后仅将单个元素发送到reducer。此外,由于组合器和减速器在同一台机器上运行,因此不涉及网络通信。通过移交存储器段简单地传输数据。由于Flink还支持流式混洗,因此组合器甚至不必在将第一个结果发送到reducer之前完成。组合器和减速器都可以同时运行,从而避免了中间结果的实现。