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

Spark部分:数据倾斜的优化【文字说明+图片】

Spark部分:数据倾斜的优化【文字说明+图片】

总之,一个是横向,一个是纵向。通过加前缀的方式想办法增加了rdd计算的次数,从而解决偏移的问题。 

Spark部分:数据倾斜的优化【文字说明+图片】