Spark部分:数据倾斜的优化【文字说明+图片】
解决数据倾斜
1).数据倾斜
HDFS
HDFS集群中某些节点数据非常多,某些节点数据非常少
Hive
某张表中某个key对应非常多的数据,某些key对应少量的数据
Spark
RDD中某个partition对应数据量非常多,某些partition对应数据量非常少
2).解决数据倾斜
a).使用Hive ETL预处理数据
场景:Spark要读取的数据源头是Hive表(有数据倾斜),业务是要经常操作这张表
解决:在Hive中先对这张表聚合,Spark频繁操作的是聚合后的结果
b).过滤少数倾斜的Key
场景:业务中去掉少数倾斜的Key反而使结果更正确
解决:sample抽样过滤掉这些倾斜的Key
c).提高shuffle并行度
前提:有多个Key不同
d).双重聚合
将相同的key随机加前缀聚合一次,然后将聚合后的结果去前缀再聚合一次
e).将reduce join转换成map join
彻底避免shuffle操作,避免数据倾斜
前提:两个RDD要join或者两张表要join,有一个RDD比较小或者一张表比较小
解决:将小的广播到Executor+Transformation类操作 避免shuffle
f).采样倾斜key并分拆join操作
膨胀N倍
g).使用随机前缀和扩容RDD进行join
总之,一个是横向,一个是纵向。通过加前缀的方式想办法增加了rdd计算的次数,从而解决偏移的问题。