7.1 Map倾斜

由于读入数据的文件大小分布不均匀,会导致有些map instance读取并且处理的数据特别多,造成map端长尾。
导致长尾的原因:

  • 大小不均匀且小文件特别多,引起长尾
  • map端聚合时文件的某个值特别多,主要是count distinct

处理方法:

  • 设置参数合并小文件
    • set odps.sql.mapper.merge.limit.size = 64
    • set odps.sql.mapper.split.size=256
  • 使用distribute by rand() 打乱map端读取数据的数据分布

    7.2 Join倾斜

    join任务将join key相同的数据分发到同一个执行instance
    三种常见的场景:

  • join的某路输入比较小,使用MapJoin避免分发引起的长尾

  • 空值导致的长尾,将空值处理成随机值,结果再过滤随机值
  • 热点值导致的长尾,将热点值和非热点值分开处理,结果union

解决方式:

  • mapjoin
  • 处理空值
  • 处理热点值
  • join负载均衡参数

    • set odps.sql.skewjoin=true/false
    • set odps.sql.skewinfo=skewed_src: (skewed_key) [(” skewed value “ )]

      7.3 Reduce倾斜

      reduce端将map端梳理好的数据按key进行聚合,即count、sum、avg等操作。产生reduce长尾的常见原因:
  • 对一个表按照维度对不同的列进行count distinct操作,造成map端数据膨胀,使下游的join和reduce出现链路上的长尾

  • map端聚合导致key值分布不均匀
  • 动态分区时小文件过多
  • 多个distinct会导致数据多次分发