第一部分Hadoop Yarn内存使用优化配置
在Hadoop2.0中, YARN负责管理MapReduce中的资源(内存, CPU等)并且将其打包成Container. 这样可以精简MapReduce, 使之专注于其擅长的数据处理任务, 将无需考虑资源调度。
YARN会管理集群中所有机器的可用计算资源. 基于这些资源YARN会调度应用(比如MapReduce)发来的资源请求, 然后YARN会通过分配Container来给每个应用提供处理能力, Container是YARN中处理能力的基本单元, 是对内存, CPU等的封装。
Yarn架构做资源管理,在每个节点上面运行NodeManager负责节点资源的分配,在Yarn上面Container是资源的分配的最小单元。
Yarn集群的内存分配配置在yarn-site.xml文件中配置:
而Mapreduce的任务的内存配置:
其中mapreduce.map.memory.mb配置每个map任务的内存,应该是大于或者等于Container的最小内存。
按照上面的配置:每个slave可以运行map的数据<= yarn.nodemanager.resource.memory-mb/mapreduce.map.memory.mb
,reduce任务的数量<=yarn.nodemanager.resource.memory-mb/mapreduce.reduce.memory.mb
第二部分Hadoop YARN配置参数剖析
一、RM与NM相关参数(yarn-site.xml)
1、ResourceManager相关配置参数
(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
(6)yarn.resourcemanager.scheduler.class
参数解释:启用的资源调度器主类。目前可用的有FIFO、Capacity Scheduler和Fair Scheduler。
默认值:org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler
(7)yarn.resourcemanager.resource-tracker.client.thread-count
参数解释:处理来自NodeManager的RPC请求的Handler数目。
默认值:50
(8)yarn.resourcemanager.scheduler.client.thread-count
参数解释:处理来自ApplicationMaster的RPC请求的Handler数目。
默认值:50
(9)yarn.scheduler.minimum-allocation-mb/yarn.scheduler.maximum-allocation-mb
参数解释:单个可申请的最小/最大内存资源量。比如设置为1024和3072,则运行MapRedce作业时,每个Task最少可申请1024MB内存,最多可申请3072MB内存。
默认值:1024/8192
(10)yarn.scheduler.minimum-allocation-vcores/yarn.scheduler.maximum-allocation-vcores
参数解释:单个可申请的最小/最大虚拟CPU个数。比如设置为1和4,则运行MapRedce作业时,每个Task最少可申请1个虚拟CPU,最多可申请4个虚拟CPU。什么是虚拟CPU,可阅读我的这篇文章:“YARN 资源调度器剖析”。
默认值:1/32
(11)yarn.resourcemanager.nodes.include-path /yarn.resourcemanager.nodes.exclude-path
参数解释:NodeManager黑白名单。如果发现若干个NodeManager存在问题,比如故障率很高,任务运行失败率高,则可以将之加入黑名单中。注意,这两个配置参数可以动态生效。(调用一个refresh命令即可)
默认值:“”
(12)yarn.resourcemanager.nodemanagers.heartbeat-interval-ms
参数解释:NodeManager心跳间隔
默认值:1000(毫秒)
2、NodeManager相关配置参数
(1)yarn.nodemanager.resource.memory-mb
参数解释:NodeManager总的可用物理内存。注意,该参数是不可修改的,一旦设置,整个运行过程中不可动态修改。另外,该参数的默认值是8192MB,即使你的机器内存不够8192MB,YARN也会按照这些内存来使用(傻不傻?),因此,这个值通过一定要配置。不过,Apache已经正在尝试将该参数做成可动态修改的。
默认值:8192
(2)yarn.nodemanager.vmem-pmem-ratio
参数解释:每使用1MB物理内存,最多可用的虚拟内存数。
默认值:2.1
(3)yarn.nodemanager.resource.cpu-vcores
参数解释:NodeManager总的可用虚拟CPU个数。
默认值:8
(4)yarn.nodemanager.local-dirs
参数解释:中间结果存放位置,类似于1.0中的mapred.local.dir。注意,这个参数通常会配置多个目录,已分摊磁盘IO负载。
默认值:${hadoop.tmp.dir}/nm-local-dir
(5)yarn.nodemanager.log-dirs
参数解释:日志存放地址(可配置多个目录)。
默认值:${yarn.log.dir}/userlogs
(6)yarn.nodemanager.log.retain-seconds
参数解释:NodeManager上日志最多存放时间(不启用日志聚集功能时有效)。
默认值:10800(3小时)
(7)yarn.nodemanager.aux-services
参数解释:NodeManager上运行的附属服务。需配置成mapreduce_shuffle,才可运行MapReduce程序
默认值:“”
二、权限与日志聚集相关参数(yarn-site.xml)
1、权限相关配置参数
这里的权限由三部分组成,分别是:(1)管理员和普通用户如何区分(2)服务级别的权限,比如哪些用户可以向集群提交ResourceManager提交应用程序,(3)队列级别的权限,比如哪些用户可以向队列A提交作业等。
管理员列表由参数yarn.admin.acl指定。
服务级别的权限是通过配置hadoop-policy.xml实现的,这个与Hadoop 1.0类似。
队列级别的权限是由对应的资源调度器内部配置的,比如Fair Scheduler或者Capacity Scheduler等,具体见后面。
2、日志聚集相关配置参数
日志聚集是YARN提供的日志中央化管理功能,它能将运行完成的Container/任务日志上传到HDFS上,从而减轻NodeManager负载,且提供一个中央化存储和分析机制。默认情况下,Container/任务日志存在在各个NodeManager上,如果启用日志聚集功能需要额外的配置。
(1)yarn.log-aggregation-enable
参数解释:是否启用日志聚集功能。
默认值:false
(2)yarn.log-aggregation.retain-seconds
参数解释:在HDFS上聚集的日志最多保存多长时间。
默认值:-1
(3)yarn.log-aggregation.retain-check-interval-seconds
参数解释:多长时间检查一次日志,并将满足条件的删除,如果是0或者负数,则为上一个值的1/10。
默认值:-1
(4)yarn.nodemanager.remote-app-log-dir
参数解释:当应用程序运行结束后,日志被转移到的HDFS目录(启用日志聚集功能时有效)。
默认值:/tmp/logs
(5)yarn.log-aggregation.retain-seconds
参数解释:远程日志目录子目录名称(启用日志聚集功能时有效)。
默认值:日志将被转移到目录${yarn.nodemanager.remote-app-log-dir}/${user}/${thisParam}下
三、MapReduce相关参数(mapred-site.xml)
MapReduce相关配置参数分为两部分,分别是JobHistory Server和应用程序参数,Job History可运行在一个独立节点上,而应用程序参数则可存放在mapred-site.xml中作为默认参数,也可以在提交应用程序时单独指定,注意,如果用户指定了参数,将覆盖掉默认参数。
以下这些参数全部在mapred-site.xml中设置。
1、MapReduce JobHistory相关配置参数
在JobHistory所在节点的mapred-site.xml中配置。
(1)mapreduce.jobhistory.address
参数解释:MapReduce JobHistory Server地址。
默认值: 0.0.0.0:10020
(2)mapreduce.jobhistory.webapp.address
参数解释:MapReduce JobHistory Server Web UI地址。
默认值: 0.0.0.0:19888
(3)mapreduce.jobhistory.intermediate-done-dir
参数解释:MapReduce作业产生的日志存放位置。
默认值: /mr-history/tmp
(4)mapreduce.jobhistory.done-dir
参数解释:MR JobHistory Server管理的日志的存放位置。
默认值: /mr-history/done
2、MapReduce作业配置参数
可在客户端的mapred-site.xml中配置,作为MapReduce作业的缺省配置参数。也可以在作业提交时,个性化指定这些参数。
参数名称 |
缺省值 |
说明 |
mapreduce.job.name |
|
作业名称 |
mapreduce.job.priority |
NORMAL |
作业优先级 |
yarn.app.mapreduce.am.resource.mb |
1536 |
MR ApplicationMaster占用的内存量 |
yarn.app.mapreduce.am.resource.cpu-vcores |
1 |
MR ApplicationMaster占用的虚拟CPU个数 |
mapreduce.am.max-attempts |
2 |
MR ApplicationMaster最大失败尝试次数 |
mapreduce.map.memory.mb |
1024 |
每个Map Task需要的内存量 |
mapreduce.map.cpu.vcores |
1 |
每个Map Task需要的虚拟CPU个数 |
mapreduce.map.maxattempts |
4 |
Map Task最大失败尝试次数 |
mapreduce.reduce.memory.mb |
1024 |
每个Reduce Task需要的内存量 |
mapreduce.reduce.cpu.vcores |
1 |
每个Reduce Task需要的虚拟CPU个数 |
mapreduce.reduce.maxattempts |
4 |
Reduce Task最大失败尝试次数 |
mapreduce.map.speculative |
false |
是否对Map Task启用推测执行机制 |
mapreduce.reduce.speculative |
false |
是否对Reduce Task启用推测执行机制 |
mapreduce.job.queuename |
default |
作业提交到的队列 |
mapreduce.task.io.sort.mb |
100 |
任务内部排序缓冲区大小 |
mapreduce.map.sort.spill.percent |
0.8 |
Map阶段溢写文件的阈值(排序缓冲区大小的百分比) |
mapreduce.reduce.shuffle.parallelcopies |
5 |
Reduce Task启动的并发拷贝数据的线程数目 |
注意,MRv2重新命名了MRv1中的所有配置参数,但兼容MRv1中的旧参数,只不过会打印一条警告日志提示用户参数过期。MapReduce新旧参数对照表可参考Java类org.apache.hadoop.mapreduce.util.ConfigUtil,举例如下:
过期参数名 |
新参数名 |
mapred.job.name |
mapreduce.job.name |
mapred.job.priority |
mapreduce.job.priority |
mapred.job.queue.name |
mapreduce.job.queuename |
mapred.map.tasks.speculative.execution |
mapreduce.map.speculative |
mapred.reduce.tasks.speculative.execution |
mapreduce.reduce.speculative |
io.sort.factor |
mapreduce.task.io.sort.factor |
io.sort.mb |
mapreduce.task.io.sort.mb |
四、Fair Scheduler相关参数
参考:http://dongxicheng.org/mapreduce-nextgen/hadoop-yarn-configurations-fair-scheduler/
五、Capacity Scheduler相关参数
Capacity Scheduler是YARN中默认的资源调度器。
参考:http://dongxicheng.org/mapreduce-nextgen/hadoop-yarn-configurations-capacity-scheduler/