Hadoop~Yarn
一、 yarn概述
Yarn是一个资源调度平台
,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序。
Hadoop集群中Yarn跟HDFS没有直接的关系。
二、 Yarn的基础架构
Yarn由ResourceManager、NodeManager、ApplicationMaster、Container等组件构成。
-
ResourceManager
是Yarn中的重要部分,负责处理客户端请求、监控集群、资源调度分配等任务,是Yarn中的老大哥。 -
NodeManager
负责管理单个节点上的资源,处理来自RS和AM的命令。 -
ApplicationMaster
负责向RS申请资源,并且监控任务、提高容错。 -
Container
是一个容器,用来存放任务需要的各种资源(CPU、内存、网络带宽等)。
三、 Yarn的工作机制
1. yarn运行机制
yarn工作之前,需要从Client将要执行的MR程序提交到所在的NodeManager节点上。提交程序之后的工作流程如下:
- Client会向
ResourceManager
申请一个Application,RM会将Application的资源路径、HDFS的相关信息、application_id
返回给Client。 - Client获得相关信息之后,会提交当前Job需要的运行资源。并且产生
Job.split、Job.xml、jar包
。 - 以上步骤落地之后,Job所需的资源才算提交完毕,并且申请运行MRAppMaster。
- 运行开始,
RM
中会初始化一个Task
任务,这个Task就是当前Job的AppMaster,AppMaster会将当前Job提交到一个队列,等待NodeManger
领取任务。 -
NM
领取任务之后,会立刻创建一个Container
容器,用来存放Job的运行资源(硬件资源+AppMaster)。 -
AppMaster
会从HDFS将要计算的资源下载到NM
本地,并通过切片信息向RM申请若干MapTask。 - 资源申请完毕之后,
AM
会向MT发送启动程序脚本,MT开始并发执行。 - MT执行完毕后,
AM
会根据MT阶段的结果文件数量,向RM
申请RT的运行资源,并将MT的资源回收。 - 当RT运行结束之后,
AM
会跟RM
通信,并注销自己,释放资源。
yarn只有在接收到任务之后,才会跟HDFS有交集,操作数据进行运算。
2. yarn的作业提交机制
yarn的作业提交机制与运行机制的步骤大致相同,Client通过调用job.waitForCompletion
方法,向整个集群提交MR作业。
作业执行时,yarn会将任务的进度和状态返回给应用管理器,Client每秒
(可自行更改配置参数)向应用管理器请求更新进度,并展示给用户。
除了更新进度之外,Client每5秒
都会调用waitForCompletion()
方法检查作业是否完成,作业完成后,作业信息会被保存到历史服务器以备核查。
四、 yarn的调度算法
yarn有3种资源调度算法:FIFO
、容量调度器
(Capacity Scheduler)、公平调度器
(Fair Scheduler)
1. FIFO
FIFO是一种单队列
资源调度算法,遵循先进先出的规则,简单易懂。但是,由于FIFO不支持多队列,容易造成任务堵塞、灵活性很差,真实环境中很少使用此方案。
2. 容量调度器
容量调度器是yarn中默认的资源调度器。
是Yahoo开发的多用户资源调度器。
1. 容量调度器的特点
- 支持多队列:容量调度器底层使用多个队列,每个队列采用FIFO调度策略,并且可以为每个队列配置一定的资源。
- 容量有保证:管理员可以为每个队列设置最低资源保障 和最大资源限制。
- 灵活性高:因为上述特点,如果队列中的资源有空闲,空闲资源会被借给其他资源不足的队列。当借出资源的队列需要资源时,其他借调资源的队列会将资源返还。
- 多租户:容量调度器可以支持多个用户共享集群资源,并切支持多用户的程序同时运行。为了防止用户之间抢占资源,可以为每个用户设置资源限制。
2. 容量调度器的资源分配算法
1. 队列资源分配
使用深度优先算法,优先给资源占用率低的资源队列
分配资源。
2. 作业资源分配
按照Job提交的先后顺序和Job的优先级分配资源。
3.容器资源分配
- 按照容器(container)的优先级分配资源
- 如果容器的优先级相同,则按照本地优先原则,顺序依次如下:
- 任务和数据在
同一节点
- 任务和数据在
同一机架
- 任务和数据在
同一集群
3. 公平调度器
Fair Schedulere是Facebook开发的多用户
调度器。
1. 公平调度器的特点
公平调度器具备容量调度其的特点:
- 多队列
- 队列资源有保障
- 灵活性高
- 多租户
并且,公平调度器还有其他特点:
核心资源的调度策略不同
:
- 容量调度器优先分配给占用率低的队列
- 公平调度器优先分配给任务缺额大的队列
每个队列单独分配资源的方式不同
:
- 容量调度器:FIFO、DRF
-
公平调度器
:FIFO、DRF、FAIR
如果公平调度器选择FIFO的资源分配方式,那么就等于是容量调度器。
什么是缺额:
公平调度器在时间尺度上,为每一个队列分配的资源都是相同的。某一时刻上的Job的应获得的资源和实际获得的资源的差叫做缺额。
2. 公平调度器的资源分配方法
1. 队列资源分配
每个队列对集群的资源需求不同,首先将集群资源平均分配给所有队列,多分配资源的队列会将多余的资源让出。之后进行下一次计算,将多出的资源再次平均分配给资源不足的队列,以此类推,直到资源完全分配给每个队列。
2. 作业资源分配
公平调度器的作业资源分配分为两种情况:加权、不加劝。
- 不加权分配:类似队列资源分配的方式,先将资源平均分配给每一个Job,之后将出让的多余资源经过计算再次平均分配给资源不足的Job,以此类推,直到没有空闲资源为止。
- 加权分配:分配方式与不加劝的类似,但是在计算时对Job进行加权计算。
3. DRF策略
按照不同应用所需的不同资源类型,按需分配。
yarn默认只考虑内存资源
。