MapReduce调优总结与拓展

本文为《hadoop技术内幕:深入解析MapReduce架构设计与实现原理》一书第9章《Hadoop性能调优》的总结。

图1 Hadoop层次结构图

从管理员角度进行调优

1.硬件选择

master配置(可靠性,内存,CPU主频等)优于slave。

2.操作系统参数调优

  1)增大同时打开的文件描述符和网络连接上限

    ulimit 将允许同时打开的文件描述符数增大到一个合适的值。

    net.core.somaxconn

    定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数,默认值为128(通常要增加大1024或更多)。

    关于这个参数,见这篇博文:http://blog.csdn.net/taolinke/article/details/6800979

  2)关闭swap分区

    避免使用swap分区。设置vm.swappiness

  3)设置合理的预读取缓冲大小

    blockdev命令

  4)文件系统选择与配置

  不同的文件系统会有一定的差别。

  在Linux文件系统中,启动noatime属性。具体操作见这篇文章:http://www.cnblogs.com/allegro/archive/2011/04/18/2019466.html

  5)I/O调度器选择

  详情可参见AMD的白皮书《Hadoop performance tuning guide》

  

3.JVM参数调优

  关键词:JVM FLAGS、垃圾回收机制。参见《Hadoop performance tuning guide》

4.Hadoop参数调优

  1)合理规划资源

    a设置合理的槽位数目

    b编写健康监测脚本

  2)调整心跳配置

    a调整心跳间隔

    b启用带外心跳

    

  3)磁盘块配置

    

  4)设置合理的RPCHandler和HTTP线程数目

    a配置RPC Handler数目

    b配置HTTP线程数目

  5)慎用黑名单机制

    黑名单节点数目越多,系统吞吐率和计算能力越低。

  6)启用批量任务调度

  7)选择合适的压缩算法

    mapred.compress.map.output 设为true

    设置mapred.map.output.compression.codec的值为合适的值。

  8)启用预读取机制

从用户角度进行调优

1.应用程序编写规范

  1)设置combiner,作用是减少map端的中间输出。

  2)选择合适的Writable类型,Map Task和Reduce Task的输入输出都是Writable类型。

2.作业级别参数调优

  1)规划合理的任务数目

  2)增加输入文件副本数目

    输入文件副本少,一个可能的后果是当多个任务并行读取一个副本时,会出现读取瓶颈。

    在hdfs-site.xml中修改dfs.replication的值。

  3)启动推测执行机制

    将运行较慢的任务在另一个节点上启动,2个任务同时运行。其中1个提前完成后会将另一个杀死。

    属性:mapred.map.tasks.speculative.execution 默认true

  4)设置容忍度

    分为作业级别和任务级别的失败容忍。

    属性:mapred.max.map.failures.percent 默认0,如果是5表示5%

         mapred.map.max.attempts 默认为4

    

  5)适当打开JVM重用功能

    当任务较小时,避免JVM重复启动占用很多时间。mapred.job.reuse.jvm.num.tasks 默认为1

  6)设置任务超时时间

    超时之后,TaskTracker将任务杀死,然后在另一个节点重新启动一个。

    属性设置:

    mapred.task.timeout 默认60 000(单位毫秒,也就是10分钟)

  7)合理使用DistributedCache

    了解下DistributedCache就知道该怎么用这个了。具体细节是:在调用任务前将文件上传到HDFS可以在作业运行期间将DistributedCache内的这些文件下载到public目录下,好处是:public目录下的文件是共享的,后续任务不必重新下载。

  8)合理控制Reduce Task的启动时机

    注意:启动过早会占用slot资源,造成slot Hoarding现象;启动过晚会造成资源获取较晚从而延长作业运行时间。

    旧版  mapred.reduce.slowstart.completed.maps  默认值0.05

    新版  mapreduce.job.reduce.slowstart.completed.maps  默认0.05

  9)跳过坏记录

    mapred.skip.attempts.to.start.skipping 当任务失败次数达到此值时,才会进入skip mode,即启用跳过坏记录功能。

    mapred.skip.map.skip.records  最多允许跳过的坏记录的个数

    mapred.skip.reduce.max.skip.groups  

    mapred.skip.out.dir    顾名思义

  10)提高作业优先级

   解释一下怎么设置作业的优先级:设置mapred.job.priority(默认NORMAL)或者mapreduce.job.priority(NORMAL)。总共有5个优先级可选:VERY_HIGH,HIGH,NORMAL,LOW,VERY_LOW。

   优先级主要作用在于作业调度器会根据优先级分配资源(slot数目或者在YARN中更加灵活的内存容量)。

   

3.任务级别参数调优

  1)Map Task调优

    高效利用环形缓冲区。具体方法是设置合适的io.sort.record.percent,这个属性的含义是索引占buffer的比例。索引或者数据达到了缓冲区的io.sort.spill.percent时,就会触发flush,将数据读入磁盘。根据索引大小(一般为16B)和key/value大小,设置合适的io.sort.record.percent值=16/(16+R)(R为key/value大小),这样就可以最大限度利用圆形缓冲区了。    

  2)Reduce Task调优

    主要目的是减少磁盘的写入。

    写入磁盘的条件为:

    a内存使用率超过heapsize*(mapred.job.shuffle.input.buffer.percent)达到mapred.job.shuffle.merge.percent(默认为0.66);

    b内存中文件数目超过mapred.inmem.merge.percent.threshold(默认是1000);

    c文件大小超过阈值heapsize*(mapred.job.shuffle.input.buffer.percent)*0.25。

    通过调整这些属性值,可以控制磁盘的写入。

时间: 2024-11-02 23:31:53

MapReduce调优总结与拓展的相关文章

MapReduce shuffle过程剖析及调优

更新记录 2017-07-18 初稿 MapReduce简介 在Hadoop MapReduce中,框架会确保reduce收到的输入数据是根据key排序过的.数据从Mapper输出到Reducer接收,是一个很复杂的过程,框架处理了所有问题,并提供了很多配置项及扩展点.一个MapReduce的大致数据流如下图: 更详细的MapReduce介绍参考Hadoop MapReduce原理与实例. Mapper的输出排序.然后传送到Reducer的过程,称为shuffle.本文详细地解析shuffle过

mr调优

一.调优的目的充分的利用机器的性能,更快的完成mr程序的计算任务.甚至是在有限的机器条件下,能够支持运行足够多的mr程序.二.调优的总体概述从mr程序的内部运行机制,我们可以了解到一个mr程序由mapper和reducer两个阶段组成,其中mapper阶段包括数据的读取.map处理以及写出操作(排序和合并/sort&merge),而reducer阶段包含mapper输出数据的获取.数据合并(sort&merge).reduce处理以及写出操作.那么在这七个子阶段中,能够进行较大力度的进行调

hadoop MapReduce - 从作业、任务(task)、管理员角度调优

1.Combiner的作用是什么?2.作业级别参数如何调优?3.任务及管理员级别有哪些可以调优? Hadoop为用户作业提供了多种可配置的参数,以允许用户根据作业特点调整这些参数值使作业运行效率达到最优. 一 应用程序编写规范1.设置Combiner        对于一大批MapReduce程序,如果可以设置一个Combiner,那么对于提高作业性能是十分有帮助的.Combiner可减少Map Task中间输出的结果,从而减少各个Reduce Task的远程拷贝数据量,最终表现为Map Tas

Shuffle对MapReduce性能调优

Shuffle对MapReduce性能调优: Shuffle和排序 MapReduce确保每一个reduce的输出都按键排序,系统执行排序的过程---------将map输出作为输入传给reduce--------称为shuffle Shuffle过程是MapReduce的"心脏",也被称为奇迹发生的地方 1. 每个map有一个环形内存缓冲区,用于存储任务的输出.默认大小100MB(io.sort.mb属性),一旦达到阀值0.8(io.sort.spill.percent),一个后台线

Hadoop之MapReduce性能调优

基于对这些组件的深入理解,用户可以很容易通过调整一些关键参数使作业运行效率达到最优,本文将分别从Hadoop管理员和用户角度介绍如何对Hadoop进行性能调优以满足各自的需求. 1 概述 Hadoop性能调优是一项工程浩大的工作,它不仅涉及Hadoop本身的性能调优,还涉及更加底层的硬件.操作系统和Java虚拟机等系统的调优.对这几个系统适当地进行调优均有可能给Hadoop带来性能提升. Hadoop(JobTracker.TaskTracker) JVM OS Hardware(CPU Mem

MapReduce的job如何调优

MapReduce如何进行调优呢? 需要从Map阶段和Reduce阶段进行考虑. 1.如果存在大量的小数据,可以使用SequenceFile,自定义的CombineFileInputFormat ---------------------------------------------------------------------------------- 小数据文件,每一个文件都会启动一个map任务,如果有大量小文件的话,就会有大量的map任务运行,这时候回造成资源浪费 map任务或者red

mapreduce的调度算法和job调优

调度算法: mapreduce当有很多的作业在执行的时候,是按照什么顺序去执行的? 调度算法顺序需要关注: 1.提高作业的吞吐量. 2.要考虑优先级. 三种调度器:如果作业跑不完,并且机器资源利用率比较低,这时候就可以考虑这些东西 1.FifoScheduler,默认的调度算法,先进先出的方式处理应用,只有一个队列可提交应用,没有应用优先级可以配置. 2.CapacityScheduler,容量调度器.多队列的,依靠作业,如果需求资源少了,优先级就会高一些,需求资源多了,优先级就会低一些. 3.

MapReduce - 性能调优

Hadoop为用户作业提供了多种可配置的参数,以允许用户根据作业特点调整这些参数值使作业运行效率达到最优. 一 应用程序编写规范 1.设置Combiner 对于一大批MapReduce程序,如果可以设置一个Combiner,那么对于提高作业性能是十分有帮助的.Combiner可减少Map Task中间输出的结果,从而减少各个Reduce Task的远程拷贝数据量,最终表现为Map Task和Reduce Task执行时间缩短. 2. 选择合理的Writable类型 在MapReduce模型中,M

大数据技术 - MapReduce的Shuffle及调优

本章内容我们学习一下 MapReduce 中的 Shuffle 过程,Shuffle 发生在 map 输出到 reduce 输入的过程,它的中文解释是 “洗牌”,顾名思义该过程涉及数据的重新分配,主要分为两部分:1. map 任务输出的数据分组.排序,写入本地磁盘 2. reduce 任务拉取排序.由于该过程涉及排序.磁盘IO.以及网络IO 等消耗资源和 CPU 比较大的操作,因此该过程向来是“兵家必争”之地,即大家会重点优化的一个地方,因此也是大数据面试中经常会被重点考察的地方.本文力求通俗.