spark中出现数据倾斜的原因?
前面分析过shuffle 的原理,主要就是按照key来进行values的数据的输出,拉取和聚合的。同一个key的value,肯定会分配到同一个reduce task进行处理的。为什么会出现数据倾斜呢,举个例子,假如多个key对应的values,一共是100万,但是可能某个key对应的value数量就已经到达了98万,占了绝大多数,另外两个key,可能各分配到了一万数据。可能两个一万数据的key对应的task两分钟就执行完了。而98万条数据对应的key就大概需要 2*98 分钟才能执行完,这就是数据倾斜。
数据倾斜的表现?
a: 大部分task很快的执行完,剩下一两个执行的特别慢
b: 执行到个别task到时候,直接内存溢出,程序崩掉
如何定位数据倾斜出现的位置?
a:去程序里面找用到shuffle算子的地方,groupBykey,countByKey,reduceByKey,join等等,根据业务场景分析算子上下游数据。
b:假如出现了oom,根据log中报错的代码位置去判断哪一个stage,task出问题了。
数据倾斜解决方案:
a:聚合数据源,
1.在进行shuffle之前,按照某种粒度,对key对应的value进行聚合,把多条数据聚合成一条数据,减少数据量。
2:对key放粗粒度度,增加key对数量,减少key对应的value数量
b:提高shuffle操作reduce的并行度
在调用shuffle算子函数的时候,传入一个并行度数量的参数,这样可以让每个r