Hadoop中YARN 采用了怎样的主从(Master/Slave)架构?
Hadoop YARN(Yet Another Resource Negotiator)采用了经典的主从(Master/Slave)架构。
在 YARN 的设计中,它将早期的 Hadoop 1.x 中 JobTracker 的两大核心功能——资源管理和作业调度/监控进行了拆分,交由不同的组件来处理。
具体来说,YARN 的主从架构由以下几个核心组件构成:
一、 主节点(Master):ResourceManager (RM)
ResourceManager 是整个 YARN 集群的“大脑”,也是主从架构中的 Master。它通常运行在一个独立的节点上,负责整个集群计算资源的统一管理和分配。
ResourceManager 内部包含两个核心子组件:
- 调度器(Scheduler):
- 职责: 根据容量、队列等限制条件,将系统中的资源分配给各个正在运行的应用程序。
- 特点: 它是一个“纯粹”的调度器。它不从事任何与具体应用程序相关的工作(比如不负责监控应用程序状态,不负责重启失败的任务),只负责将资源(内存、CPU)以 Container(容器) 的形式分配出去。
- 应用程序管理器(ApplicationsManager, ASM):
- 职责: 负责接收客户端提交的作业请求。
- 工作: 为应用程序分配第一个 Container,用来启动该应用程序的“管家”——ApplicationMaster。它还负责监控 ApplicationMaster,并在其失败时进行重启。
二、 从节点(Slave):NodeManager (NM)
NodeManager 是 YARN 集群中的工作节点,也就是主从架构中的 Slave。它运行在集群的每一个数据节点(DataNode)上。
- 职责: 负责管理本节点上的计算资源。
- 主要工作:
- 定时向 ResourceManager 汇报本节点的资源使用情况和各个 Container 的运行状态(通过心跳机制)。
- 接收并处理来自 ApplicationMaster 的启动/停止 Container 的请求。
- 监控本节点上 Container 的资源(内存、CPU等)使用情况,如果某个 Container 使用超量,NM 会将其强行杀死,以保护节点不被拖垮。
三、 YARN 架构中的其他关键角色
虽然 YARN 整体是主从架构,但为了实现“资源管理与作业调度解耦”,它还引入了两个极其重要的动态组件:
ApplicationMaster (AM) - “应用程序管家”
- 定位: 每个提交到 YARN 的应用程序(如一个 MapReduce 作业、一个 Spark 作业)都会动态生成一个专属的 ApplicationMaster。
- 职责: 它负责向 ResourceManager(的调度器)申请资源(Containers),拿到资源后,它会与对应的 NodeManager 通信,要求它们在 Container 中启动具体的任务。同时,AM 负责监控这些任务的运行状态、处理任务失败、重新申请资源等。
- 优势: 以前这些工作都是由 Master (JobTracker) 做的,导致 Master 压力巨大。现在交给了各个作业专属的 AM 去做,大大减轻了 Master 的负担。
Container - “资源容器”
- 定位: YARN 中的资源抽象单位。
- 包含: 封装了某个节点上的多维度资源(如 内存、CPU、磁盘、网络等)。所有的应用程序任务(Task)以及 ApplicationMaster 本身,都是运行在 Container 中的。
四、 主从架构的协同工作流程(作业提交过程)
为了更好理解 Master 和 Slave 是如何配合的,我们可以看一个作业提交的简要流程:
- 提交: 客户端向 Master (ResourceManager) 提交一个应用程序。
- 启动 AM: RM 找到一台有空闲资源的 Slave (NodeManager),分配一个 Container,并在其中启动该作业的 ApplicationMaster。
- 申请资源: ApplicationMaster 启动后,向 RM 注册,并根据自己作业的需求,向 RM 申请更多的 Container 资源。
- 分配与执行: RM 将资源分配给 AM。AM 拿到资源列表后,主动去找对应的各个 NodeManager(Slaves),要求它们启动 Container 并运行具体的计算任务(Task)。
- 监控: 任务运行期间,各个 NodeManager 向 AM 汇报任务状态;同时 NodeManager 也会向 RM 汇报节点的健康状况。
- 结束: 作业完成后,AM 向 RM 注销自己,释放所有资源。
总结
YARN 的主从架构可以概括为:
- 全局资源老板 (Master) = ResourceManager
- 地方资源主管 (Slave) = NodeManager
- 包工头 (动态生成) = ApplicationMaster
- 工位/资源包 = Container
这种架构设计的最大好处是解耦和高扩展性,使得 YARN 不仅能运行 MapReduce,还能完美支持 Spark、Flink 等多种计算框架,成为了真正的大数据操作系统的“资源调度内核”。