YARN 集群优化与治理常见问题答案合集(共30题)


🐭1. Q:YARN中Fair Scheduler的抢占机制是如何工作的?如何配置?

A:
Fair Scheduler支持资源抢占,允许优先级高的任务从低优先级任务中“抢”回空闲资源。抢占通过fair-scheduler.xml配置:

<fairSharePreemptionTimeout>60</fairSharePreemptionTimeout>
<allowPreemptionFrom>true</allowPreemptionFrom>
  • fairSharePreemptionTimeout 表示一个队列等待获取公平份额的时间。
  • allowPreemptionFrom 表示是否允许被抢占。

🐮2. Q:在多租户环境下,如何实现不同用户组之间的资源隔离?

A:
可通过资源队列划分+ACL控制来实现资源隔离:

  • fair-scheduler.xmlcapacity-scheduler.xml中定义多个队列,并分配资源配额。
  • 使用ACL设置各队列的提交权限和管理权限,例如:
<queue name="finance">
  <aclSubmitApps>finance-group</aclSubmitApps>
  <aclAdministerApps>finance-admin</aclAdministerApps>
</queue>

🐅3. Q:YARN中如何避免小任务频繁申请资源造成的调度开销?

A:
可使用以下策略:

  • 启用ApplicationMaster级别的资源聚合,如Spark的动态资源分配。
  • 设置最小Container内存(1G)/VCores(1CPU),避免过小资源请求。
  • 调整调度器参数,如Fair Scheduler的fairSharePreemptionTimeout
  • 使用资源共享模型,如Hadoop的JVM重用(仅MapReduce)。

🐰4. Q:YARN中如何提升任务的数据本地性?

A:
数据本地性对性能影响巨大,可通过以下方式优化:

  • 确保HDFS和YARN节点部署在同一主机上。
  • 增加NodeManager数量,提高本地匹配概率。
  • 调整调度器配置,提升本地性优先级。
  • 使用延迟调度机制(Delay Scheduling),允许短暂等待本地节点空闲。

🐉5. Q:YARN中ResourceManager HA是如何实现的?需要注意哪些事项?

A:
ResourceManager HA通过ZooKeeper实现主备切换,步骤如下:

  • 配置两个RM实例,分别处于Active和Standby状态。
  • 配置ZooKeeper集群用于元数据同步。
  • 开启自动故障转移功能:
<property>
  <name>yarn.resourcemanager.ha.enabled</name>
  <value>true</value>
</property>

注意事项包括:

  • 确保共享状态存储(如ZK、ATS)一致性。
  • 备RM需能快速恢复应用状态。
  • 应用程序需具备容错能力(如AM重启)。

🐍6. Q:YARN中NodeManager频繁重启导致任务失败,应如何排查?

A:
排查步骤如下:

  1. 检查NodeManager日志是否有OOM、GC异常。
  2. 查看系统日志 /var/log/messages/var/log/syslog
  3. 检查磁盘空间是否已满。
  4. 确认NM心跳是否正常发送到RM。
  5. 检查网络是否中断或不稳定。
  6. 检查是否因Cgroups资源限制触发Kill。

🐴7. Q:如何通过监控工具分析YARN资源利用率并优化集群?

A:
常用工具及方法包括:

  • YARN Web UI:查看实时资源使用情况。
  • Prometheus + Grafana:采集JMX指标并可视化。
  • Cloudera Manager / Ambari:提供完整的资源分析面板。
  • 监控指标建议包括:总资源、已分配资源、运行中的任务数、队列资源使用率等。

🐐8. Q:YARN中如何解决资源碎片化问题?

A:
资源碎片化是指集群中存在大量无法满足新任务需求的小块资源。解决方案包括:

  • 合理设置Container资源请求值(不要过小)。
  • 启用资源预留机制(Reservation System)。
  • 启用抢占(Preemption)释放空闲资源。
  • 动态调整资源队列容量,合理分配长期任务和短期任务。

🐵9. Q:YARN中如何优化ApplicationMaster的资源调度效率?

A:
ApplicationMaster是每个任务的核心组件,优化其调度效率可以从以下方面入手:

  • 为AM分配足够的内存和CPU资源。
  • 减少AM启动时间,避免频繁拉取依赖包。
  • 对Spark作业启用Executor动态分配。
  • 合理设置AM尝试次数和超时时间。

🐔10. Q:YARN中如何处理任务执行慢的问题?可能原因有哪些?

A:
任务执行慢的可能原因包括:

  • 数据本地性差,任务不在数据所在节点运行。
  • Container资源不足(内存或CPU)。
  • 网络带宽瓶颈。
  • JVM GC频繁。
  • 磁盘读写性能差。

排查方法:

  • 查看任务日志定位瓶颈。
  • 使用Web UI查看任务运行时间线。
  • 分析YARN metrics监控指标。

🐶11. Q:YARN中如何配置动态资源分配(如Spark)?

A:
Spark on YARN可启用动态资源分配以提高资源利用率:

--conf spark.dynamicAllocation.enabled=true \
--conf spark.dynamicAllocation.maxExecutors=20 \
--conf spark.dynamicAllocation.minExecutors=2 \
--conf spark.dynamicAllocation.initialExecutors=5

该机制可根据负载自动伸缩Executor数量,减少资源浪费。


🐖12. Q:YARN中如何做任务级别的资源回收?

A:
任务完成后,其占用的Container资源会被YARN自动回收。也可以通过命令手动杀死任务:

yarn application -kill <application_id>

此外,可配置任务超时自动清理:

<property>
  <name>yarn.nodemanager.sleep-delay-before-sigkill.ms</name>
  <value>2500</value>
</property>

🐘13. Q:YARN中如何查看某个节点的资源使用情况?

A:
可以通过以下方式查看:

  • 使用命令:
    yarn node -list -showDetails
    
  • 或者访问YARN Web UI → Nodes页面,点击具体节点查看详情。

🐿14. Q:YARN中如何配置资源队列的弹性伸缩?

A:
在Fair Scheduler中可以配置队列的min和max资源比例,实现弹性伸缩。例如:

<queue name="default">
  <minResources>10240mb,5vcores</minResources>
  <maxResources>20480mb,10vcores</maxResources>
</queue>

这表示该队列最少保证10GB内存和5个vCore,最多可扩展至20GB和10个vCore。


🦔15. Q:YARN中如何启用HTTPS安全访问?

A:
yarn-site.xml中启用SSL:

<property>
  <name>yarn.http.policy</name>
  <value>HTTPS_ONLY</value>
</property>
<property>
  <name>yarn.resourcemanager.webapp.https.address</name>
  <value>rm-host:8090</value>
</property>

🦊16. Q:YARN中如何启用Kerberos认证?

A:
需要配置Kerberos Realm、Principal、Keytab文件等信息,并在yarn-site.xml中开启安全模式:

<property>
  <name>yarn.nodemanager.principal</name>
  <value>yarn/_HOST@REALM</value>
</property>
<property>
  <name>yarn.nodemanager.keytab</name>
  <value>/etc/security/keytabs/yarn.service.keytab</value>
</property>
<property>
  <name>yarn.security.enabled</name>
  <value>true</value>
</property>

🐼17. Q:YARN中如何做任务失败的自动重试?

A:
YARN本身不直接提供任务重试机制,通常由ApplicationMaster(如MapReduce、Spark)实现任务失败重试逻辑。也可以通过配置作业参数控制最大重试次数,例如:

<mapreduce.map.maxattempts>4</mapreduce.map.maxattempts>

🐳18. Q:YARN中如何优化ApplicationMaster的资源使用?

A:
ApplicationMaster作为每个应用的管理者,合理配置其资源对整体性能很重要。建议:

  • 设置合适的内存和CPU资源(tez.am.resource.memory.mb=8192mb)。
  • 启用ApplicationMaster重试机制(tez.am.max.app.attempts=5;tez.am.task.max.failed.attempts=12)。
  • 避免AM频繁失败,影响任务调度。
  • 对于Spark应用,可适当降低Executor数量以减少AM负载。

🦈19. Q:YARN中如何启用Linux Cgroups进行资源隔离?

A:
通过配置NodeManager启用CGroups资源隔离:

<property>
  <name>yarn.nodemanager.linux-container-executor.cgroups.mount</name>
  <value>true</value>
</property>
<property>
  <name>yarn.nodemanager.resource-plugins</name>
  <value>yarn.io/cgroups</value>
</property>

这样可以更精细地控制每个Container使用的CPU和内存资源。


🦐20. Q:YARN中如何查看ApplicationMaster的日志?

A:
使用命令:

yarn logs -applicationId <application_id>

也可以通过Web UI访问对应应用的日志链接。


🍔21. Q:YARN中如何配置资源预热池?

A:
资源预热池(Warm-up Containers)可用于加速任务启动,适用于Spark等交互式场景。可在Spark提交参数中配置:

--conf spark.dynamicAllocation.warmup=true \
--conf spark.dynamicAllocation.localityWait=3s

YARN本身未原生支持,但可通过调度器插件实现类似机制。


⚽22. Q:YARN中如何实现跨集群资源调度?

A:
YARN原生不支持跨集群调度,但可通过联邦(Federation)机制实现:

  • 使用YARN Federation将多个YARN集群组合成一个统一的虚拟集群。
  • ResourceManager之间通过Router进行协调。
  • 支持按用户、队列等方式路由到不同子集群。

🏀23. Q:YARN中如何防止恶意任务耗尽集群资源?

A:
可通过以下方式防范恶意任务:

  • 设置用户/队列的最大并发任务数。
  • 限制单个任务的最大资源请求。
  • 启用资源抢占机制。
  • 使用ACL控制提交权限。
  • 结合Ranger/Sentry做细粒度权限控制。

🏐24. Q:YARN中如何优化任务调度延迟?

A:
调度延迟主要受资源匹配速度影响,优化方法包括:

  • 提高资源匹配效率(如增加NodeManager数量)。
  • 使用延迟调度(Delay Scheduling)提升数据本地性。
  • 减少调度器锁竞争(如升级到Capacity Scheduler改进版本)。
  • 避免资源碎片化。

🏸25. Q:YARN中如何配置资源保留策略?

A:
资源保留(Reservation System)允许为特定任务预留资源。配置如下:

<property>
  <name>yarn.resourcemanager.reservation-system.enable</name>
  <value>true</value>
</property>
<property>
  <name>yarn.resourcemanager.reservation-system.class</name>
  <value>org.apache.hadoop.yarn.server.resourcemanager.reservation.PlanBasedReservationSystem</value>
</property>

🎱26. Q:YARN中如何实现长任务的资源保障?

A:
对于长任务(如Spark Streaming),可采取以下措施:

  • 将任务放入高优先级队列。
  • 设置最小资源保障。
  • 启用动态资源分配,按需伸缩。
  • 配置资源抢占机制,确保资源不被挤占。

🐊27. Q:YARN中如何查看历史任务的资源使用情况?

A:
可通过Timeline Server查看历史任务信息:

  • 访问 Timeline Server Web UI,默认端口为8188。
  • 使用命令:
    yarn timeline -listEntities -entityType YARN_APPLICATION
    

🐬28. Q:YARN中如何配置资源调度策略为Dominant Resource Fairness(DRF)?

A:
Fair Scheduler支持DRF调度策略,更适合多维资源调度。配置如下:

<fairSharePolicy>drf</fairSharePolicy>

DRF会根据内存和CPU的综合使用情况进行公平调度。


🐧29. Q:YARN中如何实现容器级别的资源监控?

A:
可通过以下方式实现容器级别监控:

  • NodeManager暴露JMX接口,采集Container资源使用数据。
  • 使用Prometheus + Node Exporter + Hadoop JMX Exporter。
  • 配合Grafana展示每个Container的CPU、内存、IO等指标。

🐚30. Q:YARN中如何实现任务级别的优先级调度?

A:
YARN支持任务优先级调度,尤其在Fair Scheduler中表现良好。配置如下:

<property>
  <name>yarn.scheduler.fair.preemption</name>
  <value>true</value>
</property>
<property>
  <name>yarn.scheduler.fair.assignMultiple</name>
  <value>true</value>
</property>

然后在提交任务时指定优先级:

yarn jar your_app.jar -D mapreduce.job.priority=HIGH
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐