Yarn目录
一、Yarn基本架构
Yarn主要由 ResourceManager、 NodeManager、 ApplicationMaster和 Container等组件构成。
1.ResourceManager
ResourceManager是 YARN中的全局资源管理器,相当于将集群中各个机器可用的资源看做一个整体,然后进行统一管理和分配,它会接收来自各个节点NodeManager)的资源回报信息,并将这些信息按照一定的策略分配给应用程序。
1.1 主要功能
- 与客户端交互,处理来自客户端的请求,Client提交Job,首先是由ResourceManager来反馈;
- 启动或监控ApplicationMaster;
- 管理NodeManager,监控NodeManager心跳,发送指令给 NodeManager;
- 资源管理和调度,接受来自ApplicationMaster的资源申请请求并向让NodeManager为之分配资源;
1.2 核心组成
- Resource Scheduler(资源调度器):主要负责协调集群中各个应用的资源,分配,保证整个集群的运行效率。
- ApplicationManager(应用管理器):主要负责接收用户应用的提交请求为应用程序分配第一个Container来运行 ApplicationMaster,还有就是负责监控ApplicationMaster,并在遇到失败时重启ApplicationMaster运行的Container;
2.NodeManager
NodeManager运行在集群的节点上,这一点从前面安装分布式环境中可以看出,一般NodeManager会与DataNode在同一个节点。NodeManager在集群中会有多个,负责管理每个节点上的资源。它主要负责接收来自ResouceManager的资源分配请求,分配具体的Container给具体的任务,同时,它还负责监控并报告Container使用信息给ResouceManager。NodeManager只负责管理自身节点上的Container,并不关心运行在Container上的任务的运行信息,任务的运行信息由ApplicationMaster来管理。
NodeManger主要作用:
- 管理单个节点上的资源;
- 监控 Container生命周期和使用的 资源;
- 处理来自 ResourceManager的指令;
- 处理来自 ApplicationMaster的指令;
3.ApplicationMaster
ApplicationMaster运行在Container中,它主要功能是向ResourceManager申请资源和NodeManager协同工作,运行应用的各个任务(比如 MapTask、ReduceTask),然后跟踪它们状态及监控各个任务的执行,遇到失败的任务还负责重启它。YARN中运行的每个应用程序都有一个自己独立的ApplicationMaster。
ApplicationMaster主要作用:
- 负责数据的切分。比如 MapReduce任务会根据InputSplit信息来进行数据切分;
- 为应用程序申请资源,并进一步分配给内部任务。比如 MapReduce任务,主要是为MapTask和ReduceTask申请运行资源来运行Task;
- 内部任务的监控和容错;
- 负责协调来自ResourceManager的 资源,并通过NodeManager监视任务的执行和资源使用情况;
ApplicationMaster启动后会和ResourceManager保持连接,定期向ResourceManager发送心跳( heartbeat),回报自己的健康信息。然后计算应用Application)需要的资源,然后跟 ResourceManager沟通,让ResourceManager给它分配Container,分配了 Container后,ApplicationMaster和 NodeManager沟通来加载Container运行任务。
4.Container
Container是Yarn框架的计算单元,是具体运行Task(如 MapTask、 ReduceTask)的基本单位。Container是一个动态资源分配单位,将内存、 CPU、磁盘、网络等资源封装在一起,限定了每个任务使用的资源量。
Container与集群节点的关系: 一个节点可以运行多个Container,但是需要明确的是Container不能跨多个机器 。任何一个用户提交的应用拆分后的任务都必须运行在一个或多个Container中。
二、Job提交全过程
1.作业提交
- client调用 job.waitForCompletion方法,向整个集群提交 MapReduce作业;
- client向 ResourceManager申请一个作业id;
- ResourceManager给Client返回作业id和该job资源的提交路径( HDFS路径),每一个作业都有一个唯一的id;
- client 核实作业的输出, 计算输入的 split, 将作业的资源 (包括 Jar 包,配置文件, split 信息) 拷贝给 HDFS;
- Client提交完资源后,向ResourceManager申请运行针对该job的 ApplicationMaster;
2.作业初始化
- 当 ResourceManager收到Client的请求后,将该 job添加到容量调度器Resouce Scheduler中;
- 某一个空闲的NodeManager领取到该 job;
- 该NodeManager创建 Container,并产生MrAppMaster;
- 下载 Client提交的资源到本地,根据分片信息生成 MapTask和ReduceTask;
3.任务分配
- MrAppMaster向ResouceManager申请运行多个MapTask任务资源;
- ResourceManager将运行MapTask任务分配给空闲的多个NodeManager,NodeManager分别领取任 务并创建容器(Container);
4.任务运行
- MrAppMaster向两个接收到任务的NodeManager发送程序启动脚本,每个接收到任务的NodeManager启动MapTask,MapTask对数据进行处理,并分区排序;
- MrAppMaster等待所有MapTask运行完毕后,向ResourceManager申请容器( Container),运行ReduceTask;
- 程序运行完毕后MrAppMaster会向ResourceManager申请注销自己;
- Yarn中的任务将其进度和状态 (包括counter)返回给应用管理器 , 客户端每秒向应用管理器请求进度更新 , 展示给用户;可以使用 Yarn WebUI查看任务执行状态;
5.任务完成
- 除了向应用管理器请求作业进度外, 客户端每 5分钟都会通过调用waitForCompletion()来检查作业是否完成。作业完成之后 , 应用管理器和container会清理工作状态。作业的信息会被作业历史服务器存储以备之后用户核查;
三、Hadoop资源调度器
1.先进先出调度器(FIFO)
FIFO Scheduler把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应用需求满足后再给下一个分配,以此类推。
FIFO Scheduler是最简单也是最容易理解的调度器,也不需要任何配置,但它并不适用于共享集群。大的应用可能会占用所有集群资源,这就导致其它应用被阻塞。在共享集群中,更适合采用 Capacity Scheduler或 Fair Scheduler,这两个调度器都允许大任务和小任务在提交的同时获得一定的系统资源。
2.容量调度器(Capacity Scheduler)
Capacity 调度器允许多个组织共享整个集群,每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。除此之外,队列内部又可以垂直划分,这样一个组织内部的多个成员就可以共享这个队列资源了,在一个队列内部,资源的调度是采用的是先进先出 (FIFO)策略。
支持多个队列,每个队列可配置一定的资源量,每个队列都采用FIFO调度策略。
为了防止同一个用户的作业独占队列中的资源,该调度器会对同一 用户提交的作业所占资源量进行限定 。
3.公平调度器(Fair Scheduler)
支持多队列,多用户 ,每个队列中的资源量可以配置,同一队列中的作业公平共享队列中所有资源。
比如有三个队列queue1、Queue2、Queue3,每个队列中的 job按照优先级分配资源,优先级越高分配的资源越多,但是 每个 job都会分配到资源以确保公平 。在资源有限的情况下,每个job理想情况下获得的计算资源与实际获得的计算资源存在一种差距,这个差距就叫做差额。在同一个队列中,job的资源缺额越大,越先获得资源优先执行。 作业是按照缺额的高低来先后执行的 。在Fair调度器中,我们不需要预先占用一定的系统资源,Fair调度器会为所有运行的 job动态的调整系统资源。
PS:如果有写错或者写的不好的地方,欢迎各位大佬在评论区留下宝贵的意见或者建议,敬上!如果这篇博客对您有帮助,希望您可以顺手帮我点个赞!不胜感谢!
原创作者:wsjslient |
参考来源:https://blog.youkuaiyun.com/qq_24693837/article/details/103742908 |