MapReduce的Uber运行模式

Uber模式可以简单理解成JVM重用,该模式是2.x开始引入的。以Uber模式运行MR作业,所有的Map Tasks和Reduce Tasks将会在ApplicationMaster所在的容器(container)中运行,也就是说整个MR作业运行的过程只会启动AM container,因为不需要启动mapper和reducer containers,所以AM不需要和远程containers通信,整个过程简单了。

不是所有的MR作业都可以启用Uber模式,如果我们的MR作业输入的数据量非常小,启动Map container或Reduce container的时间都比处理数据要长,那么这个作业就可以考虑启用Uber模式运行,一般情况下,对小作业启用Uber模式运行会得到2x-3x的性能提升。

启用uber模式的要求非常严格,代码如下:

isUber = uberEnabled && smallNumMapTasks && smallNumReduceTasks && smallInput && smallMemory && smallCpu && notChainJob && isValidUberMaxReduces;

条件 说明
uberEnabled mapreduce.job.ubertask.enable参数的值,默认情况下为 false。也就是说,默认情况不启用Uber模式
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模式

同时满足上面八个条件才能在作业运行的时候启动Uber模式。

完毕。

发布了116 篇原创文章 · 获赞 37 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/andyguan01_2/article/details/89471023