第六周

YARN 作为 Hadoop 的资源管理与任务调度框架,其核心组件包括 ResourceManager、NodeManager 和 ApplicationMaster,它们协同工作实现集群资源的高效分配与任务管理。ResourceManager 作为 YARN 的核心,运行在主节点上,负责整个集群的资源管理与任务调度,主要包含 Scheduler 和 ApplicationsManager 两个模块。Scheduler 根据集群资源情况和调度策略,将 CPU、内存等资源分配给不同的应用程序;ApplicationsManager 则负责接收应用程序的提交请求,为应用程序启动 ApplicationMaster,并在 ApplicationMaster 故障时重新启动。
NodeManager 运行在从节点上,负责管理本节点的资源,执行 ResourceManager 分配的任务。NodeManager 会实时向 ResourceManager 汇报本节点的资源使用情况(如 CPU 使用率、内存剩余量等),并根据 ResourceManager 的指令,启动或停止 Container(容器)。Container 是 YARN 中资源分配的基本单位,每个 Container 包含一定量的 CPU、内存等资源,应用程序的任务(如 Map 任务、Reduce 任务)在 Container 中运行,确保不同任务之间的资源隔离,避免相互干扰。
ApplicationMaster 则是每个应用程序的 “管家”,由 ApplicationsManager 启动,负责与 ResourceManager 和 NodeManager 通信,协调应用程序的资源分配与任务执行。ApplicationMaster 会根据应用程序的需求,向 ResourceManager 申请资源(Container),并将申请到的资源分配给具体的任务,同时监控任务的执行状态,在任务故障时重新申请资源启动任务,确保应用程序顺利完成。
ResourceManager 与 NodeManager 的协作流程如下:首先,NodeManager 启动后,向 ResourceManager 注册,并周期性地汇报本节点的资源状态;当用户提交应用程序时,ApplicationsManager 为应用程序启动 ApplicationMaster;ApplicationMaster 向 ResourceManager 的 Scheduler 申请资源,Scheduler 根据调度策略为 ApplicationMaster 分配 Container;ApplicationMaster 获取 Container 后,向对应的 NodeManager 发送指令,启动 Container 并运行任务;任务执行过程中,NodeManager 实时监控 Container 的资源使用情况和任务执行状态,并汇报给 ApplicationMaster;任务完成后,ApplicationMaster 向 ApplicationsManager 汇报任务执行结果,ApplicationsManager 通知 ResourceManager 释放资源,整个流程结束。
多租户资源隔离是 YARN 的重要特性,通过队列配置可实现不同租户或应用程序之间的资源隔离,常见的调度器包括 FairScheduler 和 CapacityScheduler。FairScheduler 采用公平调度策略,确保每个应用程序都能获得公平的资源分配,当集群资源充足时,每个应用程序可获得足够的资源;当资源紧张时,FairScheduler 会根据应用程序的优先级和资源需求,调整资源分配,确保每个应用程序都能获得相对公平的资源。CapacityScheduler 则采用容量调度策略,为每个队列分配一定比例的集群资源,队列内的应用程序共享该队列的资源,同时允许队列之间共享资源(如某个队列资源空闲时,其他队列可借用其资源),确保集群资源的高效利用。
在 yarn-site.xml 文件中配置调度器类型为 CapacityScheduler:

yarn.resourcemanager.scheduler.class org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler 随后在 capacity-scheduler.xml 文件中配置队列: yarn.scheduler.capacity.root.queues dev,prod 定义根队列下的子队列,包括开发队列(dev)和生产队列(prod) yarn.scheduler.capacity.root.dev.capacity 40 为dev队列分配40%的集群资源 yarn.scheduler.capacity.root.prod.capacity 60 为prod队列分配60%的集群资源 yarn.scheduler.capacity.root.prod.maximum-capacity 80 prod队列最多可使用80%的集群资源(包括借用其他队列的空闲资源) 通过上述配置,可实现开发环境和生产环境的资源隔离,确保生产环境的应用程序获得足够的资源,保障业务稳定运行,同时开发环境的应用程序也能合理使用资源进行测试与开发。 在实战中,将 Spark 任务提交到 YARN 有 Cluster 模式和 Client 模式两种方式,它们在任务执行流程和适用场景上存在明显区别。在 Cluster 模式下,Spark 的 Driver 程序运行在 YARN 的 Container 中,用户提交任务后,客户端无需保持连接,任务会在 YARN 集群中独立运行。具体流程为:用户通过spark-submit命令提交任务,指定--master yarn --deploy-mode cluster参数;YARN 的 ResourceManager 接收任务请求,为任务启动 ApplicationMaster(同时作为 Driver 程序);ApplicationMaster 向 ResourceManager 申请资源,启动 Executor(运行在 Container 中);Executor 启动后与 Driver 程序通信,执行任务计算;任务完成后,ApplicationMaster 向 ResourceManager 汇报结果,释放资源。Cluster 模式适用于长时间运行的批处理任务,用户无需关注任务执行过程,只需等待任务完成即可。 在 Client 模式下,Spark 的 Driver 程序运行在用户提交任务的客户端机器上,客户端需要保持连接,直至任务完成。流程为:用户提交任务时指定--master yarn --deploy-mode client参数;ResourceManager 为任务启动 ApplicationMaster,但 ApplicationMaster 仅负责向 ResourceManager 申请资源,不承担 Driver 功能;ApplicationMaster 申请到资源后,启动 Executor 并与客户端的 Driver 程序通信;Driver 程序向 Executor 分配任务,监控任务执行状态;任务完成后,Driver 程序输出结果,客户端可直接查看。Client 模式适用于交互式任务(如 Spark Shell)或需要实时查看任务输出的场景,因为 Driver 运行在客户端,用户可实时获取任务执行日志和结果,但客户端机器故障会导致任务失败。
posted @ 2025-09-09 20:57  sword_kong  阅读(7)  评论(0)    收藏  举报