Spark中分区器直接决定了RDD中分区的个数、RDD中每条数据经过Shuffle过程属于哪个分区和Reduce的个数
注意:
(1)只有Key-Value类型的RDD才有分区函数,非Key-Value类型的RDD无分区函数,但是也是有分区的
(2)每个RDD的分区ID范围:0~numPartitions-1,决定这个值是属于那个分区的。
分区方式的优劣
HashPartitioner分区弊端:
可能导致每个分区中数据量的不均匀,极端情况下会导致某些分区拥有RDD的全部数据(HashCode为负数时,为了避免小于0,spark做了以下处理)。
/* Calculates 'x' modulo 'mod', takes to consideration sign of x,
* i.e. if 'x' is negative, than 'x' % 'mod' is negative too
* so function return (x % mod) + mod in that case.
*/
def nonNegativeMod(x: Int, mod: Int): Int = {
val rawMod = x % mod
rawMod + (if (rawMod < 0) mod else 0)
}
本文介绍了Spark中分区的重要性和不同分区策略,包括HashPartitioner可能导致的数据不均匀问题和RangePartitioner的有序与均衡特性。还详细讲解了如何自定义分区器,通过继承Partitioner类并实现相关方法。最后,提供了自定义分区的使用示例。
订阅专栏 解锁全文
2588





