SparkRDD优化(三)之SparkRDD分区设计

RDD分区

一、coalesce:对RDD重新分区

函数定义

def coalesce(numPartitions : scala.Int, shuffle : scala.Boolean = { /* compiledcode */ })(implicit ord : scala.Ordering[T]

numPartitions:分区个数,若减少分区,直接设置新的分区数即可
shuffle:是否增加分区个数,若增加分区个数,设置shuffle = true

应用:
当将大数据集过滤处理后,分区中数据很小,可以减少分区数
当将小文件保存到外部存储系统时,将分区数设置为1,将文件保存在一个文件中
当分区数小回造成CPU的浪费,适当增加分区

二、reparation和coalesce相似,这是将shuffle默认设置为true

函数定义

def repartition(numPartitions : scala.Int)(implicit ord : scala.Ordering[T]

案例

object RDDPartition {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local[*]").setAppName("RDDPartition")
    val sc = new SparkContext(conf)

    val rdd = sc.parallelize(List("1", "2", "3", "4"), 2)
    val partitionsSize = rdd.partitions.length
    println(partitionsSize)      //2
    
    //coalesce:对RDD重新分区
    val rePartitionsSize = rdd.coalesce(1).partitions.length
    println(rePartitionsSize)     //1

    val rePartitionsSize2 = rdd.coalesce(3, true).partitions.length
    println(rePartitionsSize2)    //3
    
    //repartition 和 coalesce 相似,只是将shuffle默认设置为true
    val rePartitionsSize3 = rdd.repartition(4).partitions.length
    println(rePartitionsSize3)    //4

    sc.stop()
  }
}

在这里插入图片描述

SparkRDD分区设计

  • 1、分区大小限制为2GB
  • 2、分区太少
    a)不利于并发
    b)更容易受数据倾斜影响
    c)groupBy, reduceByKey, sortByKey等内存压力增大
  • 3、分区过多
    a)Shuffle开销越大
    b)创建任务开销越大
  • 4、经验总结
    a)每个分区大约128MB
    b)如果分区小于但接近2000,则设置为大于2000

参考:
https://blog.csdn.net/hjw199089/article/details/53471164
https://blog.csdn.net/zg_hover/article/details/73476265

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值