欢迎光临
我们一直在努力

Hadoop yarn深入详解

一、什么是 Hadoop Yarn

YARN(Yet Another Resource Negotiator)是 Hadoop 2.x 及以上版本的资源管理和作业调度平台。它将原 Hadoop 的资源管理和作业调度功能独立出来,成为一个通用的、可扩展的资源管理系统,可以支持 MapReduce、Spark、Tez、Flink 等多种计算框架。


二、Yarn 的核心架构

Yarn 的架构主要由以下几个核心组件组成:

  • ResourceManager(RM)
    集群级资源管理和调度中心,负责资源分配、作业调度和监控。

  • NodeManager(NM)
    节点级资源管理器,负责本节点资源的监控、容器管理和任务执行。

  • ApplicationMaster(AM)
    每个应用(如一个 MapReduce 作业)有自己的 AM,负责应用的生命周期管理、资源申请、任务调度、容错等。

  • Container
    资源分配的基本单元,包含一定的 CPU、内存等资源,由 NM 启动和管理,AM/Task 在其中运行。

  • Client
    用户提交作业的入口,负责与 RM 交互提交应用。


  • 三、Yarn 的工作流程

  • 作业提交
    Client 向 ResourceManager 提交应用请求。

  • 启动 ApplicationMaster
    ResourceManager 分配第一个 Container,用于启动 AM。

  • 资源申请与分配
    AM 向 RM 申请更多资源(Container)来运行任务。RM 根据资源调度策略分配 Container。

  • 任务运行
    AM 通知 NM 在分配的 Container 上启动任务。NM 负责容器的生命周期和任务监控。

  • 任务监控与容错
    AM 监控任务执行进度,失败时可重新申请资源、重启任务。

  • 应用完成
    所有任务完成后,AM 通知 RM 应用结束,释放所有资源。


  • 四、Yarn 资源调度机制

    1. 调度器类型

    • FIFO Scheduler
      先到先服务,简单但不适合多租户和资源公平场景。

    • Capacity Scheduler
      支持多队列、队列配额、优先级,适合大规模多租户环境。

    • Fair Scheduler
      资源平均分配,保证各应用公平获取资源。

    2. 资源分配原理

    • 资源以 Container 为单位分配,每个 Container 包含一定的 CPU、内存等资源。
    • 调度器根据资源剩余情况、队列配额、优先级等分配 Container。
    • 支持资源预留、抢占、动态调整等高级调度策略。

    五、组件功能详解

    1. ResourceManager

    • 管理整个集群的资源
    • 负责 ApplicationMaster 的启动和终止
    • 维护所有节点的心跳和状态
    • 各种调度策略的实现

    2. NodeManager

    • 管理本节点的资源和容器
    • 负责启动、监控、停止 Container
    • 向 RM 定期汇报资源使用和任务状态

    3. ApplicationMaster

    • 为每个应用独立运行
    • 负责申请资源、调度任务、监控进度
    • 处理任务失败与重试

    4. Container

    • 资源分配的最小单元
    • 运行实际的任务进程(如 Map、Reduce、Spark Executor)

    六、Yarn 的高可用与容错机制

    • ResourceManager HA:支持主备切换,避免单点故障。
    • NodeManager 容错:节点故障时,任务可在其他节点重启。
    • ApplicationMaster 容错:AM 故障时可自动重启,任务状态恢复。

    七、Yarn 与 Hadoop 1.x 的区别

    功能Hadoop 1.xHadoop 2.x (Yarn)
    资源管理 JobTracker ResourceManager + NodeManager
    任务调度 JobTracker ApplicationMaster
    支持计算框架 仅 MapReduce MapReduce, Spark, Tez, Flink 等
    扩展性 较差 极强

    八、Yarn 常见问题与优化建议

  • 资源分配不均
    优化调度器配置,合理设置队列配额、优先级。

  • 资源碎片化
    调整 Container 最小/最大资源配置,减少资源碎片。

  • 节点压力过大
    合理配置 NM 的资源上限,监控节点负载。

  • AM/Container 启动慢
    优化 JVM 参数、网络、磁盘 IO。

  • 高可用配置
    配置 RM HA,启用 Zookeeper 协调。


  • 九、Yarn 生态扩展

    • 支持多种计算框架:Spark、Flink、Tez、Storm 等均可运行在 Yarn 上。
    • 资源隔离与安全:支持 Linux 容器(cgroups)、Kerberos 认证等。
    • 监控与管理:通过 Web UI、CLI、REST API 监控作业、节点、资源使用情况。

    十、Yarn 源码解析与学习建议

    • Yarn 源码主要在 Hadoop 的 hadoop-yarn 子项目中。
    • 关键类:
      • ResourceManager
      • NodeManager
      • ApplicationMaster
      • Container
      • Scheduler(如 CapacityScheduler, FairScheduler)
    • 推荐阅读官方文档和源码注释,结合实际集群环境调试和实验。

    十一、YARN核心组件交互流程详解

    1. 应用提交与启动流程

  • Client 提交应用
    Client 进程向 ResourceManager(RM)提交应用请求,包括应用的 jar 包、启动参数等。

  • RM 分配 ApplicationMaster
    RM 根据调度策略,为该应用分配第一个 Container,并在对应的 NodeManager(NM)上启动 ApplicationMaster(AM)。

  • AM 启动与资源申请
    AM 启动后,向 RM 注册自己,然后根据应用需求向 RM 申请更多资源(Container)。

  • RM 分配 Container
    RM 根据调度器算法(如 Capacity/Fair),将 Container 分配给合适的 NM。

  • NM 启动任务进程
    NM 收到分配通知后,在本地启动 Container,运行具体的任务(如 Map/Reduce/Spark Executor)。

  • 任务执行与监控
    AM 负责监控所有任务的运行状态,失败时重试,成功时收集结果。

  • 应用完成与资源释放
    所有任务完成后,AM通知RM,RM释放所有资源,NM清理Container。

  • 2. 心跳与状态汇报

    • NM 定期向 RM 发送心跳包,汇报本节点资源使用、Container状态等。
    • AM 定期向 RM 汇报应用进度。
    • RM 维护集群全局状态,发现节点故障时可重新调度任务。

    十二、YARN调度器实现原理

    1. Capacity Scheduler

    • 队列树结构:每个队列可配置容量(百分比),支持多级队列嵌套。
    • 资源分配流程:
      • 资源请求 -> 计算队列容量 -> 分配Container -> 剩余资源继续分配
    • 优先级与抢占:支持应用优先级,资源不足时可抢占低优先级任务的资源。

    2. Fair Scheduler

    • 公平分配:所有应用按需平均分配资源,动态调整。
    • 池化队列:支持资源池,池间资源可动态流动。
    • 抢占机制:支持自动抢占,保证公平。

    3. 调度器源码入口

    • org.apache.hadoop.yarn.server.resourcemanager.scheduler
    • 核心类:CapacityScheduler, FairScheduler, SchedulerApplicationAttempt

    十三、YARN高可用机制(HA)

    1. ResourceManager HA

    • 主备模式:两个 RM 实例(Active/Standby),通过 ZooKeeper 协调状态。
    • 状态同步:Active RM 所有关键状态(应用、队列、资源)都同步到 ZK,Standby RM随时可接管。
    • 故障切换流程:
    • Active RM故障,ZK感知后切换Standby为Active。
    • 新Active RM从ZK恢复状态,继续调度。

    2. NodeManager容错

    • NM故障时,RM通过心跳超时检测,重新调度丢失的Container到其他NM。

    3. ApplicationMaster重启

    • 支持AM自动重启(max-attempts配置),失败后重新分配Container并恢复任务进度。

    十四、应用生命周期管理与容错

    1. ApplicationMaster的职责

    • 向RM注册应用
    • 申请资源、分配任务
    • 监控任务进度、处理失败重试
    • 汇报最终结果、释放资源

    2. 容错机制

    • AM失败重启:配置yarn.app.mapreduce.am.max-attempts,自动重启AM。
    • 任务失败重试:AM监控任务,失败时重新分配Container,重启任务。
    • 黑名单机制:多次失败的NM可被AM拉黑,避免任务再次分配到故障节点。

    十五、YARN监控与诊断

    1. Web UI

    • ResourceManager UI:查看应用、队列、节点、资源使用情况。
    • NodeManager UI:查看本节点Container和任务状态。
    • 历史服务器 UI:查询已完成/失败应用的历史信息。

    2. 命令行工具

    • yarn application -list:列出所有应用
    • yarn node -list:列出所有节点
    • yarn logs -applicationId <id>:查看应用日志

    3. REST API

    • 可通过 HTTP 接口查询应用、节点、队列等状态,支持集群自动化运维与监控。

    十六、YARN资源配置与优化

    1. 配置参数

    • yarn.nodemanager.resource.memory-mb:NM可用最大内存
    • yarn.nodemanager.resource.cpu-vcores:NM可用CPU核数
    • yarn.scheduler.minimum-allocation-mb:Container最小分配内存
    • yarn.scheduler.maximum-allocation-mb:Container最大分配内存
    • yarn.resourcemanager.scheduler.class:调度器类型

    2. 优化建议

    • 合理设置Container资源,减少资源碎片。
    • 根据业务需求选择调度器类型。
    • 配置队列容量和优先级,保证关键应用资源。
    • 启用RM HA,提升集群稳定性。
    • 利用Web UI和监控工具,及时发现和排查问题。

    十七、YARN源码学习建议

  • 核心包位置

    • hadoop-yarn-server-resourcemanager
    • hadoop-yarn-server-nodemanager
    • hadoop-yarn-common
  • 重要类推荐阅读

    • ResourceManager.java
    • NodeManager.java
    • ApplicationMaster.java
    • Container.java
    • CapacityScheduler.java
    • FairScheduler.java
  • 调试建议

    • 搭建本地小型YARN集群,结合源码阅读和日志分析。
    • 使用IDE断点调试关键流程,如应用提交、资源分配、容器启动。

  • 十八、YARN与新一代资源管理框架对比

    特性YARNKubernetesMesos
    资源模型 Container(CPU/内存) Pod(多容器) 多资源(CPU/内存/端口)
    调度算法 Capacity/Fair/FIFO 多层调度、弹性 多层调度
    生态兼容 Hadoop/Spark/Flink/Tez等 云原生/大数据/微服务 多种框架
    高可用 主备RM 多主节点 多主节点

    十九、常见问题排查思路

    • 应用长时间等待资源:检查队列容量、优先级、资源配置,查看调度器日志。
    • 节点频繁失联:检查NM日志、网络、硬件健康状况。
    • Container频繁失败:查看应用日志,分析任务代码、资源分配是否合理。
    • RM频繁重启:检查ZK配置、RM日志,排查主备切换原因。
    赞(0)
    未经允许不得转载:171主机测评 » Hadoop yarn深入详解
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址