概述
coalesce与repartition都是RDD的分区进行重新划分,repartition只是coalesce接口中shuffle为true的简易实现;
当spark程序中,存在过多的小任务的时候,可以通过 RDD.coalesce方法,收缩合并分区,减少分区的个数,减小任务调度成本,避免Shuffle导致,这比使用RDD.repartition效率提高不少。
源码解析
coalesce源码
/**
* 返回一个新的RDD,它将分区个数减少到“numPartitions”个分区。
* 这是一个窄依赖操作;
* 如果从1000个分区合并成100各分区,将不会有Shuffle操作,100个新分区中的每一个将占据当前分区的10个。
* 如果要求更多的分区个数,将保持为当前的分区个数。
*
* 但是,当我们进行一个剧烈的合并,设置numPartitions = 1
* 这可能导致你的计算比你想要的节点少,当numPartitions = 1时,只会在一个节点上合并;
* 为了避免这种情况的发生,可以设置shuffle = true,这样将会添加一个shuffle操作,
* 意味着当前的上游partitions将并行执行,无论当前的分区是几个
*
* @note
* 当shuffle = true,实际上,你可以合并到更多的分区。
* 如果您有少量的分区,比如100个,可能有几个分区异常大,这个时候这种方法很有用。
* 调用 coalesce(1000,shuffle = true) 将会生成1000个分区,数据分布使用散列分区(hash partitioner)。
* 可选分区合并器必须是可序列化的。
*/
def coalesce(numPartitions: Int, shuffle: Boolean = false,
partitionCoalescer: Option[