1. 介绍
首先, repartition 是 coalesce shuffle为True的实现。
两者使用的场景,
首先,repartition 的shuffle比较慢,coalesce虽然不需要shuffle,但是,指定coalesce保留的partition数目后,只有相应数目的executor-cores 进行合并,其他的核会进行空计算,导致,机器利用效率比较低。
因此,如果需要保留的partition还是比较大,但同时比之前的partition小的,可以考虑coalesce,效率应该会高点。
如果保留的partition的比较小,如1,考虑repartition。
总而言之,coalesce慎用。
使用情景 假设RDD有N个分区,需要重新划分成M个分区:
N < M:
一般情况下N个分区有数据分布不均匀的状况,利用HashPartitioner函数将数据重新分区为M个,这时需要将shuffle设置为true。因为重分区前后相当于宽依赖,会发生shuffle过程,此时可以使用coalesce(shuffle=true),或者直接使用repartition()。如果N > M并且N和M相差不多(假如N是1000,M是100):
那么就可以将N个分区中的若干个分区合并成一个新的分区,最终合并为M个分区,这是前后是窄依赖关系,可以使用coalesce(shuffle=false)。如果 N> M并且两者相差悬殊:
这时如果将shuffle设置为false,父子RDD是窄依赖关系,他们同处在一个Stage中,就可能造成spark程序的并行度不够,从而影响性能,如果在M为1的时候,为了使coalesce之前的操作有更好的并行度,可以将shuffle设置为true。
rdd = sc.parallelize([{
'a':1,'b':3}, {
'a':3}])
rdd.coalesce(1).collect()
rdd.repartition(1).collect()
参考:
- spark 分区 partition的理解:;