美文网首页
coalesce()方法和repartition()方法的区别

coalesce()方法和repartition()方法的区别

作者: 大闪电啊 | 来源:发表于2019-06-27 21:01 被阅读0次

    coalesce()方法和repartition()方法的区别

    Spark的RDD是分区的,经过lineage一系列运算之后,比如原始日志1T,filter算子过滤出1G的内容,保留原始的分区计算,不免有些浪费,可能需要手动调整partition的数量,这个时候可使用coalesce方法减少分区数目。该函数用于将RDD进行重分区,使用HashPartitioner

    def coalesce(numPartitions: Int, shuffle: Boolean = false,
                   partitionCoalescer: Option[PartitionCoalescer] = Option.empty)
                  (implicit ord: Ordering[T] = null)
    

    参数numPartitions,可以指定分区个数,在shuffle=false的情况下,numPartitions设置可能不起作用,假设之前有两个partition分布在两台机器上,在不经过shuffle的前提下是不会合并到一起的,合并的前提是同一台机器,除非指定shuffle=true。

    def repartition(numPartitions: Int)(implicit ord: Ordering[T] = null): RDD[T] = withScope {  
                    coalesce(numPartitions, shuffle = true)  
    }
    

    可以看出,repartition()方法就是coalesce()方法shuffle为true的情况。

    窄依赖、宽依赖以及stage的划分依据:

    参考:https://www.cnblogs.com/itboys/p/6673046.html

    参考: http://blog.csdn.net/u012684933/article/details/51028707

    参考: http://blog.csdn.net/dax1n/article/details/53431373

    参考: http://blog.csdn.net/qq_14950717/article/details/52871666

    repartition(numPartitions:Int)和coalesce(numPartitions:Int,shuffle:Boolean=false)
    作用:对RDD的分区进行重新划分,repartition内部调用了coalesce,参数shuffle为true

    例:RDD有N个分区,需要重新划分成M个分区

    1. N小于M
      一般情况下N个分区有数据分布不均匀的状况,利用HashPartitioner函数将数据重新分区为M个,这时需要将shuffle设置为true。
    2. N大于M且和M相差不多
      假如N是1000,M是100)那么就可以将N个分区中的若干个分区合并成一个新的分区,最终合并为M个分区,这时可以将shuff设置为false,在shuffl为false的情况下,如果M>N时,coalesce为无效的,不进行shuffle过程,父RDD和子RDD之间是窄依赖关系。
    3. N大于M且和M相差悬殊
      这时如果将shuffle设置为false,父子RDD是窄依赖关系,他们在同一个Stage中,就可能造成Spark程序的并行度不够,从而影响性能,如果在M为1的时候,为了使coalesce之前的操作有更好的并行度,可以讲shuffle设置为true。

    总结:返回一个减少到numPartitions个分区的新RDD,这会导致窄依赖,例如:你将1000个分区转换成100个分区,这个过程不会发生shuffle,相反如果10个分区转换成100个分区将会发生shuffle。然而如果你想大幅度合并分区,例如所有partition合并成一个分区,这会导致计算在少数几个集群节点上进行(言外之意:并行度不够)。为了避免这种情况,你可以将第二个shuffle参数传递一个true,这样会在重新分区过程中多一步shuffle,这意味着上游的分区可以并行运行。

    总之:如果shuff为false时,如果传入的参数大于现有的分区数目,RDD的分区数不变,也就是说不经过shuffle,是无法将RDD的partition数变多的

    相关文章

      网友评论

          本文标题:coalesce()方法和repartition()方法的区别

          本文链接:https://www.haomeiwen.com/subject/xxudcctx.html