声明:本章节摘自他人文章,链接为https://blog.csdn.net/dmy1115143060/article/details/82620715,尊重他人权益就是尊重自己。
1、RangePartitioner原理简介
Spark引入RangePartitioner的目的是为了解决HashPartitioner所带来的分区倾斜问题,也即分区中包含的数据量不均衡问题。HashPartitioner采用哈希的方式将同一类型的Key分配到同一个Partition中,因此当某一或某几种类型数据量较多时,就会造成若干Partition中包含的数据过大问题,而在Job执行过程中,一个Partition对应一个Task,此时就会使得某几个Task运行过慢。RangePartitioner基于抽样的思想来对数据进行分区。下图简单描述了RangePartitioner的数据分区过程。
![41957a2fff77b271d7e5b45157a600a5.png](https://i-blog.csdnimg.cn/blog_migrate/a4693c27c663350699636c978e30b019.jpeg)
2、RangePartitioner源码详解
① 确定采样数据的规模:RangePartitioner默认对生成的子RDD中的每个Partition采集20条数据,样本数据最大为1e6条。
// 总共需要采集的样本数据个数,其中partitions代表最终子RDD中包含的Partition个数val sampleSize = math.min(20.0 * partitions, 1e6)
② 确定父RDD中每个Partiti