Spark出现数据倾斜问题如何解决?

提问者:帅平 问题分类:面试刷题
Spark出现数据倾斜问题如何解决?
7 个回答
披起头发是娇弱
披起头发是娇弱
如果场景是:
RDD中有大量key导致倾斜。

解决办法如下:
查看RDD/Hive表中的数据分布情况,找到那个造成数据倾斜的RDD/Hive表,比如有多个key都对应了超过1万条数据。然后将该RDD的每条数据都打上一个n以内的随机前缀。同时对另外一个正常的RDD进行扩容,将每条数据都扩容成n条数据,扩容出来的每条数据都依次打上一个0~n的前缀。
发布于:6个月前 (11-20) IP属地:四川省
我怕时间不够
我怕时间不够
如果场景是:
两个较大的RDD/Hive表进行join时,且一个RDD/Hive表中少数key数据量过大,另一个RDD/Hive表的key分布较均匀(RDD中两者之一有一个更倾斜)

解决办法如下:
对join导致的倾斜是因为某几个key,可将原本RDD中的倾斜key拆分出原RDD得到新RDD,并以加随机前缀的方式打散n份做join,将倾斜key对应的大量数据分摊到更多task上来规避倾斜。
发布于:6个月前 (11-20) IP属地:四川省
别活的像别人
别活的像别人
如果场景是:
在对RDD使用join类操作,或者是在Spark SQL中使用join语句时,而且join操作中的一个RDD或表的数据量比较小

那么可以试试这个方法:
使用Broadcast变量与map类算子实现join操作,进而完全规避掉shuffle类的操作,彻底避免数据倾斜的发生和出现。
发布于:6个月前 (11-20) IP属地:四川省
候你多时
候你多时
如果场景是:
对RDD执行reduceByKey等聚合类shuffle算子或者在Spark SQL中使用group by语句进行分组聚

那么可以试试这个方法:
预聚合:加盐局部聚合,在原来的 key 上加随机的前缀或者后缀。
聚合:去盐全局聚合,删除预聚合添加的前缀或者后缀,然后进行聚合统计。
发布于:6个月前 (11-20) IP属地:四川省
最后一丝温柔
最后一丝温柔
增加shuffle read task的数量,可以让原本分配给一个task的多个key分配给多个task,从而让每个task处理比原来更少的数据。
发布于:6个月前 (11-20) IP属地:四川省
风迎面吹、泪却逆着飞
风迎面吹、泪却逆着飞
如果场景是:
如果发现导致倾斜的key就少数几个,而且对计算本身的影响并不大的话,比如99%的key就对应10条数据,但是只有一个key对应了100万数据,从而导致了数据倾斜。

那么可以试试这个方法:
如果我们判断那少数几个数据量特别多的key,对作业的执行和计算结果不是特别重要的话,那么干脆就直接过滤掉那少数几个key。
发布于:6个月前 (11-20) IP属地:四川省
旧梦难醒
旧梦难醒
如果场景是:
导致数据倾斜的是Hive表。如果该Hive表中的数据本身很不均匀(比如某个key对应了100万数据,其他key才对应了10条数据),而且业务场景需要频繁使用Spark对Hive表执行某个分析操作。

那么可以试试这个方法:
通过Hive来进行数据预处理(即通过Hive ETL预先对数据按照key进行聚合,或者是预先和其他表进行join),然后在Spark作业中针对的数据源就不是原来的Hive表了,而是预处理后的Hive表。此时由于数据已经预先进行过聚合或join操作了,那么在Spark作业中也就不需要使用原先的shuffle类算子执行这类操作了。
发布于:6个月前 (11-20) IP属地:四川省
我来回答