- 一 ResourceManager 相关配置参数
- 1 通信配置参数
- 2 调度器配置参数
- 3 内存和 CPU 配置参数
- 二 NodeManager 相关配置参数
- 1 内存与 CPU 配置参数
- 1 日志配置参数
- 3 运行配置参数
- 三 Hadoop YARN 中内存的设置详解
- 1 nodemanager 属性配置
- 2 动态设置内存大小
- 3 总结内存配置
注意,配置这些参数前,应充分理解这几个参数的含义,以防止误配给集群带来的隐患。另外,这些参数均需要在 yarn-site.xml 中配置。
一. ResourceManager 相关配置参数
1.1 通信配置参数
1. yarn.resourcemanager.address
- 参数解释:ResourceManager 对客户端暴露的地址。客户端通过该地址向 RM 提交应用程序,杀死应用程序等
- 默认值:
${yarn.resourcemanager.hostname}:8032
2. yarn.resourcemanager.scheduler.address
- 参数解释:ResourceManager 对 ApplicationMaster 暴露的访问地址。ApplicationMaster 通过该地址向 RM 申请资源、释放资源等
- 默认值:
${yarn.resourcemanager.hostname}:8030
3. yarn.resourcemanager.resource-tracker.address
- 参数解释:ResourceManager 对 NodeManager 暴露的地址.。NodeManager 通过该地址向 RM 汇报心跳,领取任务等
- 默认值:
${yarn.resourcemanager.hostname}:8031
4. yarn.resourcemanager.admin.address
- 参数解释:ResourceManager 对管理员暴露的访问地址。管理员通过该地址向 RM 发送管理命令等。
- 默认值:
${yarn.resourcemanager.hostname}:8033
5. yarn.resourcemanager.webapp.address
- 参数解释:ResourceManager 对外 web ui 地址。用户可通过该地址在浏览器中查看集群各类信息
- 默认值:
${yarn.resourcemanager.hostname}:8088
1.2 调度器配置参数
1. yarn.resourcemanager.scheduler.class
- 参数解释:启用的资源调度器主类。目前可用的有 FIFO、Capacity Scheduler 和 Fair Scheduler。
- 默认值:Fair Scheduler (hadoop 2.5)
2. yarn.resourcemanager.resource-tracker.client.thread-count
- 参数解释:处理来自 NodeManager 的 RPC 请求的 Handler 数目
- 默认值:50
3. yarn.resourcemanager.scheduler.client.thread-count
- 参数解释:处理来自 ApplicationMaster 的 RPC 请求的 Handler 数目
- 默认值:50
4. yarn.resourcemanager.nodes.include-path /yarn.resourcemanager.nodes.exclude-path
-
参数解释:NodeManager 黑白名单。如果发现若干个 NodeManager 存在问题,比如故障率很高,任务运行失败率高,则可以将之加入黑名单中。注意,这两个配置参数可以动态生效。(调用一个 refresh 命令即可)
-
默认值:“”
5. yarn.resourcemanager.nodemanagers.heartbeat-interval-ms
- 参数解释:NodeManager 心跳间隔
- 默认值:1000(毫秒)
1.3 内存和 CPU 配置参数
1. yarn.scheduler.minimum-allocation-mb/ yarn.scheduler.maximum-allocation-mb
- 参数解释:单个可申请的最小/最大内存资源量。比如设置为 1024 和 3072,则运行 MapRedce 作业时,每个 Task 最少可申请 1024MB 内存,最多可申请 3072MB 内存
- 默认值:1024/8192
2. yarn.scheduler.minimum-allocation-vcores / yarn.scheduler.maximum-allocation-vcores
- 参数解释:单个可申请的最小/最大虚拟 CPU 个数。比如设置为 1 和 4,则运行 MapRedce 作业时,每个 Task 最少可申请 1 个虚拟 CPU,最多可申请 4 个虚拟 CPU
- 默认值:1/32
二. NodeManager 相关配置参数
2.1 内存与 CPU 配置参数
1. yarn.nodemanager.resource.memory-mb
- 参数解释:NodeManager 总的可用物理内存。注意,该参数是不可修改的,一旦设置,整个运行过程中不 可动态修改。另外,该参数的默认值是 8192 MB,即使你的机器内存不够 8192 MB,YARN 也会按照这些内存来使用,因此,这个值通过一 定要配置。不过,Apache 已经正在尝试将该参数做成可动态修改的
- 默认值:8192
2. yarn.nodemanager.vmem-pmem-ratio
- 参数解释:每使用 1MB 物理内存,最多可用的虚拟内存数
- 默认值:2.1
3. yarn.nodemanager.resource.cpu-vcores
- 参数解释:NodeManager总的可用虚拟CPU个数
- 默认值:8
2.1 日志配置参数
1. yarn.nodemanager.local-dirs
- 参数解释:中间结果存放位置,类似于 1.0 中的 mapred.local.dir。注意,这个参数通常会配置多个目录,已分摊磁盘IO负载
- 默认值:
${hadoop.tmp.dir}/nm-local-dir
2. yarn.nodemanager.log-dirs
- 参数解释:日志存放地址(可配置多个目录)。
- 默认值:
${yarn.log.dir}/userlogs
3. yarn.nodemanager.log.retain-seconds
- 参数解释:NodeManager上日志最多存放时间(不启用日志聚集功能时有效)。
- 默认值:10800(3小时)
2.3 运行配置参数
1. yarn.nodemanager.aux-services
- 参数解释:NodeManager上运行的附属服务。需配置成mapreduce_shuffle,才可运行MapReduce程序
- 默认值:“”
三. Hadoop YARN 中内存的设置详解
在 YARN 中,资源管理由 ResourceManager 和 NodeManager 共同完成,其中,ResourceManager 中的调度器负责资源的分配,而 NodeManager 则负责资源的供给和隔离。ResourceManager 将某个 NodeManager 上资源分配给任务(这就是所谓的“资源调度”)后,NodeManager 需按照要求为任务提供相应的资源,甚至保证这些资源应具有独占性,为任务运行提供基础的保证,这就是所谓的资源隔离。
3.1 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 内存隔离机制。
3.2 动态设置内存大小
可以使用如下命令在提交任务时动态设置:
例如如下,其中后面的 1024 及两个 1 均为 jar 的输入参数。
3.3 总结内存配置
当发生如下错误
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)
- yarn.scheduler.minimum-allocation-mb
- yarn.scheduler.maximum-allocation-mb
它们表示单个容器可以申请的最小与最大内存
2. 在 NM 内存资源配置(yarn-site.xml)
- yarn.nodemanager.resource.memory-mb
- yarn.nodemanager.vmem-pmem-ratio
前者表示单个节点可用的最大内存,RM 中的两个值都不应该超过该值。
后者表示虚拟内存率,即占 task 所用内存的百分比,默认为 2.1。
3. 在 AM 配置(mapred-site.xml)
- mapreduce.map.memory.mb
- mapreduce.reduce.memory.mb
指定 map 和 reduce task 的内存大小,该值应该在 RM 的最大最小 container 之间。如果不设置,则默认用以下规则进行计算:max{MIN_Container_Size,(Total Available RAM/containers)}
。
一般地,reduce 设置为 map 的两倍。
- mapreduce.map.java.opts
- mapreduce.reduce.java.opts
这两个参数是为需要运行 JVM 程序(java,scala等)准备,通过这两个参数可以向 JVM 中传递参数,与内存有关的是 -Xmx
, -Xms
等选项,数值的大小应该要在 AM 中的 map.mb 和 reduce.mb 之间。