Partitioner.scala,
Spark提供HashPartitioner和RangePartitioner
前者通过key.hashcode%partitions决定分区,弊端就是hashcode不确定可能导致分配不均匀。
RangePartitioner使一定范围的key进入一个分区,i分区比i+1分区key要小,分区内部没有按key排序。
一定范围根据水桶抽样决定weight。
两个分区操作默认partitioner确定方法:
如果父分区存在的有效的(存在partitioner的RDD分区数与父RDD最大的分区数相差在一个数据级内)partitioner或者partitioner大于默认分区数(配置了spark.default.parallelism或者父RDD最多的分区数),则使用父RDD 具有partitioner并且partitions最多的partitioner,否则使用HashPartitioner
// If the existing max partitioner is an eligible one, or its partitions number is larger
// than the default number of partitions, use the existing partitioner.
if (hasMaxPartitioner.nonEmpty && (isEligiblePartitioner(hasMaxPartitioner.get, rdds) ||
defaultNumPartitions < hasMaxPartitioner.get.getNumPartitions)) {
hasMaxPartitioner.get.partitioner.get
} else {
new HashPartitioner(defaultNumPartitions)
}
网友评论