coalease 和 repartition的区别

2018-06-08  本文已影响0人  pcqlegend

coalesce 英文翻译是联合 合并

def coalesce(numPartitions: Int, shuffle: Boolean = false)(implicit ord: Ordering[T] = null)
      : RDD[T] = withScope 

官方解释:

返回一个被reduce 成 numPartitions(入参是numPartitions) 数量 的partition的新的RDD
这将生成一个窄依赖。举个例子,如果你要将一个RDD从1000个分区转化到100个分区,并不会产生shuffle操作,100个新partition的任何一个需要当前的10个分区。
但是如果你要进行的是一个比较极端的coalesce,比如 设置numPartitions = 1,与你希望的不同,这将会导致计算发生在少数的几个节点上(比如 numPartitions = 1的话就只有一个节点)。为了避免这个情况,你可以设置参数 传入 shuffle = true,这将会增加一个shuffle的操作,这就意味着,当前的分区将会并行的计算。
注意:设置shuffle = true, 可以合并成一个数量很多的partition,比如 你有大量的分区,比如100,但是有一些分区的数据量非常大。调用 coalesce(1000, shuffle = true) 则会使用默认的hash分区器,将所有的分区分发成1000个分区。

/**
   * Return a new RDD that has exactly numPartitions partitions.
   *
   * Can increase or decrease the level of parallelism in this RDD. Internally, this uses
   * a shuffle to redistribute data.
   *
   * If you are decreasing the number of partitions in this RDD, consider using `coalesce`,
   * which can avoid performing a shuffle.
   */
  def repartition(numPartitions: Int)(implicit ord: Ordering[T] = null): RDD[T] = withScope {
    coalesce(numPartitions, shuffle = true)
  }

repartition

创建指定数量分区的RDD,可以增加或者减少这个RDD的并行度,内部就是对数据进行shuffle操作。如果你想要减少这个分区的分区数,你可以考虑使用coalesce 方法,它可以避免一个shuffle操作。

所以 repartition 就是shuffle为true的coalesce

上一篇下一篇

猜你喜欢

热点阅读