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