- Mapper Skew Map端倾斜
- 输入文件分片尺寸差距太大
- 开启小文件合并
- 限制单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
- GC时间占用了过多执行时间
- 应提高单Mapper内存
- GC时间占用了过多执行时间
- Mapper Time
- 过多的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;
- 过少的Mapper导致每个Map处理数据量很大
- 降低每个Map最大输入大小
set mapred.max.split.size=128000000;
- 过多的Mapper导致每个Map处理的数据量很少
- Mapper Speed
- Mapper处理速度过慢
- 降低每个Map的输入大小
set mapred.max.split.size=128000000;
- 避免全表扫描
- 只Select需要的字段
- 副表条件提前(优先在子表中完成Where过滤)
- 只取需要的分区
- Mapper处理速度过慢
- Mapper Spill
- 忽略
- Mapper Memory
- Mapper平均占用内存过高
- Mapper平均占用内存过低
- 降低Mapper默认申请内存量(可能导致不稳定)
- Reducer Skew
- 关联字段存在大量空值或分布不均衡
- 空值数据隔离不参与关联
- 空值用rand()替代后关联
- 分布不均衡值分开单独关联后再union
- 关联小表后,数据分布不均衡
- 开启小表内存Join
set hive.auto.convert.join = true;
- 使用Hive的join倾斜优化
set hive.skewjoin.key=1000000; set hive.optimize.skewjoin=true;
- 不同数据类型的字段关联,隐式转换导致部分不可转换的数据为空
- 强制转换为不丢失信息的同一格式字段类型后再关联
- insert阶段reduce分组字段分布不均衡
- 分布不均衡数据单独分开insert
- 增加分布均衡的二级分区字段
- 目标表改为全量非分区表
- 使用COUNT DISTINCT和GROUP BY造成的数据倾斜
- 存在大量空值或NULL,或者某一个值的记录特别多,可以先把该值过滤掉,在最后单独处理
- 尽量将COUNT DISTINCT修改为COUNT+GROUP BY
- 开启Hive的groupby倾斜优化
set hive.groupby.skewindata = true; set hive.groupby.mapaggr.checkinterval = 100000;
- 笛卡尔积产生大量数据且分布不均衡
- 避免笛卡尔积或用上述方式优化
- 关联字段存在大量空值或分布不均衡
- Reducer GC
- GC时间占用了过多执行时间
- 应提高单Reduce内存
- GC时间占用了过多执行时间
- Reducer Time
- Reduce运行时间过长
- 提高reduce数量
set mapreduce.job.reduces=150
- 减小reduce文件大小
set hive.exec.reducers.bytes.per.reducer=50000000;
- 只有一个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
- 避免笛卡尔积(不可避免可以尝试分批处理)
- Reduce过多,运行时间短
- 降低reduce数量
- 提高reduce文件大小
有多少个reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题
- Reduce运行时间过长
-
Reducer Memory
- Reduce平均占用内存过低
- 降低Reduce默认申请内存
- Reduce平均占用内存过高
- 提高Reduce默认申请内存
- Reduce平均占用内存过低
- Shuffle & Sort
- Reduce在Map执行完成前等待了过长时间
- 推迟Reduce的启动时间
set mapreduce.job.reduce.slowstart.completedmaps=0.95
- Reduce在Map执行完成前等待了过长时间
- Distributed Cache Limit
- 忽略
- STAGE过多
- 拆分SQL到多个任务
- 同源的数据频繁使用,多用公共中间表
- 如果没有动态分区尝试切换到Spark
- hive并行执行
set hive.exec.parallel=true; set hive.exec.parallel.thread.number=16;