yarn计算一个节点容量及其配置项
mapred-site.xml
mapreduce.map.memory.mb 1536 每个Map Container的大小
mapreduce.reduce.memory.mb 2560 每个Reduce Container的大小
mapreduce.map.java.opts -Xmx1024 Map任务的jvm-Xmx堆大小。
//实际Map函数占用的jvm堆大小
mapreduce.reduce.java.opts -Xmx2048 Reduce任务的jvm-Xmx堆大小。
//实际Reduce函数占用的jvm堆大小
- 每个container是动态分配的
mapreduce.map.memory.mb和mapreduce.map.java.opts之间有512MB的差值,这是container留的内存余地,可以用来运行JVM Perm Gen、Native Lib。
所以mapreduce.map.java.opts的值一定要小于mapreduce.map.memory.mb的值。
理解mapreduce.map.java.opts、mapreduce.reduce.java.opts 以map任务为例,Container其实就是在执行一个脚本文件,而脚本文件中,会执行一个 Java 的子进程,这个子进程就是真正的 Map Task,mapreduce.map.java.opts 其实就是启动 JVM 虚拟机时,传递给虚拟机的启动参数,而默认值 -Xmx200m 表示这个 Java 程序可以使用的最大堆内存数,一旦超过这个大小,JVM 就会抛出 Out of Memory 异常,并终止进程。而 mapreduce.map.memory.mb 设置的是 Container 的内存上限,这个参数由 NodeManager 读取并进行控制,当 Container 的内存大小超过了这个参数值,NodeManager 会负责 kill 掉 Container。在后面分析 yarn.nodemanager.vmem-pmem-ratio 这个参数的时候,会讲解 NodeManager 监控 Container 内存(包括虚拟内存和物理内存)及 kill 掉 Container 的过程。 也就是说,mapreduce.map.java.opts一定要小于mapreduce.map.memory.mb
mapreduce.reduce.java.opts同mapreduce.map.java.opts一样的道理。
这两个参数,差值太大太小都可能回有问题:
mapreduce.{map,reduce}.memory.mb和 mapreduce.{map,reduce}.java.opts,一旦设置不合理,则会使得内存资源浪费严重,比如将前者设置为4096MB,但后者却是“-Xmx2g”,则剩余2g实际上无法让java heap使用到。参见
https://issues.apache.org/jira/browse/MAPREDUCE-5785
yarn-site.xml
yarn.scheduler.minimum-allocation-mb 512 YARN允许的最小Container
//AppMaster也会独占一个Container
yarn.scheduler.maximum-allocation-mb 4096 YARN允许的最大Container
yarn.nodemanager.resource.memory-mb 36864 节点上资源的总物理内存值。
//这个值不要配置为节点总RAM,还要为其他Hadoop服务如Hbase等留内存
yarn.nodemanager.vmen-pmen-ratio 2.1 每个Container允许的虚拟内存比例。
yarn提供了非常通用的应用资源模型。
- 资源名称(主机名称、机架名称、以及可能的复杂网络拓扑)
- 内存量
- CPU(核数/类型)
- 其他资源,如disk/network I/O、GPU等资源。
yarn权威指南上介绍hadoop2.x目前的可以支持CPU和内存两种资源维度。(hadoop yarn权威指南P33)