最后更新于
最后更新于
由于原来的MapReduce架构中的JobTracker结点承担了太多的任务, 新框架中将其功能进行了拆分. 拆分成了两个独立的服务:
ResourceManager: 全局的资源管理器, 专门负责资源管理和调度.
ApplicationMaster: 负责每个应用的资源管理, 任务调度, 容错等工作, 每个应用程序对应一个ApplicationMaster
整体的架构如下图:
详细来说ResourceManager, ApplicationMaster, NodeManager三者的作用.
ResourceManager控制整个集群计算资源的分配. 将各部分资源(CPU, 内存, 带宽等)安排给NodeManager, 并与NodeManager一起启动和监视ApplicationMaster应用程序. 具体来说有以下作用:
处理客户端(Client)请求
启动和监控每个job所属的ApplicationMaster
监控NodeManager
集群资源的分配与调度
单个作业的资源管理和任务监控. 管理协调ResourceManager分配给这个应用的资源, 并通过NodeManager监视资源容器的执行和资源的使用. 总的来说, ApplicationMaster有以下的作用:
负责数据的切分
为应用程序, 向ResourceManager申请资源(容器), 并分配给应用的子任务
启动任务, 对任务进行监控和容错
单个节点的资源管理和监控. 每个结点将其资源(CPU, 内存, 带宽等)划分成Container, 是YARN架构中的资源单位. 因此NodeManager管理着这个结点上的所有Container. NodeManager作用有:
负责Container状态的维护(处理来自ResourceManager和ApplicationMaster的命令)
向ResourceManager保持心跳
YARN会为每个任务分配一个Container, 且该任务只能使用该Container中描述的资源.
当用户提交了一个应用之后, 整个过程如下:
Job submission(作业提交)
Client向ResourceManager提交一个应用/作业, 从ResourceManager获取一个Application ID(应用ID/作业ID).
Client计算得到输入分片, 将作业资源(job jar, 配置文件, 分片信息)拷贝到HDFS
Client再向ResourceManager提交作业
Job initialization(作业初始化)
ResourceManager将作业递交给Scheduler(调度器), Scheduler为作业分配第一个Container, ResourceManager同时于这个Container所在结点的NodeManager通信, NodeManager在这个Container中加载这个Job(作业/应用)的ApplicationMaster. ApplicationMaster再向ResourceManager注册. 因此就可以通过ResourceManager查看这个Job的运行状态.
这个被创建的ApplicationMaster被交给所处结点的NodeManager管理监控.
ApplicationMaster获取这个Job的分片, 为每一个分片对应创建一个Map Task, 或Reduce Task
Task assignment(任务分配)
ApplicationMaster向ResourceManager申请资源(Container), 根据输入分片所在的结点, 根据data locality, 分配给输入数据分片附近的结点的Container.
Task execution(任务运行)
ApplicationMaster根据ResourceManager分配Container的情况, 与对应的NodeManager的通信, 启动这些Container, 读取每个任务(Task)所需的数据(job jar, 配置文件等), 然后执行该任务.
Progress and status update(进度和状态更新)
Task定时将任务的进度和状态报告给ApplicationMaster, Client定时向ApplicationMaster获取整个任务的进度和状态.
Job completion(作业完成)
Client定时检查整个作业是否完成, 作业完成后, 清空临时文件, 目录等
ApplicationMaster向ResourceManager注销, 并关闭自己