hadoop参数调优

来源:互联网 发布:java 泛型 t.class 编辑:程序博客网 时间:2024/06/06 18:03
hadoop优化相关:
1:对操作系统进行参数调优
(1):打开文件描述符和网络连接参数上限(具体操作内容:使用ulimit命令讲允许同时打开的文件描述符数据上限增大至一个合适的值,同时调整内核参数net.core.somaxconn)
(2):关闭swap分区(具体操作内容是/etc/stsctl.conf中得vm.vm.swappiness参数)
(3):设置合理的预读取缓冲区大小(具体操作内容:使用linux命令blockdev设置预读取缓冲区的大小)
(4):文件系统的选择和配置
2:JVM参数的优化
3:通过hadoop的参数进行调优
(1):设置合理的槽位数目(具体配置 mapred.tasktracker.map.tasks.maximum | mapred.tasktracker.reduce.tasks.maximum | 
     mapreduce.tasktracker.map.tasks.maximum | mapreduce.tasktracker.reduce.tasks.maximum)
(2):调整心跳间隔,对于300台以下的集群 可以把心跳设置成300毫秒(默认是3秒),mapreduce.jobtracker.hearbeat.interval.min | mapred.hearbeats.in.second | mapreduce.jobtracker.heartbeats.scaling.factor
(3):启用外心跳,为了减少任务分配延迟(比如我们的任务心跳设置为10秒钟,当有一个任务挂掉了之后,他就不能马上通知jobtracker),
所以hadoop引入了外心跳,外心跳是任务运行结束或者任务运行失败的时候触发的,能够在出现空闲资源时第一时间通知jobtracker,以便他能够迅速为空闲资源分配新的任务
外心跳的配置参数是 mapreduce.tasktracker.outofband.hearbeat
   (4):磁盘快的配置. map task会把中间结果放到本地磁盘中,所以对于I/O密集的任务来说这部分数据会对本地磁盘造成很大的压力,我们可以配置多块可用磁盘,hadoop将采用轮训的方式将不同的maptask的中间结果写到磁盘上
                    maptask中间结果的配置参数是mapred.local.dir | mapreduce.cluster.local.dir
   (5):配置RPC Handler的数量,jobracker需要冰法处理来自各个tasktracker的RPC请求,我们可以根据集群规模和服务器并发处理的情况调整RPC Handler的数目,以使jobtracker的服务能力最佳
    配置参数是 mapred.job.tracker.handler.count | mapreduce.jobtracker.handler.count  (默认是10)
   (6):配置HTTP线程数.  在shuffle阶段,reduce task 通过http请求从各个tasktracker上读取map task中间结果,而每个tasktracker通过jetty server处理这些http请求,所以可以适当配置调整jetty server的工作线程数
    配置参数是 tasktracker.http.thread | mapreduce.tasktracker.http.threads  (默认是40)
   (7):如果我们在运行作业的过程中发现某些机器被频繁地添加到黑名单里面,我们可以把此功能关闭
   (8):使用合理调度器
   (9):使用合适的压缩算法,在hadoop里面支持的压缩格式是: gzip,zip,bzip2,LZO,Snappy,LZO和Snappy的呀搜比和压缩效率都很优秀,Snappy是谷歌的开源数据压缩哭,他已经内置在hadoop1.0之后的版本,LZO得自己去编译
   (10):开启预读机制. 预读机制可以有效提高磁盘I/O的读性能,目前标准版的apache hadoop不支持此功能,但是在cdh中是支持的
    配置参数是: mapred.tasktracker.shuffle.fadvise=true (是否启用shuffle预读取机制)
              mapred.tasktracker.shuffle.readahead.bytes=4MB (shuffle预读取缓冲区大小)
              mapreduce.ifile.readahead = true (是否启用ifile预读取机制)
              mapreduce.ifile.readahead.bytes = 4MB (IFile预读取缓冲区大小)
   (11):启用推测执行机制
   (12):map task调优: 合理调整io.sort.record.percent值,可减少中间文件数据,提高任务执行效率.
    (map task的输出结果将被暂时存放到一个环形缓冲区中,这个缓冲区的大小由参数"io.sort.mb"指定,单位MB,默认是100MB,
    该缓冲区主要由两部分组成,索引和实际数据,默认情况下,索引占整个buffer的比例为io.sort.record.percent,默认是5%,
    剩余空间存放数据,仅当满足以下任意一个条件时才会触发一次flush,生成一个临时文件,索引或者数据空间使用率达到比例为
    io.sort.spill.percent的80%)  
    所以具体调优参数如下:  io.sort.mb | io.sort.record.percent | io.sort.spill.percent           
    (13):reduce task调优   reduce task会启动多个拷贝线程从每个map task上读取相应的中间结果,参数是"mapred.reduce.parallel.copies"(默认是5)
    原理是这样的-->对于每个待拷贝的文件,如果文件小于一定的阀值A,则将其放入到内存中,否则已文件的形式存放到磁盘上,
    如果内存中文件满足一定条件D,则会将这些数据写入磁盘中,而当磁盘上文件数目达到io.sort.factor(默认是10)时,
    所以如果中间结果非常大,可以适当地调节这个参数的值  
    (14):跳过坏记录 看具体参数说明,=号后面是默认值
    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将坏记录保存起来以便于用户调试和跟踪
   
   
    (14):使用JVM重用 : mapred.job.reuse.jvm.aum.tasks | mapreduce.job.jvm.num.tasks = -1           
  4:从用户角度来优化
      (1)设置combiner.  在应用中尽量使用combiner可以有效地提高效率
      (2)选择合适的writable 
      (3)设置合理的reduce数
      (4)合理使用DistributedCache(建议如果需要一个外部文件引入的时候,事先把他上传到hdfs上,这样效率高,因为这样节省了客户端上传文件的时间,并且还隐含地告诉DistributedCache,
        请将文件下载到各节点的public共享目录下)
   (5)合理控制Reduce Task的启动时机 ,因为在执行job的时候,reduce task晚于map task启动,所以合理控制reduce task启动时机不仅可以加快作业的运行速度
    还可以提高资源利用率,如果reduce task启动过早,则可能由于reduce task长时间占用reduce slot资源造成slot hoarding现象,而且还会降低资源利用率
    反之则导致reduce task获取资源延迟,增加了作业的运行时间.hadoop配置reduce task启动时机的参数是
    mapred.reduce.slowstart.completed.maps | mapreduce.job.reduce.slowstart.completed.maps  (默认值是0.05,也就是map task完成数目达到5%时,开始启动reduce task)
原创粉丝点击