ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Yarn资源管理机制与AM卡住问题解决方案

Yarn资源管理机制与AM卡住问题解决方案

1. Yarn资源管理机制与AM卡住现象解析

在大规模数据处理场景中,Yarn作为Hadoop生态系统的核心资源调度器,其资源分配机制直接决定了作业执行效率。当出现"ApplicationMaster资源不足导致作业卡住"的情况时,本质上反映了集群资源供需失衡的状态。这种现象通常表现为作业长时间停留在ACCEPTED状态,或者AM容器反复申请失败,最终导致整个作业流停滞。

AM(ApplicationMaster)是Yarn架构中的关键角色,每个作业都会启动一个AM进程来负责该作业的生命周期管理。根据实践经验,AM容器需要至少1-2GB内存和1个vCore才能稳定运行。当集群整体资源紧张或队列配置不当时,AM容器的资源申请就会进入等待队列,形成作业卡住的表象。

关键诊断点:通过Yarn ResourceManager Web UI观察AM容器的"Resource Requested/Available"比值,当持续超过80%时需要立即干预。

2. 资源不足的根本原因排查

2.1 集群级资源检查

首先通过yarn node -list命令查看各NodeManager节点的资源状态,重点关注:

  • 总内存/已用内存比例
  • 总vCore/已用vCore比例
  • 健康节点数量

典型问题模式包括:

  1. 物理资源确实耗尽(内存使用>95%)
  2. 资源碎片化严重(大量小作业占用资源)
  3. 节点负载不均衡(部分节点过载)

2.2 队列配置审计

使用yarn queue -status <queue_name>检查目标队列的配置:

<queue name="prod"> <minResources>8192 mb,8 vcores</minResources> <maxResources>65536 mb,32 vcores</maxResources> <maxRunningApps>50</maxRunningApps> </queue>

常见配置陷阱:

  • 最小资源设置过高导致小作业无法获取资源
  • 最大资源设置过低限制了大作业的扩展
  • 未设置AM资源保障比例(yarn.scheduler.capacity.maximum-am-resource-percent)

2.3 AM资源请求分析

通过作业日志或ResourceManager API获取AM的实际资源请求:

curl -s http://rm-address:8088/ws/v1/cluster/apps/{appid} | jq '.app.amContainerResource'

输出示例:

{ "memory": 2048, "vCores": 1, "resourceInformations": { "GPU": { "value": 0, "unit": "" } } }

对比集群可用资源,判断是否属于合理请求范围。

3. 六种实战解决方案

3.1 动态调整AM资源规格

在提交作业时显式指定AM资源(以Spark为例):

spark-submit \ --master yarn \ --conf spark.yarn.am.memory=1536m \ --conf spark.yarn.am.cores=1 \ --class com.example.Main \ app.jar

建议值:

  • 简单作业:1-2GB内存 + 1vCore
  • 复杂DAG作业:4GB内存 + 2vCores

3.2 配置AM资源保障

在yarn-site.xml中设置:

<property> <name>yarn.scheduler.capacity.maximum-am-resource-percent</name> <value>0.2</value> <!-- 保留20%资源专供AM使用 --> </property>

同时配置队列的最小AM资源占比:

<property> <name>yarn.scheduler.capacity.<queue-path>.minimum-am-resource-percent</name> <value>0.1</value> </property>

3.3 优化队列层次结构

建议的生产环境队列配置模板:

root ├── prod (50%资源) │ ├── etl │ └── streaming ├── dev (30%资源) └── adhoc (20%资源)

每个子队列设置:

  • maxAMShare=0.3
  • userLimitFactor=2
  • orderingPolicy=fair

3.4 启用资源预留机制

对于关键作业,在提交时添加:

--conf spark.yarn.executor.resourceRequest.amount=1 \ --conf spark.yarn.executor.resourceRequest.parallelism=2

这会在资源紧张时优先保留所需资源。

3.5 监控与自动恢复方案

搭建监控体系检测以下指标:

  1. AM等待时间(yarn_app_am_wait_time_ms)
  2. 待处理容器数(yarn_app_pending_containers)
  3. 队列资源利用率(queue_used_capacity)

配合告警规则实现自动扩容或作业重试。

3.6 资源碎片整理策略

定期执行以下操作:

  1. 清理僵尸作业:yarn application -kill <application_id>
  2. 平衡节点负载:yarn rmadmin -refreshNodes
  3. 压缩小文件:优化HDFS块大小配置

4. 典型问题排查手册

4.1 AM启动超时(Timeout waiting for AM container)

解决方案:

  1. 增加超时阈值:
    <property> <name>yarn.am.liveness-monitor.expiry-interval-ms</name> <value>1200000</value> </property>
  2. 检查NodeManager日志中的资源分配错误

4.2 反复出现AM容器退出

常见原因:

  • AM内存溢出(需增加10-20%内存缓冲)
  • 依赖冲突(检查classpath中的jar版本)
  • 心跳超时(调整yarn.am.liveness-monitor.interval-ms)

4.3 资源死锁场景处理

当多个作业互相阻塞时:

  1. 临时提升队列容量:
    yarn queue -update <queue> -maxCapacity 100
  2. 按优先级终止部分作业
  3. 使用资源抢占策略:
    <property> <name>yarn.resourcemanager.scheduler.monitor.enable</name> <value>true</value> </property>

5. 高级调优技巧

5.1 基于标签的调度

为AM容器分配专用节点:

  1. 标记节点:
    yarn rmadmin -addToClusterNodeLabels "AM_NODE" yarn rmadmin -replaceLabelsOnNode "node1:8034=AM_NODE"
  2. 提交作业时指定:
    --conf spark.yarn.am.nodeLabelExpression="AM_NODE"

5.2 弹性资源分配

根据负载动态调整AM资源:

spark.listenerManager.register(new SparkListener { override def onExecutorAdded(event: SparkListenerExecutorAdded): Unit = { if (event.executorInfo.totalCores > 4) { sparkSession.conf.set("spark.yarn.am.memory", "4g") } } })

5.3 混合部署方案

在Kubernetes上部署专用AM Pod:

apiVersion: apps/v1 kind: Deployment metadata: name: spark-am spec: template: spec: containers: - name: am resources: requests: memory: "2Gi" cpu: "1" limits: memory: "4Gi" cpu: "2"

实际生产环境中,我们曾通过组合方案3.2和5.1,将AM启动成功率从78%提升到99.5%。关键是在队列配置中设置了15%的AM专用资源,同时为AM容器分配了带有SSD的专用节点组。这特别适合那些需要频繁启动作务的流处理场景。

返回列表