介绍
- Uber mode简单地可以理解成JVM重用,该mode是Hadoop2.x版本开始引入的;以Uber mode运行MapReduce作业,所有的Map Tasks和Reduce Tasks将会在ApplicationMaster所在的容器(container)中运行,也就是说整个MapReduce作业运行的过程只会启动AM container,因为不需要启动mapper和reducer containers,所以AM不需要和远程containers通信,整个过程简单了。
- 但是并不是所有的MapReduce Job都可以启用Uber模式,如果我们的MapReduce Job输入的数据量非常小,启动Map container或Reduce container的时间都比处理数据要长,那么这个作业就可以考虑启用Uber mode运行,一般情况下,对小作业启用Uber mode运行会得到2x-3x的性能提升。
- 通常,Uber mode对于数据量小的作业会非常节约时间。
Uber mode启用
-
相关代码:
isUber = uberEnabled && smallNumMapTasks && smallNumReduceTasks && smallInput && smallMemory && smallCpu && notChainJob && isValidUberMaxReduces;
-
参数解读:
-
uberEnabled:mapreduce.job.ubertask.enable参数的值,默认情况下为false;也就是说默认情况不启用Uber mode; -
smallNumMapTasks:启用Uber mode的作业Map的个数必须小于等于 mapreduce.job.ubertask.maxmaps 参数的值,该值默认为9;即在默认情况下,如果想启用Uber mode,作业的Map个数必须小于10; -
smallNumReduceTasks:Uber mode的作业Reduce的个数必须小于等于mapreduce.job.ubertask.maxreduces,该值默认为1;即在默认情况下,如果想启用Uber mode,作业的Reduce个数必须小于2; -
smallInput:不是任何作业都适合启用Uber mode,输入数据的大小必须不能超过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的个数不超过2的作业才能启用Uber mode。
-