数据倾斜的优化
数据倾斜产生的原因
数据倾斜就是分布式计算过程中,数据分配不均匀,导致最终任务花费的时间很长或失败。不管是hive还是spark, 数据倾斜基本都发生在执行join count distinct、group by等会触发Shuffle操作时,如果key值分布过于集中,相同key的值就会被拉到一个节点上,容易发生单点计算问题,导致数据倾斜。
数据倾斜导致的问题:
Spark
Driver和Executor OOM,Executor lost 、task failed,Shuffle报错,某个stage的有几个task跑得比大部分task都慢很多。
hive:
group by和join on耗时特别长,一个或多个Reduce卡住,卡在99.99%,任务一直不能结束。container各种报错、OOM, 任务被kill等。
优化办法
想要彻底解决数据倾斜几无可能,只能尽量减少数据倾斜的影响,以Spark为例
-
key分布不均匀:局部聚合+全局聚合,先给每个key都打上一个100内随机数,执行reduceByKey等聚合操作,进行局部聚合,然后将各个key的前缀给去掉,再次进行全局聚合操作。
-
空值多:需要jion的字段有很多null,可以提前将空值赋值随机数
-
jion时少数key造成倾斜:通过sample采样,把两边的rdd/表找出倾斜的key过滤出来打上随机前缀先进行jion,其余的key再进行join,最后uion得到结果
-
增加Shuffle并行度
-
某个rdd、表数据量小的话,可以广播小RDD全量数据+map算子来实现与join同样的效果