【大数据】查找并优化参数设置不合理,导致产生大量小文件的Hive任务

5 篇文章 0 订阅
1 篇文章 0 订阅

背景

    公司的数据开发平台上提交了数万个定时任务,有Mapreduce,也有Spark,mapreduce业务大多是基于Hive的定时任务。(我们公司没有用oozie,数据开发平台集成了oozie的任务流功能。)定时任务是由业务方自己提交,并且自己设置相关参数的。所有经常会出现参数设置不合理,导致map数和reduce数都非常大,过程中产生大量小文件,影响了HDFS的性能。所以前段时间安排了针对任务的参数优化。

相关知识及修改建议

任务的map task设置的数目较多,会存在以下问题:
1. 对平台的YARN和HDFS产生较大的压力;
2. 对任务本身的执行效率会有较大的影响;因为MR任务,为每个Map task起一个container,container的启动
开销较大;

设置Map task数的个数的参数:
上述参数的单位是bytes;
设置的建议:
针对上面的两个参数有以下几个设置的建议供参考:
1. 将min的值设置成max的50%;因为任务在计算task的时候的算法是:min(minsize, max(maxsize,
blocksize));
2. 修改后的评判标准:map的平均时间不小于1mins;当map的平均时间小于一分钟的时候,起container的开
销对任务的影响会较大;
示例:下面的这个任务就是Map数设置的较多,同时执行时间较短;
此时应当增大上面的两个参数;从而减少map值;
调整的策略是按照线性的策略去调节:即当输入增大一倍的时候,task数减少一倍,map task的平均执行时间增加

一倍

reduce task
当reduce task设置的较多的时候的影响:
1. 对HDFS的压力很大,因为HDFS的并发发的性能不够好;
2. 对任务的执行效率的影响;因为起container需要消耗时间;
3. 对下游任务的影响;由于reduce task较多,产生较多的小文件,导致下游的执行执行较慢;
设置reduce task数的个数的参数:
设置的建议:
1. hive.exec.reducers.bytes.per.reducer和hive.exec.reducers.max这两个参数需要配合设置;
这两个参数的作用不同:计算应该起多少个reduce task的步骤:
step 1:先根据hive.exec.reducers.bytes.per.reducer设置的值,计算应该起的reduce task数目;
step 2:检查step 1 计算出来的值是否在hive.exec.reducers.max范围之内。如果在,则用step 1计算出来的值;
如果超过最大值,则采用最大值;
设置的建议:
1. 按照线性的规则去调大:hive.exec.reducers.bytes.per.reducer,即该参数调大一倍,reduce task数目减少
一倍,输出到hdfs的文件减少一倍,单个reduce task输出文件的大小增加一倍;
2. 设置hive.exec.reducers.max,根据业务评估,输出的文件不得小于30M;

2. 建议不要设置mapred.reduce.tasks
3. 当reduce数目较多的时候,建议reduce的平均时间也不要小于1mins;

4. 修改后的评判标准:每个reduce的数据不得低于30Mb;
每个reduce的输出等于:(HDFS:Numer of bytes written) / (Launched reduce tasks); 单位是bytes;

只有Map的job

hive中的map-side join,会导致job中只有Map task,此时每个map task都会将输出直接写入到HDFS中,针对这
类job的优化建议:
1. 将调节的两个参数的值设置成一样的值,这样可以按照设置的值去执行任务;因为任务在计算task的时候的算
法是:min(minsize, max(maxsize, blocksize));
2. 修改后的评判标准:map的平均时间不小于1mins;当map的平均时间小于一分钟的时候,起container的开
销对任务的影响会较大;
3. 修改后的评判标准:考虑每个map的输出到hdfs的文件的大小不得小于30M;
上面的两个标准,那个标志计算出的mapreduce.input.fileinputformat.split.maxsize和
mapreduce.input.fileinputformat.split.minsize值大作为最终的优化的值;

还有一种通过hdfs audit log 来寻找参数设置不合理的任务的方法

在standby的namenode 上 ,先从HDFS上下载audit-log

然后执行

grep "cmd=rename" namenode2-hdfs-audit.log.2017-12-18-03 | awk -F ' ' '{print $10}' | grep "/tmp/hive-" | awk -F '/' '{a[$3]+=1} END  {for(i in a) {printf "%s,%d \n",i,a[i]}}' >& top_user.log

此句是筛选出所有执行任务的用户中操作量最大的一批用户(操作量大说明map task或者 reduce task 多)

 grep "/tmp/hadoop-yarn/staging/<bi>/.staging/" namenode2-hdfs-audit.log.2017-12-18-03 |awk -F ' ' '{print $10}' | awk -F '/' '{a[$7]+=1} END  {for(i in a) {printf "%s,%d \n",i,a[i]}}' >& user.job.log

这句是找到各个用户下map和reduce task较多的job

剩下的任务就是对接依照job和对应的用户找到业务部门,让他们修改任务运行时的参数了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值