MapReduce On YARN的资源申请
MapReduce资源分配原理
MapReduce所需要的资源包含三类:
- mapper task所需要的资源
- reducer task所需的资源
- Job Tracker(AM)所需要的资源
- mapper
mapper的数量由输入的splits个数决定.有几个split就有几个mapper.默认情况下,MapReudce根据输入文件的数量和HDFS块大小决定split个数.对于每一个输入文件,根据HDFS块大小,每一个HDFS块作为一个split.对于每一个文件,不足一个HDFS块的剩余部分也对应一个split.
MapReduce的split大小受mapreduce.input.fileinputformat.split.minsize
和mapreduce.input.fileinputformat.split.minsize
约束.通过调高这两个参数,可以改变split的数量.比如可以将这两个参数改为512MB.那么,每512MB输入将对应一个Mapper.
单个mapper所需的CPU由参数mapreduce.map.cpu.vcores
控制,默认为1个核.内存由参数mapreduce.map.memory.mb
控制,默认为1G.
因为每一个mapper对应一个YARN的Container.YARN的Container有最小和最大资源约束:
yarn.scheduler.minimum-allocation-mb
yarn.scheduler.maximum-allocation-mb
yarn.scheduler.maximum-allocation-vcores
yarn.scheduler.minimum-allocation-vcores
除MapReduce自动计算Mapper数量外,也可以通过程序指定Mapper数量.但指定mapper数量需要满足最终一个mapper不能对应两个输入文件的原则.即,指定的数量要大于MR自动计算出来的数量.
- reducer
reducer的数量由程序员指定.根据经验,数量应该设置为**<TODO>**.
与mapper类似,每一个reducer的资源由由参数mapreduce.reduce.cpu.vcores
控制,默认为1个核.内存由参数mapreduce.reduce.memory.mb
控制
- Job Tracker
AM只有一个,CPU和内存分别通过如下参数控制.
yarn.app.mapreduce.am.resource.cpu-vcores
yarn.app.mapreduce.am.resource.mb