spark - 数据倾斜 - Partitioner源码分析
为何会出现数据倾斜, 如何处理数据倾斜问题?
有大数据处理经验的朋友应该都遇到过数据倾斜的问题,即数据分布不均匀导致任务分配不均匀,从而造成 "一个人累死,其他人闲死" 的情况。
其他人在处理完任务之后,要一直等待这个未完成的任务,从而导致总任务时间很长,或者这个任务没有做完,这个人扛不住病倒了,那么整个任务也就失败了,也就是可能引发了内存问题。所以出现内存问题的时候不必盲目调参,在清楚症状之后,对症下药,才能有更好的效果。
那么为什么数据不均匀会导致任务分配不均匀呢? 数据是如何分配给各个执行者的? 这里就要提到partitioner。
partitioner 根据分布键来将数据分配给不同的partition。
其分配算法有两种: HashPartitioner 和 RangePartitioner,在未指定的情况下,默认使用HashPartitioner。
我们通过一段reduceBykey 的案例来帮助我们理解:
val list = List(1,2,2,3,3,3,4,4,4,4,5,5,5,5,5,6,6,6,6,6,6)
val rdd = sc.parallelize(list)
val pairRdd = rdd.map((_,1))
pairRdd.reduceByKey(_+_)
我们看看reduceByKey 的源码,这里使用了defaultPartitioner
def reduceByKey(func: (V, V) &