Hadoop 之 Yarn
Yarn的架构
-
ResourceManager:是yarn的老大,主要负责整个yarn的资源调度与分配。
- 处理客户端的任务请求。
- 监控NodeManager。
- 启动或监控ApplicationMaster。
- 负责资源的分配与调度。
-
NodeManager:是单个节点的管理者,主要负责单个节点上的资源并向ResourceManager汇报。
- 管理单个节点上的资源。
- 处理来自ResourceManager的命令。
- 处理来自ApplicationMaster的命令。
-
ApplicationMaster:是MapReduce的管理者,负责资源的申请。
- 为应用程序申请资源并分配内部任务。
- 负责任务的监控与容错。
说明:
- 如果某个NodeManager存在问题,导致节点挂掉,AppMaster会重新向ResourceManager申请节点资源资源。
- 如果某个节点的Container损坏,AppMaster也会重新向ResourceManager申请资源,ResourceManager分配一个除当前损坏节点外的空闲节点。
- 若AppMaster所在的节点损坏,会导致整个MapReduce任务失败。
-
Container:类似与一个容器。
- Container是yarn资源的抽象,封装了某个节点的多维度资源。
Yarn上Job的提交流程
-
客户端通过调用 waitForCompletion()方法向整个集群提交 MapReduce 任务。
-
然后客户端先向 ResourceManager申请一个Application。
-
ResourceManager 收到来自客户端的 Application请求后会向客户端返回一个资源提交的临时路径以及Application_id。
-
客户端开始提交任务,并根据 ResourceManage返回的资源提交临时路径去提交任务运行所需要的一些必要资源。
-
资源提交完毕后向 ResourceManager 申请运行 AppMaster。
-
ResourceManager 将客户端提交的任务初始化为一个Task,并将其放入容量调度器队列中等待。
-
当某个空闲节点NodeManager领取到该Task任务后,会创建一个Container,并启动AppMaster,然后Container会从HDFS中存放运行Job资源的路径中下载JOb资源到本地,如Jar包,并根据切片数量计算出相应的 MapTask个数。
-
待所有资源准备就绪后,AppMaster 开始向 ResourceManager 申请相应的 MapTask容器。
-
ResourceManager运行MapTask 任务并将其分配给其他 NodeManager节点。
-
领取到 ResourceManger分发的 MapTask 任务后开始创建 Container容器。
-
AppMaster 开始向领取到 MapTask 任务的 NodeManager 发送程序启动脚本,收到该脚本的NodeManager分别启动MapTask,然后 MapTask 开始对数据进行分区排序,最后归并排序。
-
AppMaster 待所有 MapTask 运行结束后开始向 ResourceManager 申请 Container 运行 ResourceTask,但通常情况下 AppMaster 不会等所有的 MapTask 任务运行结束后才开始申请资源,而是默认等到5%的MapTask 任务运行结束就开始向 ResourceManager 申请资源运行 ResourceTask。
-
ResourcrTask 启动后开始向 MapTask 获取相应分区的数据,并进行归并排序最后分组。
-
所有任务运行结束后 MapReduce向ResourceManager 申请注销自己。
Yarn调度器
- FIFO 先进先出: 支持单队列 、先进先出 生产环境不会用。
- Capacity Scheduler 容量调度器:支持多队列,保证先进入的任务优先执行,支持抢占式。 Apache默认。
- Fair Sceduler 公平调度器:支持多队列,保证每个任务公平享有队列资源,支持抢占式。 CDH默认。