Yarn 资源调度器
05 Yarn 第 1 章 Yarn 资源调度器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img--29)()]
思考:
1)如何管理集群资源?
2)如何给任务合理分配资源?
Yarn 是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而 等运算程序则相当于运行于操作系统之上的应用程序。
既负责资源的调度,又负责让你告诉它你这个任务在哪儿个结点上执行更合理。
1.1 Yarn 基础架构
YARN 主要由 、、 和 等组件构成。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img--32)()]
是整个集群资源的老大
启动和监控:比如说:提交了一个MR程序,这里面启动了一个App Mstr,那你启动它之后由负责App Mstr的监控。比如说App Mstr里面有一个任务挂了,可以分配给其他结点,可以监控它的资源运行情况。
资源的分配与调度:任何一个节点资源紧张,都非常清楚,可以把紧张的任务发送给资源空闲的结点。
:
处理发送的命令,因为任务要运行的时候它会跟申请资源,申请完之后具体还得在结点上运行,他俩之间需要相互进行交互。
:任务运行的老大
首先它要跟申请资源,看的资源情况,选择性的给对应的资源。
同时负责任务的监控和容错,监控和,比如说其中一个所在结点挂了,那么会跟申请,再申请一个节点去运行该任务。
1.2 Yarn 工作机制
面试重点
当在命令行执行wc.jar的时候,这个程序的入口main()在执行job.()的时候,在这里面就会创建一个(),本地模式下创建的是()。
产生之后,向申请运行一个,返回给资源提交路径,提交job到该路径下。
job提交需要提交三样东西:Job.split、Job.xml、wc.jar,都有什么用呢这三样东西。
job.split未来可以控制开启多少个。
job.xml未来可以控制这个任务可以按照job.xml参数的配置进行运行。
wc.jar就是程序代码。
提交完这三样东西之后,需要申请运行这个job的老大()。
在内部就会产生一个任务,在别的客户端也会产生这样的任务,有可能会有很多任务,怎么办?不管你有多少个任务,都会把任务放到一个任务队列中,默认的是一个容量调度器。
空闲的将任务领取。
领走任务之后第一时间创建容器,因为任何任务的执行都是在容器中执行,这个容器中有对应的所需要的资源。在容器内启动一个进程。启动完之后会在集群资源路径上去读job.split,拿到切片信息之后它要跟再次申请要运行对应的所需的容器。假如说这个切片是两个,那么就需要开启两个,这两个有可能是在两个结点,也有可能这两个容器都在一个结点。
将任务领走之后同样还是先创建容器,由发起启动命令,启动运行代码,这个时候就会开启两个进程。
运行结束之后就会把数据按照分区持久化到磁盘,知道是否程序以及计算完,计算完成之后,向申请运行,假如说这里有两个分区就开启两个,开启之前还是先申请对应的容器,在容器里面启动。对应的进程同样还是。
程序都执行完了,就需要释放资源,由于监控任务运行情况,所以当任务运行结束之后,由告诉这些任务都运行完毕了,把这些资源全部释放,这时程序就运行结束了。
这就是整个Yarn运行机制。
(1)MR 程序提交到客户端所在的节点。
(2) 向 申请一个 。
(3)RM 将该应用程序的资源路径返回给 。
(4)该程序将运行所需资源提交到 HDFS 上。
(5)程序资源提交完毕后,申请运行 。
(6)RM 将用户的请求初始化成一个 Task。
(7)其中一个 领取到 Task 任务。
(8)该 创建容器 ,并产生 。
(9) 从 HDFS 上拷贝资源到本地。
(10) 向 RM 申请运行 资源。
(11)RM 将运行 任务分配给另外两个 ,另两个 分别领取任务并创建容器。
(12)MR 向两个接收到任务的 发送程序启动脚本,这两个 分别启动 , 对数据分区排序。
(13) 等待所有 运行完毕后,向 RM 申请容器,运行 。
(14) 向 获取相应分区的数据。
(15)程序运行完毕后,MR 会向 RM 申请注销自己。
1.3 作业提交全过程
HDFS、YARN、三者关系
每个负责读取对应的数据,最终进行聚合操作,把输出结果最终写出在磁盘上。
作业提交过程之YARN
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img--34)()]
作业提交过程之HDFS &
它的数据输入端可以来源于HDFS,最终输出端可以写出到HDFS,那我们就可以把HDFS的读流程和HDFS的写流程 也可以划在一起。
作业提交全过程详解
(1)作业提交
第 1 步: 调用 job. 方法,向整个集群提交 作业。
第 2 步: 向 RM 申请一个作业 id。
第 3 步:RM 给 返回该 job 资源的提交路径和作业 id。
第 4 步: 提交 jar 包、切片信息和配置文件到指定的资源提交路径。
第 5 步: 提交完资源后,向 RM 申请运行 。
(2)作业初始化
第 6 步:当 RM 收到 的请求后,将该 job 添加到容量调度器中。
第 7 步:某一个空闲的 NM 领取到该 Job。
第 8 步:该 NM 创建 ,并产生 。
第 9 步:下载 提交的资源到本地。
(3)任务分配
第 10 步: 向 RM 申请运行多个 任务资源。
第 11 步:RM 将运行 任务分配给另外两个 ,另两个 分别领取任务并创建容器。
(4)任务运行
第 12 步:MR 向两个接收到任务的 发送程序启动脚本,这两个 分别启动 , 对数据分区排序。
第13步:等待所有运行完毕后,向RM申请容器,运行。
第 14 步: 向 获取相应分区的数据。
第 15 步:程序运行完毕后,MR 会向 RM 申请注销自己。
(5)进度和状态更新
YARN 中的任务将其进度和状态(包括 )返回给应用管理器, 客户端每秒(通过... 设置)向应用管理器请求进度更新, 展示给用户。
(6)作业完成
除了向应用管理器请求作业进度外, 客户端每 5 秒都会通过调用 ()来检查作业是否完成。时间间隔可以通过 . 来设置。作业完成之后, 应用管理器和 会清理工作状态。作业的信息会被作业历史服务器存储以备之后用户核查。
1.4 Yarn 调度器和调度算法
多个客户端向集群提交任务,那这个任务多了集群怎么办呢?
它会把它放到一个任务队列里面,由这个任务队列管理这多个任务。管理哪儿个任务先执行,每个任务分配多少资源。那有几个任务可以并发执行呢?等等这些事情都由调度器来解决。
目前, 作业调度器主要有三种:FIFO、容量( )和公平()。 .1.3 默认的资源调度器是 。CDH 框架默认调度器是 Fair 。
具体设置详见:yarn-.xml 文件
1.4.1 先进先出调度器(FIFO)
FIFO 调度器(First In First Out):单队列,根据提交作业的先后顺序,先来先服务。
1.4.2 容量调度器( )
是 Yahoo 开发的多用户调度器。(多个注册的用户可以向集群上进行提交)
容量调度器特点
1、多队列:每个队列可配置一定的资源量,每个队列采用FIFO调度策略。
FIFO调度策略:如果说整个集群有10G的资源,第一个任务只需要2G,那还剩下8G,那这8G怎么办?是等jon11执行完之后再等下一个吗?不是,job11的资源已经满足了,所以剩下8G就个下一个任务,如果下一个任务job12还剩下6G,那么还剩下2G,他还能够够分配给job13,是这样一个特点。也就是优先满足先进来的任务的资源,那在一个队列中也可以启动多个任务。
2、容量保证:管理员可为每个队列设置资源最低保证和资源使用上限。
每个队列都拥有资源的最低保证。
资源上限的含义:比如说一个任务运行了10%的资源,还剩下40%的资源,那这40%可以被别人借走,也就是刚刚说资源上限说是总队列20%,但是如果能借到资源的话,这个总队列资源还能往上拔。
3、灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列。
4、多租户:
支持多用户共享集群和多应用程序同时运行。
一个队列中可以有多个客户向集群中提交任务。
为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。(防止菜鸟在公司中提交了一个递归死循环任务把整个集群资源全部占用,防止误操作把整个集群资源全部耗光)
容量调度器资源分配算法
root根目录下面有3个队列,作业1中有开启3个容器,那资源怎么分?
1.4.3 公平调度器(Fair )
Fair 是 开发的多用户调度器。
公平调度器特点
与容量调度器不同点:
2 ) DRF:调度器默认分配的是内存,那如果还有CPU呢?那我们可以按照内存+CPU的方式进行配比。
公平调度器——缺额
公平调度器队列资源分配方式
公平调度器资源分配算法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img--42)()]
公平调度器队列资源分配方式
公平调度器队列资源分配方式
)]
公平调度器队列资源分配方式
[外链图片转存中…(img--42)]
公平调度器资源分配算法
[外链图片转存中…(img--42)]
公平调度器队列资源分配方式
[外链图片转存中…(img--43)]
公平调度器队列资源分配方式
[外链图片转存中…(img--44)]