1、问题背景
总所周知,spark的rdd编程中有两个算子repartition和coalesce。公开的资料上定义为,两者都是对spark分区数进行调整的算子。
repartition会经过shuffle,其实际上就是调用的coalesce(shuffle=true)。
coalesce,默认shuffle=false,不会经过shuffle。
当前仅针对coalesce算子考虑,我们看一下官方的定义:
大概意思为:如果你想要从1000个分区到100个分区,并且不经过shuffle,近乎平均分配10个父分区到1个子分区。
首先我说下我个人简单理解:不经过shuffle,就意味着coalesce算子前后都是在一个stage中的。从该stage开始到coalesce算子之前的任务的迭代执行的并行度都是1000,从coalesce算子开始到该stage结束的任务的迭代执行的并行度都是100。
2、问题及复现
但是在实际使用过程中发现,对于在一个stage中的多个算子,如果先进行map、之后再coalesce(1),该stage的输出的并行度确实为1,但是coalesce之前的map算子的并行度也被缩减为1。这样看的话,似乎和官方的定义有些冲突。
因此简单对此问题进行了复现: