博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hadoop MapReduce Job性能调优——修改Map和Reduce个数
阅读量:2394 次
发布时间:2019-05-10

本文共 1360 字,大约阅读时间需要 4 分钟。

 

  • map task的数量即mapred.map.tasks的参数值,用户不能直接设置这个参数。Input Split的大小,决定了一个Job拥有多少个map。默认input split的大小是64M(与dfs.block.size的默认值相同)。然而,如果输入的数据量巨大,那么默认的64M的block会有几万甚至几十万的Map Task,集群的网络传输会很大,最严重的是给Job Tracker的调度、队列、内存都会带来很大压力。mapred.min.split.size这个配置项决定了每个 Input Split的最小值,用户可以修改这个参数,从而改变map task的数量。
  • 一个恰当的map并行度是大约每个节点10-100map,且最好每个map的执行时间至少一分钟。
  •  reduce task的数量由mapred.reduce.tasks这个参数设定,默认值是1。
  • 合适的reduce task数量是0.95或者0.75*( nodes * mapred.tasktracker.reduce.tasks.maximum), mapred.tasktracker.tasks.reduce.maximum的数量一般设置为各节点cpu core数量,即能同时计算的slot数量。对于0.95,当map结束时,所有的reduce能够立即启动;对于1.75,较快的节点结束第一轮reduce后,可以开始第二轮的reduce任务,从而提高负载均衡。
  • 对一 个job的map数和reduce数的设定对一个job的运行是非常重要的,并且非常简单。以下是一些这几个值的经验总结:

    • 如果job的每个map或者 reduce task的运行时间都只有30-40秒钟,那么就减少该job的map或者reduce数,每一个task(map|reduce)的setup和加入到 调度器中进行调度,这个中间的过程可能都要花费几秒钟,所以如果每个task都非常快就跑完了,就会在task的开始和结束的时候浪费太多的时间。JVM 的reuse方式也可以这个问题。
    • 如 果某个input的非常的大,比如 1TB,可以考虑将hdfs上的每个block size设大,比如设成256MB或者512MB,这样map和reduce的可以减小。而且用户还可以通过:hadoop distcp -Ddfs.block.size=$[256*1024*1024] /path/to/inputdata /path/to/inputdata-with-largeblocks的方式来将已经存在咋hdfs上的数据进行大块化。然后删除掉原先的文件。
    • 只 要每个task都运行至少30-40秒钟,就可以考虑将mapper数扩大,比如集群的map slots为100个,那么就不要将一个job的mapper设成101,这样前100个map能够并行完成,而最后一个map要在前100个 mapper结束后才开始,因此在reduce开始运行前,map阶段的时间几乎就要翻倍。
    • 尽量不要运行太多的reduce task。对大多数job来说,最好rduce的个数最多和集群中的reduce持平,或者比集群的 reduce slots小。这个对于小集群而言,尤其重要。
参考: 

       

转载地址:http://btwob.baihongyu.com/

你可能感兴趣的文章
JS--JavaScript操作BOM(浏览器对象模型、window对象概述、window.open()方法打开窗口)
查看>>
JS--JavaScript使用window对象操作框架集frameset中的各窗口(frames[])
查看>>
JS--JavaScript使用window对象控制窗口大小(innerWidth、innerHeight)和位置(moveTo()、moveBy())、设置随机移动弹窗(小网站专用...)
查看>>
JS--JavaScript中的location对象概述和API详解
查看>>
JS--JavaScript中的History对象API、screen对象的API、设置弹出窗口居中
查看>>
UML--序列图详解
查看>>
JS--JavaScript中的document对象概述、API详解、文档对象模型
查看>>
JS--JavaScriptDOM基础及各版本特性(DOM1.0、DOM2.0、DOM3.0)
查看>>
JS--JavaScript节点Node概述、节点类型、nodeType详解
查看>>
JS-JavaScript节点Node的nodeName和nodeValue、节点之间的树状关系
查看>>
JS--JavaScript访问节点(childNodes、parentNode、firstChild、lastChild、nextSibling、previousSibling)
查看>>
JS--JavaScript节点插入、删除、替换、克隆(appendChild、cloneNode、insertBefore、normalize、removeChild、replaceChild)
查看>>
JS--JavaScript元素节点Element特性、访问元素(getElementById、getElementByTagName)、创建元素createElement
查看>>
Vue.js--$nextTick
查看>>
Vue.js--X-Templates、手动挂载Vue实例
查看>>
Vue.js---自定义指令
查看>>
ES6--Map(Map与Object区别、Map的迭代、Map与Array转换、Map的克隆及合并)
查看>>
ES6--Set(特殊值、类型转换、Set对象的作用)
查看>>
ES6--对象
查看>>
ES6--字符串(拓展的方法、模板字符串)
查看>>