本文详细介绍Hadoop YARN资源管理优化实战,包括YARN架构、调度器配置、队列管理、资源监控、性能调优等内容,风哥教程参考Hadoop官方文档YARN部分,适合大数据运维工程师使用。学习交流加群风哥QQ113257174
Part01-基础概念与理论知识
1.1 YARN资源管理概述
YARN(Yet Another Resource Negotiator)是Hadoop的资源管理器,负责集群资源的管理和调度。更多视频教程www.fgedu.net.cn
- 资源管理:管理集群的CPU和内存资源
- 任务调度:调度应用程序运行
- 多租户:支持多个用户共享集群
- 资源隔离:保证应用间资源隔离
- 高可用:支持ResourceManager高可用
- 可扩展:支持数千节点的大规模集群
1.2 YARN架构与核心组件
YARN核心组件:
ResourceManager(RM):
– 全局资源管理器
– 接收应用提交
– 分配资源
– 调度应用
– 可配置高可用
NodeManager(NM):
– 每个节点的资源管理器
– 管理Container
– 监控节点资源
– 向RM汇报状态
ApplicationMaster(AM):
– 每个应用的管理者
– 申请资源
– 管理任务
– 监控任务执行
Container:
– 资源分配单位
– 包含CPU和内存
– 运行具体任务
1.3 YARN调度器介绍
YARN调度器对比:
- FIFO Scheduler:先进先出,简单但不适合多租户
- Capacity Scheduler:容量调度器,按队列分配容量,适合生产环境
- Fair Scheduler:公平调度器,公平分配资源,适合多用户环境
Part02-生产环境规划与建议
2.1 YARN资源规划
YARN资源规划要点:
CPU配置:
– 每个Container vcore数量:1-8
– 预留系统CPU:1-2核
– vcore总数 ≈ 物理核数 * 2
内存配置:
– 每个Container内存:1GB-8GB
– 预留系统内存:8GB-16GB
– 容器内存总和 <= 节点总内存 – 系统内存
# 示例配置(32核128GB节点)
yarn.nodemanager.resource.memory-mb=102400
yarn.nodemanager.resource.cpu-vcores=24
yarn.scheduler.minimum-allocation-mb=1024
yarn.scheduler.maximum-allocation-mb=16384
yarn.scheduler.minimum-allocation-vcores=1
yarn.scheduler.maximum-allocation-vcores=8
# 系统预留
系统内存:24GB
系统CPU:8核
2.2 YARN核心配置
YARN核心配置:
<property>
<name>yarn.resourcemanager.hostname</name>
<value>fgedu-rm</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>102400</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>24</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>16384</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-vcores</name>
<value>1</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>8</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
2.3 队列资源规划
队列资源规划示例:
- root(根队列)
- production(生产队列,60%容量)
- etl(ETL队列,30%)
- report(报表队列,20%)
- ml(机器学习队列,10%)
- development(开发队列,30%容量)
- test(测试队列,10%容量)
- production(生产队列,60%容量)
from bigdata视频:www.itpux.com
Part03-生产环境项目实施方案
3.1 YARN Capacity调度器配置
3.1.1 配置Capacity调度器
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
# 2. 配置capacity-scheduler.xml
cat > /bigdata/app/hadoop/etc/hadoop/capacity-scheduler.xml << ‘EOF’
<?xml version=”1.0″?>
<configuration>
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>production,development,test</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.production.capacity</name>
<value>60</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.production.maximum-capacity</name>
<value>80</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.production.queues</name>
<value>etl,report,ml</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.production.etl.capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.production.report.capacity</name>
<value>30</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.production.ml.capacity</name>
<value>20</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.development.capacity</name>
<value>30</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.development.maximum-capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.test.capacity</name>
<value>10</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.test.maximum-capacity</name>
<value>20</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.production.user-limit-factor</name>
<value>2</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.production.state</name>
<value>RUNNING</value>
</property>
</configuration>
EOF
# 3. 刷新队列配置
yarn rmadmin -refreshQueues
# 4. 验证队列配置
yarn queue -status root.production
3.2 YARN Fair调度器配置
3.2.1 配置Fair调度器
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>
<property>
<name>yarn.scheduler.fair.allocation.file</name>
<value>/bigdata/app/hadoop/etc/hadoop/fair-scheduler.xml</value>
</property>
# 2. 配置fair-scheduler.xml
cat > /bigdata/app/hadoop/etc/hadoop/fair-scheduler.xml << ‘EOF’
<?xml version=”1.0″?>
<allocations>
<queue name=”root”>
<queue name=”production”>
<weight>6.0</weight>
<queue name=”etl”>
<weight>3.0</weight>
</queue>
<queue name=”report”>
<weight>2.0</weight>
</queue>
<queue name=”ml”>
<weight>1.0</weight>
</queue>
</queue>
<queue name=”development”>
<weight>3.0</weight>
</queue>
<queue name=”test”>
<weight>1.0</weight>
</queue>
</queue>
<user name=”fgedu”>
<maxRunningApps>100</maxRunningApps>
</user>
<userMaxAppsDefault>20</userMaxAppsDefault>
<queuePlacementPolicy>
<rule name=”specified” create=”false”/>
<rule name=”primaryGroup” create=”false”/>
<rule name=”default” queue=”development”/>
</queuePlacementPolicy>
</allocations>
EOF
# 3. 重启ResourceManager
yarn –daemon stop resourcemanager
yarn –daemon start resourcemanager
3.3 节点标签配置
3.3.1 配置节点标签
<property>
<name>yarn.node-labels.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.node-labels.fs-store.root-dir</name>
<value>hdfs://fgedu-nn:8020/bigdata/fgdata/yarn/node-labels</value>
</property>
# 2. 添加节点标签
yarn rmadmin -addToClusterNodeLabels “GPU,GPU_MEM,SSD,HDD”
# 3. 查看节点标签
yarn cluster –list-node-labels
# 4. 为节点添加标签
yarn rmadmin -replaceLabelsOnNode “fgedu-node01=GPU,GPU_MEM fgedu-node02=SSD fgedu-node03=HDD”
# 5. 查看节点标签
yarn node -list -all
# 6. 配置队列使用节点标签
<property>
<name>yarn.scheduler.capacity.root.production.ml.accessible-node-labels</name>
<value>GPU,GPU_MEM</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.production.ml.accessible-node-labels.GPU.capacity</name>
<value>100</value>
</property>
# 7. 提交应用时指定节点标签
spark-submit –conf spark.yarn.node.label=GPU –class …
Part04-生产案例与实战讲解
4.1 队列管理实战
4.1.1 队列操作
yarn queue -status root.production
yarn queue -status root.production.etl
# 查看所有队列
yarn queue -list
# 提交应用到指定队列
# MapReduce
hadoop jar /bigdata/app/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar pi \
-Dmapreduce.job.queuename=root.production.etl 10 100
# Spark
spark-submit –master yarn –queue root.production.report –class …
# Flink
flink run -m yarn-cluster -yqu root.production.etl …
# 查看队列应用
yarn application -list -appStates ALL -queue root.production.etl
# Kill队列中的应用
yarn application -kill application_1234567890_0001
# 动态调整队列容量(需要配置)
# 修改capacity-scheduler.xml
yarn rmadmin -refreshQueues
# 验证队列配置
curl http://fgedu-rm:8088/ws/v1/cluster/scheduler
4.2 资源监控实战
4.2.1 Web UI监控
http://fgedu-rm:8088
# 主要页面
– 概览:集群资源、应用统计
– 调度器:队列资源、应用状态
– 节点:节点列表、资源使用
– 应用:运行、完成、失败的应用
– 工具:日志查看、配置查看
# 使用命令行监控
# 查看集群信息
yarn cluster
# 查看节点信息
yarn node -list -all
yarn node -status fgedu-node01:8041
# 查看应用信息
yarn application -list
yarn application -list -appStates RUNNING
yarn application -status application_1234567890_0001
# 查看Container日志
yarn logs -applicationId application_1234567890_0001
yarn logs -applicationId application_1234567890_0001 -containerId container_1234567890_0001_01_000001
# Prometheus监控
# 配置YARN JMX Exporter
-javaagent:/bigdata/app/jmx_prometheus_javaagent-0.19.0.jar=9405:/bigdata/app/hadoop/etc/hadoop/jmx_exporter.yaml
# Prometheus配置
scrape_configs:
– job_name: ‘yarn_rm’
static_configs:
– targets: [‘fgedu-rm:9405’]
– job_name: ‘yarn_nm’
static_configs:
– targets: [‘fgedu-node01:9405’, ‘fgedu-node02:9405’]
# Grafana Dashboard
# 关键指标:
– 集群总资源
– 集群已用资源
– 队列资源使用
– 应用数量
– 容器数量
– NodeManager状态
4.3 性能调优实战
4.3.1 性能调优技巧
# 根据应用需求配置合理的容器大小
# 过小:容器数量多,调度开销大
# 过大:资源浪费,并发度低
# 优化2:调整调度器参数
# Capacity Scheduler
<property>
<name>yarn.scheduler.capacity.node-locality-delay</name>
<value>40</value>
</property>
<property>
<name>yarn.scheduler.capacity.rack-locality-additional-delay</name>
<value>100</value>
</property>
# 优化3:调整Container分配
# 小应用使用小容器
# 大应用使用大容器
# 优化4:启用资源抢占
<property>
<name>yarn.scheduler.capacity.root.production.preemption-disabled</name>
<value>false</value>
</property>
# 优化5:调整NM心跳间隔
<property>
<name>yarn.nodemanager.heartbeat-interval-ms</name>
<value>1000</value>
</property>
# 优化6:调整AM重试
<property>
<name>yarn.resourcemanager.am.max-attempts</name>
<value>2</value>
</property>
<property>
<name>yarn.app.mapreduce.am.max-attempts</name>
<value>2</value>
</property>
# 优化7:日志聚合优化
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
Part05-风哥经验总结与分享
5.1 YARN生产最佳实践
YARN生产最佳实践:
- 队列规划:根据业务需求规划队列,合理分配容量
- 资源预留:为系统预留足够的CPU和内存
- 容器大小:根据应用需求配置合理的容器大小
- 高可用:配置ResourceManager高可用
- 监控告警:详细监控资源使用和应用状态
- 日志聚合:启用日志聚合,方便问题排查
5.2 常见问题处理
– 检查资源是否足够
– 检查队列容量
– 检查是否有Deadlock
– 查看应用日志
# 常见问题2:NodeManager掉线
– 检查NM日志
– 检查网络连接
– 检查磁盘空间
– 检查内存使用
– 重启NM
# 常见问题3:资源不足
– 检查队列配置
– 增加集群节点
– 调整队列容量
– Kill非关键应用
– 优化应用资源使用
# 常见问题4:调度慢
– 调整调度器参数
– 减少应用数量
– 优化队列配置
– 检查RM性能
# 常见问题5:OOM问题
– 增加容器内存
– 优化应用内存使用
– 调整JVM参数
– 减少并发任务数
5.3 运维检查清单
– [ ] ResourceManager状态
– [ ] NodeManager状态
– [ ] 集群资源使用
– [ ] 队列资源使用
– [ ] 应用状态
– [ ] 容器状态
– [ ] 磁盘空间
– [ ] 内存使用
– [ ] CPU使用
– [ ] 网络状态
– [ ] 告警规则检查
– [ ] 日志检查
# 日常巡检内容
1. 检查RM状态和HA状态
2. 检查NM状态
3. 检查集群资源使用
4. 检查队列资源使用
5. 查看失败应用
6. 检查资源告警
7. 查看RM/NM日志
8. 检查磁盘空间
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
