container数目设置
RM的内存资源配置,主要是通过下面的两个参数进行的(这两个值是Yarn平台特性,应在yarn-site.xml中配置好):
yarn.scheduler.minimum-allocation-mbyarn.scheduler.maximum-allocation-mb
说明:单个容器可申请的最小与最大内存,应用在运行申请内存时不能超过最大值,小于最小值则分配最小值,从这个角度看,最小值有点想操作系统中的页。最小值还有另外一种用途,计算一个节点的最大container数目注:这两个值一经设定不能动态改变(此处所说的动态改变是指应用运行时)。
NM的内存资源配置,主要是通过下面两个参数进行的(这两个值是Yarn平台特性,应在yarn-site.xml中配置) :
NM的内存资源配置,主要是通过下面两个参数进行的(这两个值是Yarn平台特性,应在yarn-site.xml中配置) :
yarn.nodemanager.resource.memory-mbyarn.nodemanager.vmem-pmem-ratio
说明:每个节点可用的最大内存,RM中的两个值不应该超过此值。此数值可以用于
计算container最大数目,即:用此值除以RM中的最小容器内存。
虚拟内存率,是占task所用内存的百分比,默认值为2.1倍;注意:第一个参数是不可修改的,一旦设置,整个运行过程中不可动态修改,且该值的默认大小是8G,即使计算机内存不足8G也会按着8G内存来使用。
AM内存配置相关参数,此处以MapReduce为例进行说明(这两个值是AM特性,应在mapred-site.xml中配置),如下:
AM内存配置相关参数,此处以MapReduce为例进行说明(这两个值是AM特性,应在mapred-site.xml中配置),如下:
mapreduce.map.memory.mbmapreduce.reduce.memory.mb
说明:这两个参数指定用于MapReduce的两个任务(Map and Reduce task)的内存大小,其值应该在RM中的最大最小container之间。如果没有配置则通过如下简单公式获得:
max(MIN_CONTAINER_SIZE, (Total Available RAM) / containers))
一般的reduce应该是map的2倍。注:这两个值可以在应用启动时通过参数改变;
max(MIN_CONTAINER_SIZE, (Total Available RAM) / containers))
一般的reduce应该是map的2倍。注:这两个值可以在应用启动时通过参数改变;
-Dmapreduce.map.memory.mb=
-Dmapreduce.reduce.memory.mb=
AM中其它与内存相关的参数,还有JVM相关的参数,这些参数可以通过,如下选项配置:
mapreduce.map.java.optsmapreduce.reduce.java.opts
说明:这两个参主要是为需要运行JVM程序(java、scala等)准备的,通过这两个设置可以向JVM中传递参数的,与内存有关的是,-Xmx,-Xms等选项。此数值大小,应该在AM中的map.mb和reduce.mb之间。
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>100000</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>10000</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>3000</value>
</property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>100000</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>10000</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>3000</value>
</property>
mapred-site.xml
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>2000</value>
</property>
<name>mapreduce.reduce.memory.mb</name>
<value>2000</value>
</property>
yarn.nodemanager.resource.memory-mb 每个节点可用的最大内存
yarn.scheduler.minimum-allocation-mb 单个容器可申请的最小内存
yarn.scheduler.maximum-allocation-mb 单个容器可申请的最大内存
每个节点可用的最大内存为16g,需每个节点启动两个container,单个容器可申请的最小内存为6g,最大内存为10g,或最小内存为7g,最大内存为9g
计算公式为: minimum-allocation-mb > memory-mb/(n+1)
maximum-allocation-mb < memory-mb/n
mapreduce.map.memory.mb map任务所占内存,大小应在容器内存的最小最大值之间
mapreduce.reduce.memory.mb reduce任务所占内存,大小应在容器内存的最小最大值之间
每个节点可用的最大内存为16g,需每个节点启动两个map任务,则map内存应设置为8g
![](https://i-blog.csdnimg.cn/blog_migrate/5293547acb93d293e3840b52a46d960a.png)
YARN has been configured to allow a container no smaller than 512 MB and
no larger than 4 GB; the compute nodes have 36 GB of RAM available for containers.
With a virtual memory ratio of 2.1 (the default value), each map can have as much as
3225.6 MB and a reducer can have 5376 MB of virtual memory. Thus our compute
node configured for 36 GB of container space can support up to 24 maps or 14 reducers, or any combination of mappers and reducers allowed by the available resources on
the node.
no larger than 4 GB; the compute nodes have 36 GB of RAM available for containers.
With a virtual memory ratio of 2.1 (the default value), each map can have as much as
3225.6 MB and a reducer can have 5376 MB of virtual memory. Thus our compute
node configured for 36 GB of container space can support up to 24 maps or 14 reducers, or any combination of mappers and reducers allowed by the available resources on
the node.
Mapper数目设置
split大小计算:
Math.max(
minSize
, Math.min(
maxSize
,
blockSize
))
minSize:max(1,split_minSize(默认为1))
maxSize:split_maxSize, 默认为Long的最大值
blockSize:默认128m
需设置mapper数目为20时,splitSize=fileSize/20
当splitSize>128m时,设置minSize=splitSize
FileInputFormat.
setMinInputSplitSize
当splitSize<128m时,设置maxSize=splitSize
FileInputFormat.
setMaxInputSplitSize
mapper数目为20时,需启动20个container,因APPMaster需占用一个container,此时共21个,因此需设置mapper数目为19
HashPartitioner是处理Mapper任务输出的,getPartition()方法有三个形参,key、value分别指的是Mapper任务的输出,numReduceTasks指的是设置的Reducer任务数量,默认值是1。
那么任何整数与1相除的余数肯定是0。也就是说getPartition(…)方法的返回值总是0。也就是Mapper任务的输出总是送给一个Reducer任务,最终只能输出到一个文件中。
job
.setNumReduceTasks(1);