注意,配置这些参数前,应充分理解这几个参数的含义,以防止误配给集群带来的隐患。另外,这些参数均需要在 yarn-site.xml 中配置。
1. yarn.resourcemanager.address
${yarn.resourcemanager.hostname}:8032
2. yarn.resourcemanager.scheduler.address
${yarn.resourcemanager.hostname}:8030
3. yarn.resourcemanager.resource-tracker.address
${yarn.resourcemanager.hostname}:8031
4. yarn.resourcemanager.admin.address
${yarn.resourcemanager.hostname}:8033
5. yarn.resourcemanager.webapp.address
${yarn.resourcemanager.hostname}:8088
1. yarn.resourcemanager.scheduler.class
2. yarn.resourcemanager.resource-tracker.client.thread-count
3. yarn.resourcemanager.scheduler.client.thread-count
4. yarn.resourcemanager.nodes.include-path /yarn.resourcemanager.nodes.exclude-path
参数解释:NodeManager 黑白名单。如果发现若干个 NodeManager 存在问题,比如故障率很高,任务运行失败率高,则可以将之加入黑名单中。注意,这两个配置参数可以动态生效。(调用一个 refresh 命令即可)
默认值:“”
5. yarn.resourcemanager.nodemanagers.heartbeat-interval-ms
1. yarn.scheduler.minimum-allocation-mb/ yarn.scheduler.maximum-allocation-mb
2. yarn.scheduler.minimum-allocation-vcores / yarn.scheduler.maximum-allocation-vcores
1. yarn.nodemanager.resource.memory-mb
2. yarn.nodemanager.vmem-pmem-ratio
3. yarn.nodemanager.resource.cpu-vcores
1. yarn.nodemanager.local-dirs
${hadoop.tmp.dir}/nm-local-dir
2. yarn.nodemanager.log-dirs
${yarn.log.dir}/userlogs
3. yarn.nodemanager.log.retain-seconds
1. yarn.nodemanager.aux-services
在 YARN 中,资源管理由 ResourceManager 和 NodeManager 共同完成,其中,ResourceManager 中的调度器负责资源的分配,而 NodeManager 则负责资源的供给和隔离。ResourceManager 将某个 NodeManager 上资源分配给任务(这就是所谓的“资源调度”)后,NodeManager 需按照要求为任务提供相应的资源,甚至保证这些资源应具有独占性,为任务运行提供基础的保证,这就是所谓的资源隔离。
基于以上考虑,YARN 允许用户配置每个节点上可用的物理内存资源,注意,这里是“可用的”,因为一个节点上的内存会被若干个服务共享,比如一部分给 YARN,一部分给 HDFS,一部分给 HBase等,YARN 配置的只是自己可以使用的,配置参数如下:
1. yarn.nodemanager.resource.memory-mb
表示该节点上 YARN 可使用的物理内存总量,默认是 8192(MB),注意,如果你的节点内存资源不够 8GB,则需要调减小这个值,而 YARN 不会智能的探测节点的物理内存总量。
2. yarn.nodemanager.vmem-pmem-ratio
任务每使用 1MB 物理内存,最多可使用虚拟内存量,默认是2.1。
3. yarn.nodemanager.pmem-check-enabled
是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true。
4. yarn.nodemanager.vmem-check-enabled
是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true。
5. yarn.scheduler.minimum-allocation-mb
单个任务可申请的最少物理内存量,默认是1024(MB),如果一个任务申请的物理内存量少于该值,则该对应的值改为这个数。
6. yarn.scheduler.maximum-allocation-mb
单个任务可申请的最多物理内存量,默认是8192(MB)。
默认情况下,YARN 采用了线程监控的方法判断任务是否超量使用内存,一旦发现超量,则直接将其杀死。由于 Cgroups 对内存的控制缺乏灵活性(即任务任何时刻不能超过内存上限,如果超过,则直接将其杀死或者报 OOM),而 Java 进程在创建瞬间内存将翻倍,之后骤降到正常值,这种情况下,采用线程监控的方式更加灵活(当发现进程树内存瞬间翻倍超过设定值时,可认为是正常现象,不会将任务杀死),因此 YARN 未提供 Cgroups 内存隔离机制。
可以使用如下命令在提交任务时动态设置:
例如如下,其中后面的 1024 及两个 1 均为 jar 的输入参数。
当发生如下错误
Container [pid=24156,containerID=container_1427332071311_0019_01_000002] is running beyond physical memory limits. Current usage: 2.1 GB of 2 GB physical memory used; 2.7 GB of 4.2 GB virtual memory used. Killing container.
1. 在 RM 内存资源配置——两个参数(yarn-site.xml)
它们表示单个容器可以申请的最小与最大内存
2. 在 NM 内存资源配置(yarn-site.xml)
前者表示单个节点可用的最大内存,RM 中的两个值都不应该超过该值。
后者表示虚拟内存率,即占 task 所用内存的百分比,默认为 2.1。
3. 在 AM 配置(mapred-site.xml)
指定 map 和 reduce task 的内存大小,该值应该在 RM 的最大最小 container 之间。如果不设置,则默认用以下规则进行计算:max{MIN_Container_Size,(Total Available RAM/containers)}
。
一般地,reduce 设置为 map 的两倍。
这两个参数是为需要运行 JVM 程序(java,scala等)准备,通过这两个参数可以向 JVM 中传递参数,与内存有关的是 -Xmx
, -Xms
等选项,数值的大小应该要在 AM 中的 map.mb 和 reduce.mb 之间。