Spark基础04-RDD重分区操作repartition与coalesce

1、repartition

1.1、官方解释
  • 返回一个新的RDD具有 (numPartitions) 指定的分区数,可以通过该方法进行RDD并行度(分区数)的修改
  • 如果要减少RDD分区数的话,建议使用使用coalesce方法,可以避免shuffle
    repartition源码截图
    从上可看出,repartition 底层其实是调用了coalesce 方法,且shuffle参数指定为 true
1.2、代码示例
val data: RDD[Int] = sc.parallelize(1 to 10, 5) // 指定5个分区

// 将数据转为 (分区号,数据) 格式
val data1: RDD[(Int, Int)] = data.mapPartitionsWithIndex(
  (pi, pt) => {
    pt.map(e => (pi, e))
  }
)

data1.foreach(println)
// repartition 底层调了 coalesce(, true)
println("================分割线================")

// 5 => 5 产生shuffle
// 5 => 3 产生shuffle
// 5 => 10 产生shuffle
data1.repartition(3).mapPartitionsWithIndex(
  (pi, pt) => {
    pt.map(e => (pi, e))
  }
).foreach(println)
1.3、job运行截图

repartition-DAG截图

1.4、小结
  • 无论是将增加或者减少分区数,使用repartition必然会造成shuffle
  • repartition(num) 相当于 coalesce (num,true) ,既使用 coalesce 中shuffle参数为true,必然会产生shuffle无论分区是增加或者减少

2、coalesce

1.1、官方解释
  • 返回一个新的RDD具有 (numPartitions) 指定的分区数
  • shuffle 为 false,结果会是一个窄依赖,如果把1000个分区重分区到100个分区里面,则结果每个分区都包含前面的10个分区数据,如果重分区数大于当前分区数,则保持当前分区数(通俗理解:
    • 当前分区数 < 重分区数,则当前分区数与重分区数一致,没效果;
    • 当前分区数 > 重分区数,则把当前分区数分散到重分区中,通过IO方式,不走shuffle)
  • shuffle 为 true,则效果与 repartition 一致
    coalesce源码截图
1.2、代码示例
val data: RDD[Int] = sc.parallelize(1 to 10, 5) // 指定5个分区

// 将数据转为 (分区号,数据) 格式
val data1: RDD[(Int, Int)] = data.mapPartitionsWithIndex(
  (pi, pt) => {
    pt.map(e => (pi, e))
  }
)

val repartition: RDD[(Int, Int)] = data1.coalesce(3, false)
// 5 => 3 ,false 可以执行,且不产生shuffle,有效果
// 5 => 6 ,false 可以执行,且不产生shuffle,但是没效果,分区数还是5

val res: RDD[(Int, (Int, Int))] = repartition.mapPartitionsWithIndex(
  (pi, pt) => {
    pt.map(e => (pi, e))
  }
)

data1.foreach(println)
println("=============================")
res.foreach(println)
1.3、job运行截图

coalesce-DAG截图

1.4、小结
  • 在使用 coalesce 时,shuffle参数为false时,最常见的用途是减少分区数,如:经过filter后减少分区数
  • 当shuffle参数为true时,效果与repartition一致

3、总结

  • repartition 底层其实是调用了coalesce 方法,且shuffle参数指定为 true
  • 减少分区数,推荐使用 coalesce 且不产生shuffle,代价很少
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值