Apache flink 弗林克:平行洗牌=1

Apache flink 弗林克:平行洗牌=1,apache-flink,Apache Flink,我只在一个并行度为1的节点上运行Flink,以便将其性能与单线程应用程序进行比较。我想知道Flink是否仍然在使用Shuffle,尽管它不是并行运行的。因此,如果执行以下命令: var counts=text.flatMap{{uu.toLowerCase.split(\\W+))过滤器{{uu.nonEmpty} .map{({,1)} .groupBy(0) .sum(1) 在groupBy之前是否会使用Shuffle?有没有办法检查一下 (在交互式Scala Shell的输出中有一个Fl

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

var counts=text.flatMap{{uu.toLowerCase.split(\\W+))过滤器{{uu.nonEmpty}
.map{({,1)}
.groupBy(0)
.sum(1)
groupBy
之前是否会使用
Shuffle
?有没有办法检查一下


(在交互式
Scala Shell
的输出中有一个
FlatMap
Map
组合
,最后还有一个
Reduce
进行观察。当使用
Parallelism>1
运行时,同样适用)

Flink为操作
ds.groupBy(0).求和(1)
作业图
..->组合器->减速机
独立于实际并行性。在
组合器
减缩器
之间引入了一个散列分区器(洗牌步骤)。这对所有
并行性>1
都有意义

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


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

感谢您的解释。您正在编写“在组合器和减速机之间引入了散列分割器(洗牌步骤)。”在洗牌时Flink是否总是使用散列?元素的键用于找出在哪些机器上聚合了具有相同键的元素。为此,将计算关键元素的哈希值。Flink然后对节点数应用杂音哈希模,最终决定元素将发送到哪个节点。好的,这也是一个有用的信息,但实际上我指的是其他信息。在某些系统上,用户可以选择洗牌实现(例如,在哈希和排序之间进行选择)。Flink也允许这样做吗?还是总是使用哈希策略?因为Flink以流水线方式执行其洗牌,所以没有在洗牌之前对数据进行排序的事情。因此,它总是使用哈希策略。