• Mapper Skew Map端倾斜
    1. 输入文件分片尺寸差距太大
      • 开启小文件合并
      • 限制单Map最大最小输入
      set mapred.max.split.size=32000000; 
      set mapred.min.split.size.per.node=16000000; 
      set mapred.min.split.size.per.rack=16000000; 
      set mapreduce.input.fileinputformat.split.minsize = 16000000;
      set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; 
      
  • Mapper GC
    1. GC时间占用了过多执行时间
      • 应提高单Mapper内存
  • Mapper Time
    1. 过多的Mapper导致每个Map处理的数据量很少
      • 开启小文件合并
      • 提高单Mapper输入的最小大小
      set mapred.max.split.size=1024000000; 
      set mapred.min.split.size.per.node=1024000000; 
      set mapred.min.split.size.per.rack=1024000000; 
      set mapreduce.input.fileinputformat.split.minsize = 1024000000;
      set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; 
      
    2. 过少的Mapper导致每个Map处理数据量很大
      • 降低每个Map最大输入大小
      set mapred.max.split.size=128000000; 
      
  • Mapper Speed
    1. Mapper处理速度过慢
      • 降低每个Map的输入大小
      set mapred.max.split.size=128000000; 
      
    2. 避免全表扫描
      • 只Select需要的字段
      • 副表条件提前(优先在子表中完成Where过滤)
      • 只取需要的分区
  • Mapper Spill
    • 忽略
  • Mapper Memory
    1. Mapper平均占用内存过高
    2. Mapper平均占用内存过低
      • 降低Mapper默认申请内存量(可能导致不稳定
  • Reducer Skew
    1. 关联字段存在大量空值或分布不均衡
      • 空值数据隔离不参与关联
      • 空值用rand()替代后关联
      • 分布不均衡值分开单独关联后再union
    2. 关联小表后,数据分布不均衡
      • 开启小表内存Join
      set hive.auto.convert.join = true;
      
      • 使用Hive的join倾斜优化
      set hive.skewjoin.key=1000000; 
      set hive.optimize.skewjoin=true;
      
    3. 不同数据类型的字段关联,隐式转换导致部分不可转换的数据为空
      • 强制转换为不丢失信息的同一格式字段类型后再关联
    4. insert阶段reduce分组字段分布不均衡
      • 分布不均衡数据单独分开insert
      • 增加分布均衡的二级分区字段
      • 目标表改为全量非分区表
    5. 使用COUNT DISTINCT和GROUP BY造成的数据倾斜
      • 存在大量空值或NULL,或者某一个值的记录特别多,可以先把该值过滤掉,在最后单独处理
      • 尽量将COUNT DISTINCT修改为COUNT+GROUP BY
      • 开启Hive的groupby倾斜优化
      set hive.groupby.skewindata = true;
      set hive.groupby.mapaggr.checkinterval = 100000;
      
    6. 笛卡尔积产生大量数据且分布不均衡
      • 避免笛卡尔积或用上述方式优化
  • Reducer GC
    1. GC时间占用了过多执行时间
      • 应提高单Reduce内存
  • Reducer Time
    1. Reduce运行时间过长
      • 提高reduce数量
      set mapreduce.job.reduces=150
      
      • 减小reduce文件大小
      set hive.exec.reducers.bytes.per.reducer=50000000;
      
    2. 只有一个Reduce
      • 使用Group By替换全局统计
      select count(1) from popt_tbaccountcopy_mes where pt = '${biz_date}';
      

      修改为

      select pt,count(1) from popt_tbaccountcopy_mes where pt = '${biz_date}' group by pt;
      
      • 尽量在展示时进行Order By
      • 避免笛卡尔积(不可避免可以尝试分批处理)
    3. Reduce过多,运行时间短
      • 降低reduce数量
      • 提高reduce文件大小

    有多少个reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题

  • Reducer Memory

    1. Reduce平均占用内存过低
      • 降低Reduce默认申请内存
    2. Reduce平均占用内存过高
      • 提高Reduce默认申请内存
  • Shuffle & Sort
    1. Reduce在Map执行完成前等待了过长时间
      • 推迟Reduce的启动时间
      set mapreduce.job.reduce.slowstart.completedmaps=0.95
      
  • Distributed Cache Limit
    • 忽略
  • STAGE过多
    • 拆分SQL到多个任务
    • 同源的数据频繁使用,多用公共中间表
    • 如果没有动态分区尝试切换到Spark
    • hive并行执行
    set hive.exec.parallel=true; 
    set hive.exec.parallel.thread.number=16;