map和reduce 个数的设定

原文连接:http://blog.csdn.net/aaa1117a8w5s6d/article/details/33781319node

  • map task的数量即mapred.map.tasks的参数值,用户不能直接设置这个参数。Input Split的大小,决定了一个Job拥有多少个map。默认input split的大小是128M(与dfs.block.size的默认值相同)。然而,若是输入的数据量巨大,那么默认的128M的block会有几万甚至几十万的Map Task,集群的网络传输会很大,最严重的是给Job Tracker的调度、队列、内存都会带来很大压力。mapred.min.split.size这个配置项决定了每一个 Input Split的最小值,用户能够修改这个参数,从而改变map task的数量。
  • 一个恰当的map并行度是大约每一个节点10-100个map,且最好每一个map的执行时间至少一分钟。
  •  reduce task的数量由mapred.reduce.tasks这个参数设定,默认值是1。
  • 合适的reduce task数量是0.95或者1.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小。这个对于小集群而言,尤为重要。

------------------------------------------------------------------------------------------------------------------并发

MapReduce框架将文件分为多个splits,并为每一个splits建立一个Mapper,因此Mappers的个数直接由splits的数目决定。而Reducers的数目能够经过job.setNumReduceTasks()函数设置,默认状况只有一个Reducer。在真正的集群环境下,若是默认,那么全部的中间数据会发送给惟一的Reducer,致使任务变得很是缓慢。究竟设多少个Reducers合适呢?为了解决这个问题,首先来了解一下slots的概念。app

slots有点相似一个资源池,每一个任务(map和reduce)执行时都必须得到一个slot才能继续,不然只能等待。当一个任务完成后,该任务就归还slot,这个过程有点相似释放资源到资源池中。显然,每个得到资源的任务均可以当即执行,无需等待。另外一方面,mapreduce的任务由tasktracker节点负责执行的,因此slots可进一步理解为tasktrackers可以并发执行多个任务。slots分为mapper slots和reducer slots,分别对应最大可并行执行的mapper和reducer数。用户能够经过修改mapred-site.xml配置文件的mapred.tasktracker.map.tasks.maxmum来设置slots的值,默认为2.负载均衡

集群中可用rducer slots 的总数等于集群中的总结点数乘以每一个节点有多少个slots。reducers 数目的最佳值和reducer slots的总数有关,一般状况下,让reducers的数目略小于reducer slots的总数,这样的目的:首先reducers能够并行执行,减小排队时间;其次对于未执行reducer的slots能够在其余reducer发生故障时,当即分配给新建立的reducer,不会明显 加长任务总时间。框架

若是出现reducers》mappers的状况就不合理了,这样有些mappers会工做消耗资源开销,可是对任务没有任何帮助。tcp

相关文章
相关标签/搜索