MapReduce小作业优化之Uber模式

1.什么是Uber模式

  • Uber模式是Hadoop2.0中实现的一种针对MR小作业的优化机制。即如果作业足够小,则所有task在一个jvm(mrappmaster)中完成要比为每个task启动一个container更划算。
  • Uber模式简单地可以理解成JVM重用,该模式是2.x开始引入的;以Uber模式运行MR作业,所有的Map Tasks和Reduce Tasks将会在ApplicationMaster所在的容器(container)中运行,也就是说整个MR作业运行的过程只会启动AM container,因为不需要启动mapper 和 reducer containers,所以AM不需要和远程containers通信,整个过程简单了
  • 在有些情况下,运行于Hadoop集群上的一些mapreduce作业本身的数据量并不是很大,如果此时的任务分片很多,那么为每个map任务或者reduce任务频繁创建Container,势必会增加Hadoop集群的资源消耗,并且因为创建分配Container本身的开销,还会增加这些任务的运行时延。如果能将这些小任务都放入少量的Container中执行,将会解决这些问题。好在Hadoop本身已经提供了这种功能,只需要我们理解其原理,并应用它。 Uber运行模式就是解决此类问题的现成解决方案。

2.什么是小作业

  • MapTask.num<10
  • ReduceTask.num<=1
  • MaxBytes<=BlockSize
  • 以上同时满足才称之为小作业

3.什么情况下可以使用Uber模式

仅仅是小作业就可以使用Uber模式吗?
当然是不可以的
还需要满足一下要求
isUber = uberEnabled && smallNumMapTasks && smallNumReduceTasks && smallInput && smallMemory && smallCpu && notChainJob && isValidUberMaxReduces

  • uberEnabled:其实就是 mapreduce.job.ubertask.enable 参数的值,默认情况下为 false ;也就是说默认情况不启用Uber模式,我们需要修改配置文件将其设为true
  • smallNumMapTasks:启用Uber模式的作业Map的个数必须小于等于 mapreduce.job.ubertask.maxmaps 参数的值,该值默认为9;也计算说,在默认情况下,如果你想启用Uber模式,作业的Map个数必须小于10
  • smallNumReduceTasks :Uber模式的作业Reduce的个数必须小于等于mapreduce.job.ubertask.maxreduces,该值默认为1;也计算说,在默认情况下,如果你想启用Uber模式,作业的Reduce个数必须小于等于1
  • smallInput:不是任何作业都适合启用Uber模式的,输入数据的大小必须小于等于 mapreduce.job.ubertask.maxbytes 参数的值,默认情况是HDFS一个文件块大小
  • smallMemory:因为作业是在AM所在的container中运行,所以要求我们设置的Map内存(mapreduce.map.memory.mb)和Reduce内存(mapreduce.reduce.memory.mb)必须小于等于 AM所在容器内存大小设置(yarn.app.mapreduce.am.resource.mb)
  • smallCpu:Map配置的vcores(mapreduce.map.cpu.vcores)个数和 Reduce配置的vcores(mapreduce.reduce.cpu.vcores)个数也必须小于等于AM所在容器vcores个数的设置(yarn.app.mapreduce.am.resource.cpu-vcores)
  • notChainJob:处理数据的Map class(mapreduce.job.map.class)和Reduce class(mapreduce.job.reduce.class)必须不是 ChainMapper 或 ChainReducer 才行
  • isValidUberMaxReduces:目前仅当Reduce的个数小于等于1的作业才能启用Uber模式。

4.Uber模式的配置

确保在满足以上条件可以进入uber模式
需要修改mapred-site.xml添加以下内容

<property>    
  <name>mapreduce.job.ubertask.enable</name>  
  <value>true</value>
<property>

其他默认的配置如下



<!--uber模式最大的mapTask的数量,用户可以修改,但是只能向下修改-->
<property>
  <name>mapreduce.job.ubertask.maxmaps</name>
  <value>9</value>
</property>

<!--uber模式最大的reduceTask的数量,用户可以修改,但是只能向下修改-->
<property>
  <name>mapreduce.job.ubertask.maxreduces</name>
  <value>1</value>
</property>

<!--uber模式中的最大字节数,HDFS系统中value值为空,代表默认是blocksize大小,用户可以修改,但是只能向下修改,其他文件系统中需要指定默认值-->
<property>
  <name>mapreduce.job.ubertask.maxbytes</name>
  <value></value>
</property>

<!--每个mapTask向scheduler请求的内存量-->
<property>
  <name>mapreduce.map.memory.mb</name>
  <value>1024</value>
</property>

<!--每个reduceTask向scheduler请求的内存量-->
<property>
  <name>mapreduce.reduce.memory.mb</name>
  <value>1024</value>
</property>

<!--MR中AppMaster所在容器内存大小-->
<property>
  <name>yarn.app.mapreduce.am.resource.mb</name>
  <value>1536</value>
</property>

<!--每个mapTask向scheduler请求的虚拟内核的数量-->
<property>
  <name>mapreduce.map.cpu.vcores</name>
  <value>1</value>
</property>

<!--每个reduceTask向scheduler请求的虚拟内核的数量-->
<property>
  <name>mapreduce.reduce.cpu.vcores</name>
  <value>1</value>
</property>

<!--MR AppMaster需要的虚拟CPU内核的数量-->
<property>
  <name>yarn.app.mapreduce.am.resource.cpu-vcores</name>
  <value>1</value>
</property>

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值