ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

YARN架构解析与Hadoop资源调度优化实践

YARN架构解析与Hadoop资源调度优化实践

1. YARN:Hadoop生态系统的资源调度核心

第一次接触YARN是在2015年处理一个电商平台日志分析项目时。当时我们的Hadoop集群经常出现资源争抢问题,MapReduce任务和Hive查询互相阻塞,直到引入YARN后才真正实现了资源的统一管理和高效利用。作为Hadoop 2.0引入的关键组件,YARN(Yet Another Resource Negotiator)从根本上解决了早期Hadoop版本中资源管理粗放的问题。

YARN的核心价值在于将资源管理和作业调度/监控功能分离,形成了全局的ResourceManager(RM)和针对每个应用的ApplicationMaster(AM)。这种架构使得YARN能够支持多种计算框架(MapReduce、Spark、Flink等)在同一个集群上运行,共享底层资源。根据我的实测数据,在相同硬件条件下,使用YARN调度比直接使用Hadoop 1.x的调度方式可提升集群利用率30-45%。

2. YARN架构深度解析

2.1 核心组件协作机制

YARN采用主从架构设计,主要包含三个核心组件:

  1. ResourceManager(RM):全局资源管理者,包含两个关键子组件:

    • Scheduler:纯调度器,只负责分配资源,不监控应用状态
    • ApplicationsManager:负责接受作业提交、协商第一个容器(用于AM)和重启失败的AM
  2. NodeManager(NM):每个节点上的代理,负责:

    • 容器生命周期管理
    • 监控资源使用(CPU、内存等)
    • 向RM汇报健康状况
  3. ApplicationMaster(AM):每个应用特有的实例,负责:

    • 向RM协商资源
    • 与NM协作执行/监控任务
    • 容错处理(失败任务重试)

关键点:AM的设计是YARN支持多计算框架的关键。例如Spark on YARN和Flink on YARN都有各自的AM实现。

2.2 资源请求模型

YARN采用"资源请求-分配"模型,主要参数包括:

参数说明典型值
虚拟CPU核数1-16
内存(MB)1024-8192
优先级0-20
<relax_locality>是否放松本地性true/false

资源请求示例(通过REST API):

curl -X POST "http://rm-address:8088/ws/v1/cluster/apps" \ -H "Content-Type: application/json" \ -d '{ "am-container-spec": { "commands": { "command": "{{AM_COMMAND}}" }, "resource": { "memory": 2048, "vCores": 2 } }, "application-type": "SPARK", "application-name": "MySparkJob" }'

3. 生产环境配置实战

3.1 关键参数调优

在/etc/hadoop/yarn-site.xml中需要特别关注的配置项:

<!-- 单个容器可申请的最大内存 --> <property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>16384</value> </property> <!-- 单个容器可申请的最小内存 --> <property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>1024</value> </property> <!-- NM可分配的物理内存比例 --> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>24576</value> <!-- 24GB --> </property> <!-- 虚拟CPU与物理CPU的比率 --> <property> <name>yarn.nodemanager.resource.cpu-vcores</name> <value>16</value> </property>

经验法则:实际配置时应预留20%的系统资源给OS和其他服务。例如64GB内存的机器,建议配置不超过51GB给YARN。

3.2 多租户资源隔离

通过YARN Queue实现多团队/项目资源共享:

  1. 创建capacity-scheduler.xml:
<configuration> <property> <name>yarn.scheduler.capacity.root.queues</name> <value>dev,prod,research</value> </property> <property> <name>yarn.scheduler.capacity.root.dev.capacity</name> <value>30</value> </property> <property> <name>yarn.scheduler.capacity.root.prod.capacity</name> <value>50</value> </property> <property> <name>yarn.scheduler.capacity.root.research.capacity</name> <value>20</value> </property> </configuration>
  1. 提交作业时指定队列:
spark-submit --queue prod ...

4. 常见问题排查指南

4.1 资源不足错误

现象:AM或任务容器无法启动,日志显示"AM container is exited with exitCode: -104"

排查步骤

  1. 检查NM日志:
    grep -A 10 "Container killed" /var/log/hadoop-yarn/nodemanager/*.log
  2. 常见原因:
    • 内存超限:调整yarn.app.mapreduce.am.resource.mb
    • 虚拟内存检查过严:设置yarn.nodemanager.vmem-check-enabled=false

4.2 AM频繁重启

现象:RM日志显示"ApplicationMaster failed, attempt x of y"

解决方案

  1. 增加AM重试次数:
    <property> <name>yarn.resourcemanager.am.max-attempts</name> <value>5</value> </property>
  2. 检查AM心跳超时设置:
    <property> <name>yarn.am.liveness-monitor.expiry-interval-ms</name> <value>600000</value> </property>

5. 与其他技术的集成实践

5.1 Flink on YARN部署

以Application模式为例的完整部署流程:

  1. 准备Flink包:
wget https://archive.apache.org/dist/flink/flink-1.15.0/flink-1.15.0-bin-scala_2.12.tgz tar -xzf flink-*.tgz
  1. 提交作业:
./bin/flink run-application -t yarn-application \ -Djobmanager.memory.process.size=2048m \ -Dtaskmanager.memory.process.size=4096m \ -Dtaskmanager.numberOfTaskSlots=2 \ -c org.example.MyJob \ ./examples/MyJob.jar

5.2 Docker容器支持

YARN 3.1+支持Docker容器化任务:

  1. 配置NM启用Docker:
<property> <name>yarn.nodemanager.container-executor.class</name> <value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value> </property> <property> <name>yarn.nodemanager.linux-container-executor.resources-handler.class</name> <value>org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler</value> </property>
  1. 提交Docker应用:
curl -X POST "http://rm:8088/ws/v1/cluster/apps" \ -H "Content-Type: application/json" \ -d '{ "container-spec": { "image": "my-docker-image:latest", "commands": ["/opt/app/start.sh"] }, "resource": { "memory": 4096, "vCores": 2 } }'

6. 性能监控与优化

6.1 关键监控指标

通过YARN的Metrics API获取核心指标:

# 集群总体利用率 curl http://rm:8088/ws/v1/cluster/metrics # 单个应用详情 curl http://rm:8088/ws/v1/cluster/apps/application_123456789_0001

推荐监控的黄金指标:

  • 集群资源利用率(CPU/Memory)
  • 待处理应用数
  • 容器启动延迟
  • AM存活时间

6.2 调度算法选择

YARN支持三种调度器,选择依据:

调度器特点适用场景
FIFO简单,但资源利用率低测试环境
Capacity预分配队列,保证最小资源多租户生产环境
Fair动态平衡资源分配突发负载场景

配置示例(启用Fair Scheduler):

<property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value> </property>

在最近的一个金融风控项目中,我们将调度器从Capacity改为Fair后,短作业的平均完成时间缩短了40%,特别是对分析师临时提交的即席查询作业效果显著。

返回列表