3.5 集群配置文件总览
在本章的最后,我们把一些常用参数按照配置文件来逐个列出,供读者快速查阅和使用。
3.5.1 yarn-site.xml
常用参数如下:
yarn.resourcemanager.webapp.address
说明:Resource Manager对外的Web UI地址。用户可通过这个地址在浏览器中查看集群各类信息。
默认值:${yarn.resourcemanager.hostname}:8088
实例:
说明:Resource Manager的主机名(hostname)。
实例:
说明:启用的资源调度器主类。目前可用的有FIFO、Capacity Scheduler和Fair Scheduler。
默认值:
Org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacitySch eduler
实例:
说明:单个容器可申请的最小与最大内存,应用在申请内存时不能超过最大值,小于最小值则分配最小值,从这个角度看,最小值有点像操作系统中的页。最小值还有另外一种用途,计算一个节点的最大Container数目。这两个值一经设定不能动态改变(此处所说的动态改变是指应用运行时)。
默认值:1024/8192
实例:
说明:单个任务可申请的最小/最大虚拟CPU个数。例如设置为1和4,则运行一个作业时,每个任务最少可申请1个虚拟CPU,最多可申请4个虚拟CPU。
默认值:1/32
yarn.resourcemanager.nodes.exclude-path
说明:Node Manager黑名单。如果发现若干个Node Manager存在问题,例如故障率很高,任务运行失败率高,则可以将之加入黑名单中。注意,这个配置参数可以动态生效(调用一个refresh命令即可)。
默认值:""
实例:
说明:每个节点可用的最大内存,Resource Manager中的两个值不应该超过此值。此数值可以用于计算Container最大数目,也即是用此值除以Resource Manager中的最小容器内存。虚拟内存率,是指每使用1MB物理内存,最多可用的虚拟内存数,默认值为2.1倍。注意:第一个参数是不可修改的,一旦设置,整个运行过程中不可动态修改,且该值的默认大小是8GB,即使计算机内存不足8GB也会按着8GB内存来使用。
默认值:8GB/2.1
实例:
说明:Node Manager可用虚拟CPU总的个数。
默认值:8
实例:
说明:日志存放地址(可配置多个目录)。
默认值:${yarn.log.dir}/userlogs
实例:
说明:Node Manager上运行的附属服务。需配置成mapreduce_shuffle,才可运行MapReduce程序。
实例:
3.5.2 mapred-site.xml
mapreduce.job.name
说明:作业名称
mapreduce.job.priority
说明:作业优先级
默认:NORMAL
yarn.app.mapreduce.am.resource.mb
说明:MapReduce应用程序主控器(Application Master)占用的内存量
默认:1536
yarn.app.mapreduce.am.resource.cpu-vcores
说明:MapReduce应用程序主控器(Application Master)占用的虚拟CPU个数
默认:1
mapreduce.am.max-attempts
说明:MapReduce应用程序主控器(Application Master)失败尝试的足最大次数
默认:2
mapreduce.map.memory.mb
说明:每个Map Task需要的内存量
默认:1024
mapreduce.map.cpu.vcores
说明:每个Map Task需要的虚拟CPU个数
默认:1
mapreduce.map.maxattempts
说明:Map Task失败尝试的最大次数
默认:4
mapreduce.reduce.memory.mb
说明:每个Reduce Task需要的内存量
默认:1024
mapreduce.reduce.cpu.vcores
说明:每个Reduce Task需要的虚拟CPU个数
默认:1
mapreduce.reduce.maxattempts
说明:Reduce Task失败尝试的最大次数
默认:4
mapreduce.map.speculative
说明:是否对Map Task启用推测执行机制
默认:false
mapreduce.reduce.speculative
说明:是否对Reduce Task启用推测执行机制
默认:false
mapreduce.job.queuename
说明:作业提交到的队列
默认:default
mapreduce.task.io.sort.mb
说明:任务内部排序缓冲区的大小
默认:100
mapreduce.map.sort.spill.percent
说明:Map阶段溢写文件的阈值(排序缓冲区大小的百分比)
默认:0.8
mapreduce.reduce.shuffle.parallelcopies
说明:Reduce Task启动的并发复制数据的线程数目
默认:5
以MapReduce为例,我们来看一下Application Master内存配置的相关参数。这两个值是Application Master特性,在mapred-site.xml中配置如下:
mapreduce.map.memory.mb mapreduce.reduce.memory.mb
这两个参数指定用于MapReduce的两个任务(Map Task、Reduce task)的内存大小,其值应该在Resource Master中的最大最小Container之间。如果没有配置则通过如下简单公式获得:
max(MIN_CONTAINER_SIZE, (Total Available RAM) / containers))
一般情况下,Reduce数量应该是Map数量的2倍。上述这两个值可以在应用程序启动时通过参数来改变。另外,可以运行如下的每个Slave:
map的数量<= yarn.nodemanager.resource.memory-mb /mapreduce.map.memory.mb reduce的数量<= yarn.nodemanager.resource.memory-mb /mapreduce.reduce.memory.mb
Application Master中其他与内存相关的参数还有JVM相关的参数,这些参数可以通过如下选项进行配置:
mapreduce.map.java.opts mapreduce.reduce.java.opts
这两个参数主要是为运行JVM程序(Java、Scala等)准备的,通过这两个设置可以向JVM中传递与内存有关的参数是-Xmx和-Xms等选项。此数值的大小应该在Application Master中的map.mb和reduce.mb之间。
总之,当配置YARN内存的时候,我们主要是配置有三个方面:每个Map和Reduce可用物理内存的限制;对于每个任务的JVM大小的限制;虚拟内存的限制。下面通过一个具体错误实例来进行说明,错误如下:
Container[pid=41884,containerID=container_1405950053048_0016_01_000284] is running beyond virtual memory limits. Current usage: 314.6 MB of 2.9 GB physical memory used; 8.7 GB of 6.2 GB virtual memory used. Killing container.
配置如下:
上述配置指定了容器的最小内存和最大内存分别为:3GB和10GB,而Reduce设置的默认值2GB,Map没有设置,所以两个值均为3GB,也就是log中的“2.9 GB physical memory used”。而由于使用了默认虚拟内存率(也就是2.1倍),因此Map Task和Reduce Task总的虚拟内存都为3000*2.1=6.2GB。而应用程序的虚拟内存超过了这个数值,故报错。解决办法是在启动YARN时调节虚拟内存率或者在应用程序运行时调节内存大小。