Hadoop优化总结

经过一年多对hadoop的学习和使用对hadoop的优化做了一下总结,如下:

1.开启带外心跳
带外心跳不同于常规心跳(集群规模小于300,1.x以后的时间间隔为0.3秒),他是任务运行结束或者任务运行失败时触发的,能够在出现空闲资源时第一时间通知JobTracker,
以便它能够迅速为空闲资源分配新的任务。
<property>
<name>mapreduce.tasktracker.outofband.heartbeat</name>
<value>true</value>
</property>
2. 对shuffle进行优化配置
2.1 MapTask的输出结果和元数据在内存(环形缓冲区)中所占的buffer总大小。默认为100M,对于大集群,可设为200M。
当buffer达到一定阈值,会启动一个后台线程来对buffer的内容进行排序,然后写入本地磁盘(一个spill文件)。
<property>
<name>io.sort.mb</name>
<value>200</value>
</property>

2.2这个值就是上述buffer的阈值,默认是0.8,即80%,当buffer中的数据达到这个阈值,后台线程会起来对buffer中已有的数据进行排序,然后写入磁盘。
<property>
<name>io.sort.spill.percent</name>
<value>0.8</value>
</property>

2.3元数据的内存百分比,默认是0.05。这个需要根据应用程序进行调整。
<property>
<name>io.sort.record</name>
<value>0.05</value>
</property>
2.4.recude将map结果下载到本地时,亦需要merge,如果reduce的瓶颈在于I/O,可尝试调高增加merge的并发吞吐,提高reduce性能
<property>
<name>io.sort.factor</name>
<value>10</value>
</property>
2.5选取合适的压缩算法
MapTask会输出大量的中间数据,如果中间数据使用压缩存储,将大大提升系统I/O性能,1.x以后的版本可以使用谷歌开源的数据压缩库snappy,
很好的平衡了压缩比和压缩效率。推荐使用snappy,LZO压缩,Intel内部测试表明,相比未压缩,使用LZO压缩的TeraSort作业运行时间减少60%,
且明显快于Zlib压缩。
<property>
<!--是否要压缩输出结果-->
<name>mapred.compress.map.output</name>
<value>true</value>
</property>
<property>
<!--采用的编码、解码器-->
<name>mapred.map.output.compression.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
3.如果一个任务作业并行执行的任务非常多,这些任务的输入文件将会造成瓶颈,防止多个任务并行读取一个文件内容造成的瓶颈,用户可以根据需要增加输入
  副本数。
<property>
<name>dfs.replication</name>
<value>5</value>
</property>
4.适当打开jvm的重用功能
对于执行时间较短的任务,jvm的启动和关闭将占用很大比例的时间
<property>
<!--默认是1,-1表示jvm最多执行的Task不受限制-->
<name>mapreduce.job.jvm.num.tasks</name>
<value>1</value>
</property>
5.设置任务超时时间
一个任务可能因为某种原因阻塞了,这会拖慢整个作业的执行进度,甚至可能导致整个作业无法运行结束,通过调整超市时间,使TaskTracker能够尽快杀死
阻塞任务,启动新的节点重新执行
<property>
<!--默认是10分钟,单位是毫秒-->
<name>mapred.task.timeout</name>
<value>60000</value>
</property>
6.合理控制ReduceTask的启动时机
 对于处理超大数据文件,map任务比较多的情况可以采用这种方式提高执行效率
<property>
<!--默认情况下MapTask完成数目达到5%时开启ReduceTask-->
<name>mapred.reduce.slowstart,completed.maps</name>
<value>0.05</value>
</property>
7.跳过坏记录
跳过坏记录 看具体参数说明,=号后面是默认值
  mapred.skip.attempts.to.start.skipping=2 当任务失败次数达到该值时,才会进入到skip mode,即启用跳过坏记录gongnneg
  mapred.skip.map.max,skip.records=0 用户可通过该参数设置最多运行跳过的记录数目
  mapred.skip.reduce.max.skip.groups=0 用户可通过设置该参数设置Reduce Task最多允许跳过的记录数目
  mapred.skip.out.dir =${mapred.output.dir}/logs/ 检测出得坏记录存放到目录里面(一般为HDFS路径),hadoop将坏记录保存起来以便于用户调试和跟踪
8.配置HTTP线程数.  
在shuffle阶段,reduce task 通过http请求从各个tasktracker上读取map task中间结果,而每个tasktracker通过jetty server处理这些http请求,
所以可以适当配置调整jetty server的工作线程数,配置参数是 tasktracker.http.thread | mapreduce.tasktracker.http.threads  (默认是40)
9.配置RPC Handler的数量,jobracker需要并行处理来自各个tasktracker的RPC请求,我们可以根据集群规模和服务器并发处理的情况调整RPC Handler的数目,
以使jobtracker的服务能力最佳。
  <property>
<!--默认是10-->
<name>mapred.job.tracker.handler.count</name>
<value>0.05</value>
</property>
<property>
<!--默认是10-->
<name>mapreduce.jobtracker.handler.count</name>
<value>10</value>
</property>
10.任一个map任务可能包含一个或者多个reduce所需要数据,故一个map任务完成后,相应的reduce就会立即启动线程下载
自己所需要的数据。调大这个参数比较适合map任务比较多且完成时间比较短的Job。
<property>
<!--默认是5-->
<name>mapred.reduce.parellel.copies</name>
<value>5</value>
</property>
11.reduce端从map端下载数据也有可能由于网络故障,map端机器故障而失败。那么reduce下载线程肯定不会无限等待,当等待时间
超过mapred.reduce.copy.backoff时,便放弃,尝试从其他地方下载。需注意:在网络情况比较差的环境,我们需要调大这个参数,
避免reduce下载线程被误判为失败。
<property>
<!--默认是300-->
<name>mapred.reduce.copy.backoff</name>
<value>300</value>
</property>
12.reduce从map下载的数据不会立刻就写到Disk中,而是先缓存在内存中,mapred.job.shuffle.input.buffer.percent
指定内存的多少比例用于缓存数据,内存大小可通过mapred.child.java.opts来设置。和map类似,buffer不是等到写满才往磁盘中写,也是到达阈值就写,
阈值由mapred.job,shuffle.merge.percent来指定。若Reduce下载速度很快,容易内存溢出,适当增大这个参数对增加reduce性能有些帮助。
mapred.job.shuffle.input.buffer.percent(0.7)


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值