数据倾斜的优化

 

 

 

数据倾斜产生的原因

数据倾斜就是分布式计算过程中,数据分配不均匀,导致最终任务花费的时间很长或失败。不管是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同样的效果

posted @ 2019-12-31 13:33  曲水修竹  阅读(206)  评论(0编辑  收藏  举报