MapReduce Job —— Uber mode

927 阅读2分钟

介绍

  • 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。