在 MapReduce 应用程序的启动过程中,最重要的就是要把 MapReduce 程序分发到大数据集群的服务器上,在上文介绍的 Hadoop 1 中,这个过程主要是通过 TaskTracker 和 JobTracker 通信来完成。早期服务器集群资源调度管理和 MapReduce 执行过程耦合在一起,如果想在集群中运行其他计算任务,比如 Spark,就无法统一使用集群中的资源。于是Hadoop2 做了一个大变更:把 MapReduce 的资源管理和计算框架分开,将 Yarn 从 MapReduce 中分离出来,成为一个独立的资源调度框架。为了实现解耦,需要原JobTracker 的功能进行拆分,全局资源管理能力拆给ResourceManager,单个应用程序管理​​的职责交给了 ​​ApplicationMaster。

图片来源:极客时间

从图上看,Yarn 包括两个部分:一个是资源管理器(ResourceManager),一个是节点管理器(NodeManager)。这是 Yarn 的两种主要进程:ResourceManager 进程负责整个集群的资源调度管理,通常部署在独立的服务器上;NodeManager 进程负责具体服务器上的资源和任务管理,在集群的每一台计算服务器上都会启动。在部署特辑里,集群成功启动后,在每台机器上jps 就可以看到节点的部署情况。

一个应用在 YARN 上的典型生命周期:

  1. ​​应用提交​​:客户端向 RM 提交应用程序。
  2. ​​AM 容器分配​​:RM 为应用程序分配第一个 Container,并与对应的 NM 通信,要求它在这个 Container 中启动该应用的 ApplicationMaster。
  3. ​​AM 注册与资源申请​​:AM 向 RM 注册,然后根据任务需求(如需要启动多少个 Map Task)周期性地向 RM 申请资源。
  4. ​​启动任务容器​​:AM 拿到 RM 分配的 Container 后,与对应的 NM 通信,要求它启动具体的任务(如一个 Map Task)。
  5. ​​进度监控与完成​​:运行中的任务通过 AM 汇报进度。应用完成后,AM 向 RM 注销并关闭自己。

从生命周期可以看到,每个AM都会去申请资源,当有多个租户都使用一个集群时,不同租户之间怎么实现资源的互不干扰,这是Yarn 资源隔离要解决的首要问题。

ARN的资源隔离主要通过以下三个层次协同工作:

资源调度(逻辑隔离)​​

由RM 完成。RM 是集群资源的全局仲裁者,它通过可插拔的​​调度器​​(如容量调度器 Capacity Scheduler或公平调度器 Fair Scheduler)将集群资源划分为多个逻辑队列

  • ​​队列划分​​:管理员可以按团队、项目或应用类型创建队列(如 root.production.etlroot.research.ad_hoc),并为每个队列分配固定的资源容量(capacity)或权重(weight),以及设置最大资源使用上限(maximum-capacity
  • ​​多资源类型调度​​:先进的调度器(如支持主导资源公平算法 DRF 的公平调度器)能同时考虑 CPU、内存等多种资源类型,更智能地实现公平分配

​​容器运行时隔离(物理隔离)​​

  • 这是最关键的环节,在各个NM上执行。当 RM 分配资源后,NM 负责在物理节点上启动和管理 ​​Container​​,并为每个 Container 提供资源隔离的执行环境。YARN 对不同类型的资源采用了不同的隔离策略,具体对比如下:

内存 ​

关键性资源,不足直接导致进程死亡

​进程树监控 (默认) + Cgroups (可选)​

- ​​进程树监控​​:NM 周期性监控 Container 进程树的内存使用总量。若超过设定上限,则终止容器。为避免 Java 进程 "fork()+exec()" 模型因写时复制导致子进程启动瞬间内存虚高而误杀,YARN 引入了"进程年龄"概念进行判断优化。
- ​​Cgroups 内存子系统​​:可配置使用 Cgroups 的 memory.limit_in_bytes设置硬性上限,超限会触发内核 OOM Killer 终止容器。这种方式更严格,但缺少对"fork()+exec()"场景的优化,可能因启动峰值导致误杀。

​CPU​

弹性资源,不足通常导致任务变慢

​Cgroups (主要方式)​

- ​​份额分配 (cpu.shares)​​:通过设置相对权重(如1024表示1个CPU核心的份额)来分配CPU时间。这是一种弹性限制,允许容器在节点CPU空闲时使用超出其份额的资源,保证公平的同时提高利用率。
- ​​绝对限制 (cpu.cfs_quota_us/period_us)​​:可硬性限制容器在特定周期内能使用的最大CPU时间,确保严格的上限。

​I/O (磁盘与网络)​

隔离最复杂

​Cgroups (blkio, net_prio 子系统)​

相对于CPU和内存,I/O资源的隔离在YARN中更为复杂且仍在不断改进。YARN仿照"虚拟CPU"的概念引入了"虚拟磁盘"进行资源量化,并初步尝试使用Cgroups的blkio等子系统实现磁盘I/O隔离。

安全与访问控制​​

这一层确保资源不被未授权访问。

更多推荐