暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Hadoop学习笔记之程序与YARN交互流程

运维路书 2023-10-24
113

历史学习笔记

Hadoop大数据平台学习笔记之概念篇

Hadoop大数据平台学习笔记之HDFS 

Hadoop学习笔记之NameNode工作机制解析

Hadoop学习笔记-DataNode工作机制解析

Hadoop学习笔记之YARN

本期重点学习程序与YARN的交互流程






程序与YARN交互流程


核心交互流程



以MapReduce为例, 对照官方架构图, YARN的核心交互流程主要包括以下几部分:

  • MR作业提交         Client -->RM 

  • 资源申请              AppMstr-->RM

  • MR作业状态汇报  Container(Map|Reduce Task) --> Container(MRAppMstr)

  • 节点状态汇报        NM -->RM




交互流程概述


当用户向YARN中提交一个应用程序后,YARN将分两个阶段运行该程序


第一个阶段:客户端申请资源启动运行本次程序的ApplicationMaster


第二个阶段:ApplicationMaster根据本次程序内部具体情况,为它申请资源,并监控程序的整个运行过程,直到运行完成。


注:任何程序提交到YARN上运行,必须首先运行ApplicationMaster


交互流程详解


 

以提交MR程序为例,展示与YARN交互流程




第1步、用户通过客户端向YARN中的ResourceManager提交应用程序(例如:hadoop jar 提交MR程序);
第2步、RM中的 应用管理器(ApplicationManager)为程序分配一个容器,并与对应的NodeManager通信,在容器中启动这个程序的ApplicationMaster;
第3步、ApplicationMaster启动成功后,首先向RM注册并保持通信,这样用户可以直接通过RM查看应用程序的运行状态(处理了百分之几);
第4步、AM为本程序内部的各个Task任务向RM申请资源,并监控它的运行状态;
第5步、一旦AM申请到资源后,便与对应的NodeManager通信,要求NM启动任务;
第6步、NodeManager为任务设置好运行环境后,将任务启动命令写到一个脚本中,并运行脚本启动任务;
第7步、各个任务通过RPC协议向AM汇报自己的运行状态和进度,让AM随时掌握任务的运行状态,从而可以在任务失败时重新启动任务。程序运行过程中用户可以通过AM查询程序的当前运行状态
第8步、应用程序运行完成后,AM向RM注销并关闭自己。

ApplicationMaster是整个程序运行过程中的绝对老大。





YARN资源调度器Scheduler


YARN的交互流程中的第4步其实是AM与RM中的资源调度器在交互,通过资源调度器来申请资源。


如何理解资源调度



  • 理想情况下,应用程序提出资源请求立即得到YARN批准。但实际中,资源是有限的,并且在繁忙的集群中,应用程序通常等待资源。YARN调度程序的工作是根据一些定义的策略为应用程序分配资源。
  • YARN中,负责给应用程序分配资源的就是Scheduler,是RM的核心组件之一。Scheduler完全专用于调度作业,无法跟踪应用程序的状态。
  • 调度是一个难题,没有最佳策略。为此,YARN提供了多种调度器和可配置的策略供选择。

调度策略


YARN提供了三种调度器
  • FIFO Scheduler(先进先出调度器)
  • Capacity Scheduler(容量调度器)
  • Fair Scheduler(公平调度器)
Apache版本YARN默认使用 Capacity Scheduler
如果需要使用其他调度器,可以在yarn-site.xml中配置
    yarn.resourcemanager.scheduler.class

    01


    FIFO Scheduler (先进先出调度器)






    1. FIFO Scheduler 是Hadoop1.x中JobTracker原有的调度器,此调度器在YARN中保留了下来。
    2. FIFO Scheduler 是遵循先进先出的思想,即先提交的应用先运行。调度工作不考虑优先级和范围,适用于负载较低的小规模集群。当使用大型共享集群时,它的效率低且会导致一系列的问题。
    3. FIFO Scheduler 拥有一个控制全局的队列queue,默认queue为default,该调度器会获取当前集群上的所有资源信息作用于这个全局的queue。

     

    优点

    无需配置,先到先得,易于执行

     

    缺点

    不考虑优先级,因此高优先级的任务需要等待

    不适合大规模共享集群


    02


    Capacity Scheduler(容量调度器)




    • Capacity Scheduler 是Apache Hadoop3.x默认调度策略。该策略允许多个组织共享整个集群资源,每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列,然后为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。

    • Capacity 可以理解成一个个的资源队列,这个资源队列是用户自己去分配的。队列内部又可以垂直划分,这个一个组织内部的多个成员就可以共享这个队列资源了,在一个队列内部,资源的调度采用的是先进先出(FIFO)的策略

     

    如图所示:

    1. 将整个集群划分成两个队列 queue A 和queue B

    2. 队列A 专门负责处理大程序,队列B负责处理小程序,如果有需求可以继续划分子队列。

    3. 实际应用中可以根据不同的业务线划分不同队列,各自用自己的队列,相互不影响。

     

    资源队列划分

    Capacity Scheduler 调度器以队列为单位划分资源。简单来说,就是一个个队列有独立的资源,队列的结构和资源是可以配置的。

    根据公司的业务特点,将集群按不同的业务线划分队列,划分成业务树。

    首先分为default队列,生产队列,研发队列

    再将生产队列,研发队列继续分别划分两个子队列

    不同的程序在提交的时候,提交的各自指定的队列上,实现了共享集群资源。


    优点


    • 层次化的队列设计(Hierarchical Queues)

    层次化的管理,可以更容易、更合理分配和限制资源的使用

    • 容量保证(Capacity Guarantees)

    每个队列上都可以设置一个资源占比,保证每个队列都不会占用整个集群的资源

    • 安全(Security)

    每个队列都有严格的访问控制,用户只能向自己的队列里面提交任务,而且不能修改或访问其他队列的任务

    • 弹性分配(Elasticity)

    空闲的资源可以分配给任何队列。

    当多个队列出现资源争用的时候,会按照权重比例进行平衡。


    03


    Fair Scheduler(公平调度器)

    • Fair Scheduler 叫做公平调度,提供了YARN应用程序公平共享大型集群中资源的另一种方式,使所有应用在平均情况下随着时间的流逝可以获得相等的资源份额。
    • Fair Scheduler设计目标是为所有应用程序分配公平的资源(对公平的定义通过参数来设置)
    • 公平调度可以在多个队列间工作,允许资源共享和抢占
     
    公平调度分为单个队列和多个队列两种方式


    单个队列



    1. 公平调度之单个队列,如上图所示,假设 job1 被分配到某个队列中,且没有其它任务运行,job1 则获得集群的全部资源。
    2. 如果此时 job2 也被分配到该队列中,则 job2 会先等待 job1 逐渐释放集群的一半资源给 job2 使用。
    3. job2 运行完成后,但 job1 仍在运行,则 job1 又会重新占用该队列的所有资源。


    多个队列



    公平调度之多个队列, 如上图所示:
    1. 假设有两个用户 A 和 B,分别拥有一个自己的队列 Queue A 和 Queue B。
    2. 当 A 启动一个 job1 而 B 没有提交任务时,A 会获得集群的全部资源(Queue A + Queue B);
    3. 当 A 的 job1 仍在运行,且 B 启动第一个 job2 时,Queue A 会逐渐释放一半资源,两个任务会各自占用集群的一半资源;
    4. 如果此时 B 再启动第二个 job3 并且其它 job 仍在运行时,则它将会和 B 的第一个 job2 共享队列 B 的资源,也就是 Queue B 的两个 job 将会分别占用集群的四分之一资源,而 A 的 job1 仍然占用集群的一半资源;

     

    最初,只有job1,占用了全部资源。后来由于job2加入,job1 和 job2 分别占用集群的一半资源。再后来由于 job3 的加入,job2 和 job3 平分 Queue B 的资源。最终结果就是集群的资源在两个用户之间实现了公平共享。


    公平调度器的调度策略


    Fair Scheduler 不同于前两种调度器,对于所有提交到某一个队列中的任务,Fair调度器都为该队列提供了3中调度策略。
    • fair: 仅根据内存公平调度资源(默认)
    • fifo: 先进先出策略,拥有子队列的队列不能是fifo
    • dfr: Dominant Resource Fairness(主导资源公平)策略。根据CPU或内存公平调度资源(建议)
    Dominant Resource Fairness(drf,主导资源公平策略):首先查看任务的主导资源是 CPU 还是内存,然后根据任务之间主导资源的占比进行资源分配。例如:


    任务

    所需CPU

    所需内存

    主导资源

    占比

    job1

    1%

    3%

    内存

    3%

    job2

    9%

    3%

    CPU

    9%


    因此,job1 和 job2 申请资源比例为 3% : 9%(1 :3),job2 分配的 Container 数量为 job1 的三倍。即 job1 占 1/4 数量 Container,job2 占 3/4 数量 Container。

     

    优点

     

    • 分层队列:队列可以按层次结构划分资源,并可以配置权重以按特定比例共享集群
    • 基于用户或组的队列映射:可以根据提交任务的用户名或组来分配队列。如果任务指定了一个队列,则在该队列中提交任务。
    • 资源抢占:根据应用的配置,抢占和分配资源可以是友好的或者是强制的。默认启用资源抢占
    在 Fair 调度器中,当一个新的任务提交到某一个队列,而该队列并没有空闲资源分配给它,这时该任务需要等待其它任务完成一部分 Container 计算然后释放资源给新任务,以达到公平运行的目的。
    为了使作业从提交到执行所需的时间可控,可以设置抢占模式(yarn.scheduler.fair.preemption 设置为 true,即开启抢占模式),当等待时间超过一定阈值时即启动抢占资源,强迫队列中其它任务立刻让出一部分资源给新任务,达到强行公平运行的目的。
    • 保证最小配额:可以设置队列最小资源,允许将最小资源分配给队列,保证用户可以启动任务。当队列不能满足最小资源时,可以从其他队列抢占。当队列资源用不完时,可以给其他队列使用。这对于确保某些用户、组或者生产应用始终获得足够的资源。
    • 允许资源共享:当一个应用运行时,如果其他队列没有任务执行,可以使用其他队列。当其他队列有应用需要资源时再将占用的队列释放出来。所有队列都从资源队列中分配资源。

    文章转载自运维路书,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论