通过Input和blocksize来决定MR任务的数量
01.产生的主要原因:上游表文件大小不均匀,且小文件居多
解决方案:
对上游合并小文件,同时调整map 个数
具体设置参数:
上游合并小文件
合并小文件
hive.merg.mapfiles=true:合并map输出
hive.merge.mapredfiles=false:合并reduce输出
hive.merge.size.per.task=256*1000*1000:合并文件的大小
hive.mergejob.maponly=true:如果支持CombineHiveInputFormat则生成只有Map的任务执行merge
hive.merge.smallfiles.avgsize=16000000:文件的平均大小小于该值时,会启动一个MR任务执行merge。
调整map数
map读取文件的大小: set dfs.block.size
map 的个数 set mapred.min.split.size
set mapred.max.split.size
02产生原因:map端聚合操作-某个值特别多
解决方案:
1.代码中 distributed by rand() 将map端分发重新按照随机值进行分发,这样map端只负责数据分发了
2.hive.map.aggr=false 关闭聚合操作放在Map阶段执行,不建议
map端聚合-- 指在group by语句之前执行的聚合操作
2.reduce端的优化
reduce端--主要对map端梳理后的key-value键值对进行聚合
set hive.exec.reducers.bytes.per.reducer
set hive.exec.reducer.max
reduce端可以直接设置任务数,如果设置了,则直接使用
set hive.exce.reduce.tasks
3.Join操作倾斜:
Join操作需要参与map和reduce的整个阶段
分为
01.每路数据值都要,且空值多-导致 (空值连接)- 将空值过滤掉或者给随机数区间
02.大小数据--启动mapjoin -会把小表自动加载到内存中,箱单与mapjoin ,没有shuffle阶段
set hive.auto.conver.join= true
set hive.mapjoin.smalltable.filesize
03.Join中有热点数据导致
对热点和非热点数据分别处理,然后再合并union
其余: 设置
set hive.optimize.skewjoin=true