Spark coalesce和repartition

Spark coalesce和repartition功能

2者都是重新分区
coalesce:缩减分区
repartition:扩大分区

Spark coalesce和repartition的联系与区别

  1. 一般情况下repartition是增大分区的repartition,coalesce是减少分区的
  2. repartition底层调用的就是coalesce方法,源码如下:
def repartition(numPartitions: Int)(implicit ord: Ordering[T] = null): RDD[T] = withScope {
    coalesce(numPartitions, shuffle = true)
}
  1. repartition算子默认执行Shuffle,更确切的来说repartition一定会发生shuffle;coalesce算子默认不执行Shuffle,但可以根据传入的参数来选择是否发生shuffle
  • 若使用coalesce方法,不执行Shuffle

缺点:容易产生数据倾斜

在这里插入图片描述

  • 若使用coalesce方法,执行Shuffle

缺点:速度慢

在这里插入图片描述
4. 使用filter、where等方法对数据进行频繁过滤时,就会造成大量小分区的生成,这时建议使用coalesce方法

案例演示

package com.xcu.bigdata.spark.core.pg02_rdd.pg022_rdd_transform

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 * @Desc : -coalesce缩减分区(默认是不执行shuffle,一般用于缩减分区)
 *         -repartition扩大分区(底层调用的是coalesce,默认是执行shuffle,一般用于扩大分区)
 */
object Spark_Coalesce_Repartition {
  def main(args: Array[String]): Unit = {
    //创建配置文件
    val conf: SparkConf = new SparkConf().setAppName("Spark09_Coalesce_Repartition").setMaster("local[*]")
    //创建SparkContext,该对象是提交的入口
    val sc = new SparkContext(conf)
    //创建RDD
    val rdd: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4, 5), numSlices = 3)
    //获取分区数
    println("初始分区数: " + rdd.getNumPartitions)
    //缩减分区(默认情况:不走shuffle)
    val newRDD: RDD[Int] = rdd.coalesce(numPartitions = 2)
    //缩减分区(开启shuffle)
    //val newRDD: RDD[Int] = rdd.coalesce(numPartitions = 2, shuffle = true)
    println("缩减后的分区个数: " + newRDD.getNumPartitions)

    //扩大分区(默认情况:开启shuffle)
    val newRDD1: RDD[Int] = rdd.repartition(6)
    println("扩大后的分区个数: " + newRDD1.getNumPartitions)
    //释放资源
    sc.stop()
  }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值