Hadoop如何调优

这篇文章将为大家详细讲解有关Hadoop如何调优,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

我们提供的服务有:网站建设、成都网站设计、微信公众号开发、网站优化、网站认证、东光ssl等。为上千企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的东光网站制作公司

一 HDFS相关的调优

     关于HDFS的参数调优,第一个就是数据块的大小dfs.block.size,之前默认是64m,hadoop 2.x好像已经改为128m了,如果网络环境比较好,建议根据实际业务需求,适当的调大一些。

其他的例如设置文件的备份数目,默认是3,一般不建议更改。一份保存在datanode节点上,一份保存在同一个机架的其他节点上,另一份保存在其他的机架上,默认情况下,数据是随机分配在各个节点上的,但是可以通过设置机架感知,使得数据在节点间的网络传输减少。

配置如下:在namenode的节点配置hdfs-site.xml


  topology.script.file.name
  /path/to/RackAware.py

输入某台datanode的ip,返回该ip对应的机架。是在脚本中实现的。

#! /usr/bin/python
import sys

rack={"192.168.1,15":"rack1",
       "192.168.1.16":"rack1",
       "192.168.1.17":"rack2",
       "192.168.1.18":"rack2"}

if __name__=="__main__":
   print "/"+rack.get(sys.argv[1],"rack0"}

设置mapred.local和dfs.data.dir,这两个参数配置的值应当分布在各个磁盘的目录上。

二 mapreduce的调优

首先从map阶段说起,就是设置map的个数问题,默认只有一个map线程,设置map参数的个数是mapred.map.tasks reduce则是mapred.reduce.tasks。因为这两个参数的设置是影响到整个集群的,就是说会考虑到单台机器上的map,reduce个数。map.tasktracker.map.tasks.maxinum和map.tasktracker.reduce.tasks.maxinum这两个参数设置了一台机器上最多能同时运行的map和reduce数目。还有,就是map和reduce之间是怎么样的配比比较好呢?通过观察web界面,查看map和reduce的进度,可以发现当reduce执行到33%时候,map正好执行100%,所以我们可以在控制reduce启动的时间,不让reduce在等待。

当map,reduce个数确定了,根据业务需要,最好设置Combiner 。然后是设置map输出结果到缓存的大小,因为每一个map或者reduce都是一个task,都会启动一个jvm,,io.sort.mb就是分配map端buffer的大小,等于mb*io.sort.spill.percent。

对于map的结果,我们可以设置压缩,减少网络传输。那么建议打开mapred.compress.map.output压缩选项,并配置 mapred.map.output.compression.codec压缩编码格式,一般都会使用snappy,因为这种格式对于压缩和解压缩都相对较快

还有如果你的集群是异构的,有的机器好,有的机器性能差,建议打开推测性执行,打开mapred.reduce.tasks.speculative.execution,有利于优化进程分配,提高集群性能。

在reduce阶段,从map端拷贝数据时,可以设置最大并行拷贝线程数,这些线程会同时从不同的datanode上去map结果 设置mapred.reduce.parallel.copies

下面是一些调优的参数列表:

name说明
mapred.task.profile是否对任务进行profiling,调用java内置的profile功能,打出相关性能信息
mapred.task.profile.{maps|reduces}对几个map或reduce进行profiling。非常影响速度,建议在小数据量上尝试
mapred.job.reuse.jvm.num.tasks1表示不reuse,-1表示无限reuse,其他数值表示每个jvm reuse次数。reuse的时候,map结束时不会释放内存!
mapred.{map|reduce}.tasks.speculative.execution会对运行慢的任务起一个备份任务,看哪个先完成,kill掉后完成的备份
io.sort.spill.percent开始spill的内存比例阈值,对map和reduce都生效
mapred.job.shuffle.input.buffer.percentreduce在copy时使用的堆空间的比例
mapred.tasktracker.{map|reduce}.tasks.maximum一个Tasktracker上可同时运行的最大map、reduce任务数
mapred.reduce.copy.backoffreduce获取一份map输出数据的最大时间,单位秒。
io.compression.codecs压缩算法
dfs.block.sizehdfs上的文件block大小
mapred.reduce.slowstart.completed.maps控制reduce的启动时机。表示全部map的百分之多少完成后,才启动reduce。如果机器内存紧张,可以适当设大改参数,等大部分map结束并释放内存后才启动reduce;如果希望尽快开始shuffle,则可配合大量map数,将该值设小,以尽早启动reduce,开始copy。
io.sort.mbmap使用的缓存,影响spill的次数。
mapred.child.java.opts同时设置map和reduce的jvm参数
mapred.map.child.java.opts分开设置map的jvm参数,包括GC策略
mapred.reduce.child.java.opts分开设置reduce的jvm参数
map.sort.class对map的输出key的排序方法
mapred.output.compression.type压缩类型
mapred.min.split.size每个map的最小输入大小,该值越大,map数越少
mapred.max.split.size每个map的最大输入大小,该值约小,map数越多
mapred.reduce.parallel.copiesreduce从map结果copy数据时,每个reduce起的并行copy线程数。该值越大,io压力越大,但可能引起网络堵塞,copy效率反而降低。
io.sort.factormerge时的并行merge数,同时影响map的spill文件merge和reduce中的merge
mapred.compress.map.output指定map的输出是否压缩。有助于减小数据量,减小io压力,但压缩和解压有cpu成本,需要慎重选择压缩算法。
mapred.map.output.compression.codecmap输出的压缩算法
mapred.output.compressreduce输出是否压缩
mapred.output.compression.codec控制mapred的输出的压缩的方式
io.sort.record.percentmap中间数据的index和data在io.sort.mb中占内存的比例,默认0.05%,需要根据具体数据的特点调整:index的大小固定为16byte,需要根据data的大小调整这个比例,以使io.sort.mb的内存得到充分利用)。

关于“Hadoop如何调优”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。


标题名称:Hadoop如何调优
文章位置:http://pwwzsj.com/article/jiogcc.html