H(notebook&hadoop).yarn总结

发布于:2023-01-24 ⋅ 阅读:(22) ⋅ 点赞:(0) ⋅ 评论:(0)

目录

一、Yarn基础架构

1.学习结构

2.调度器

2.1先进先出调度器(FIFO)

2.2容量调度器(Capacity Scheduler)

2.3公平调度器(Fair Scheduler)

二、命令行操作

三、相关配置

1.案例1

2.案例2配置队列

3.案列3任务优先级

4.案例4公平调度器

4.1修改yarn-site.xml文件,加入以下参数

4.2配置fair-scheduler.xml

四、Tool接口实现

五、重点总结

1.Yarn的工作机制

2.Yarn的调度器

3.开发需要重点掌握内容

END


一、Yarn基础架构

        YARN主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成。

1.学习结构

2.调度器

2.1先进先出调度器(FIFO)

        FIFO调度器(First In First Out):单队列,根据提交作业的先后顺序,先来先服务。

  

        优点:简单易懂;

        缺点:不支持多队列,生产环境很少使用;

2.2容量调度器(Capacity Scheduler)

        是一种多用户调度器。

        (1)特点

                a.多队人列:每个队列可配置一定的资源量,每个队列采用FIFO调度策略。
                b.容量保证:管理员可为每个队列设置资源最低保证和资源使用上限。
                c.灵活性:如果一个队列中的资源有剩余,可以暂时共亨给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列。
                d.多租户:支持多用户共享集群和多应用程序同时运行。
                                  为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。

        (2)资源分配算法

                a.队列资源分配:从root开始,使用深度优先搜索算法,优先选择资源占用率最低的队列分配资源。

                b.作业资源分配:默认按照提交作业的优先级和提交时间顺序分配资源。

                c.容器资源分配:按照容器的优先级分配资源;如果优先级相同,按照数据本地性原则:

                                          ①任务和数据在同一节点。

                                          ②任务和数据在同一机架。

                                          ③任务和数据不在同一节点也不在同一机架。

2.3公平调度器(Fair Scheduler)

              是一种多用户调度器。

        (1)与容量调度器相同点

                 a.多队列:支持多队列多作业。

                 b.容量保证:管理员可为每个队列设置资源最低保证和资源使用上限。

                 c.灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列。

                 d.多用户:支持多用户共享集群和多应用程序同时运行;为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源进行限定。

        (2)与容量调度器不同点

                 a.核心调度策略不同:容量调度器优先选择资源利用率低的队列;公平调度器优先选择对资源的缺额占比例大的。

                 b.每个队列可以单独设置资源分配方式:容量调度器是FIFO、DRF;公平调度器是FIFO、FAIR、DRF。

        (3)缺额

                某一时刻一个作业应获资源和实际获得资源的差距叫做“缺额”。

                调度器会优先为缺额大的作业分配资源。

        (4)DRF策略
                DRF (Dorninant Resorrce Fairness),之前的资源,都是单一标准,例如只考虑内存(也是Yarn默认的情况)。但是很多时候我们资源有很多种,例如内存,CPU,网络带宽等,这样我们很难衡量两个应用应该分配的资源比例。
                那么在Yarn中,我们用DRF决定如何调度假设集群一其有100 CPU和10T 内存,而应用A需要(2 CPU,300GB),应用B需要 (6 CPU, 100GB)则两个应用分别需要A(2%CPU,3%内存)和B(6%CPU,1%内存)的资源,这就意味着A是内存主导的,B是CPU主导的,针对这种情况,我们可以选择DRF策略对不同应用进行不同资源(CPU和内存)的一个不同比例的限制。

二、命令行操作

三、相关配置

1.案例1

需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。

需求分析:

        1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster

        平均每个节点运行10个 / 3台 ≈ 3个任务(4 3 3)

选择调度器,默认容量

ResourceManager处理调度器请求的线程数量,默认50;如果提交的任务数大于50,可以增加该值,但是不能超过3台 * 4线程 = 12线程(去除其他应用程序实际不能超过8)

是否让yarn自动检测硬件进行配置,默认是false,如果该节点有很多其他应用程序,建议手动配置。如果该节点没有其他应用程序,可以采用自动

是否将虚拟核数当作CPU核数,默认是false,采用物理CPU核数

虚拟核数和物理核数乘数,默认是1.0

NodeManager使用内存数,默认8G,修改为4G内存

nodemanager的CPU核数,不按照硬件环境自动设定时默认是8个,修改为4个

容器最小内存,默认1G

容器最大内存,默认8G,修改为2G

容器最小CPU核数,默认1个

容器最大CPU核数,默认4个,修改为2个

虚拟内存检查,默认打开,修改为关闭

虚拟内存和物理内存设置比例,默认2.1

2.案例2配置队列

需求1:default队列占总内存的40%,最大资源容量占总资源60%,hive队列占总内存的60%,最大资源容量占总资源80%。

需求2:配置队列优先级。

在capacity-scheduler.xml中配置如下:

指定多队列,增加hive队列

降低default队列资源额定容量为40%,默认100%

降低default队列资源最大容量为60%,默认100%

指定hive队列的资源额定容量

用户最多可以使用队列多少资源,1表示

指定hive队列的资源最大容量

启动hive队列

哪些用户有权向队列提交作业

哪些用户有权操作队列,管理员权限(查看/杀死)

哪些用户有权配置提交任务优先级

如果application指定了超时时间,则提交到该队列的application能够指定的最大超时时间不能超过该值

如果application没指定超时时间,则用default-application-lifetime作为默认值

在idea端中的driver添加如下代码可选择队列:

        Configuration conf = new Configuration();
        conf.set("mapreduce.job.queuename","队列名称");
        //1. 获取一个Job实例
        Job job = Job.getInstance(conf);

3.案列3任务优先级

        容量调度器,支持任务优先级的配置,在资源紧张时,优先级高的任务将优先获取资源。默认情况,Yarn将所有任务的优先级限制为0,若想使用任务的优先级功能,须开放该限制。

        修改yarn-site.xml文件,增加以下参数:

<property>
    <name>yarn.cluster.max-application-priority</name>
    <value>5</value>
</property>

4.案例4公平调度器

        创建两个队列,分别是test和atguigu(以用户所属组命名)。期望实现以下效果:若用户提交任务时指定队列,则任务提交到指定队列运行;若未指定队列,test用户提交的任务到root.group.test队列运行,atguigu提交的任务到root.group.atguigu队列运行(注:group为用户所属组)。

        公平调度器的配置涉及到两个文件,一个是yarn-site.xml,另一个是公平调度器队列分配文件fair-scheduler.xml(文件名可自定义)。

4.1添加内容向yarn-site.xml文件

<property>
    <name>yarn.resourcemanager.scheduler.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
    <description>配置使用公平调度器</description>
</property>

<property>
    <name>yarn.scheduler.fair.allocation.file</name>
    <value>/opt/module/hadoop-3.1.3/etc/hadoop/fair-scheduler.xml</value>
    <description>指明公平调度器队列分配配置文件</description>
</property>

<property>
    <name>yarn.scheduler.fair.preemption</name>
    <value>false</value>
    <description>禁止队列间资源抢占</description>
</property>

4.2配置fair-scheduler.xml

<?xml version="1.0"?>
<allocations>
  <!-- 单个队列中Application Master占用资源的最大比例,取值0-1 ,企业一般配置0.1 -->
  <queueMaxAMShareDefault>0.5</queueMaxAMShareDefault>
  <!-- 单个队列最大资源的默认值 test atguigu default -->
  <queueMaxResourcesDefault>4096mb,4vcores</queueMaxResourcesDefault>

  <!-- 增加一个队列test -->
  <queue name="test">
    <!-- 队列最小资源 -->
    <minResources>2048mb,2vcores</minResources>
    <!-- 队列最大资源 -->
    <maxResources>4096mb,4vcores</maxResources>
    <!-- 队列中最多同时运行的应用数,默认50,根据线程数配置 -->
    <maxRunningApps>4</maxRunningApps>
    <!-- 队列中Application Master占用资源的最大比例 -->
    <maxAMShare>0.5</maxAMShare>
    <!-- 该队列资源权重,默认值为1.0 -->
    <weight>1.0</weight>
    <!-- 队列内部的资源分配策略 -->
    <schedulingPolicy>fair</schedulingPolicy>
  </queue>
  <!-- 增加一个队列atguigu -->
  <queue name="atguigu" type="parent">
    <!-- 队列最小资源 -->
    <minResources>2048mb,2vcores</minResources>
    <!-- 队列最大资源 -->
    <maxResources>4096mb,4vcores</maxResources>
    <!-- 队列中最多同时运行的应用数,默认50,根据线程数配置 -->
    <maxRunningApps>4</maxRunningApps>
    <!-- 队列中Application Master占用资源的最大比例 -->
    <maxAMShare>0.5</maxAMShare>
    <!-- 该队列资源权重,默认值为1.0 -->
    <weight>1.0</weight>
    <!-- 队列内部的资源分配策略 -->
    <schedulingPolicy>fair</schedulingPolicy>
  </queue>

  <!-- 任务队列分配策略,可配置多层规则,从第一个规则开始匹配,直到匹配成功 -->
  <queuePlacementPolicy>
    <!-- 提交任务时指定队列,如未指定提交队列,则继续匹配下一个规则; false表示:如果指定队列不存在,不允许自动创建-->
    <rule name="specified" create="false"/>
    <!-- 提交到root.group.username队列,若root.group不存在,不允许自动创建;若root.group.user不存在,允许自动创建 -->
    <rule name="nestedUserQueue" create="true">
        <rule name="primaryGroup" create="false"/>
    </rule>
    <!-- 最后一个规则必须为reject或者default。Reject表示拒绝创建提交失败,default表示把任务提交到default队列 -->
    <rule name="reject" />
  </queuePlacementPolicy>
</allocations>

四、Tool接口实现

        简单,不做解释。

五、重点总结

1.Yarn的工作机制

(1)向ResourceManager申请一个Application。

(2)ResourceManager回应请求并返回Application资源提交路径以及application_id。

(3)提交job运行所需资源,包括Job.xml(配置信息)、Job.split(控制开启多少个Map Task)、wc.jar(程序源码)。

(4)资源提交完毕,申请运行mrAppMaster。

(5)ResourceManager将用户的请求初始化成一个Task。

(6)NodeManager从FIFO调度队列领取到Task任务。

(7)NodeManager创建Container容器。

(8)NodeManager下载job资源到本地。

(9)MRAppmaster申请运行MapTask容器。

(10)NodeManager从调度队列领取到任务,创建容器。

(11)MRAppmaster发送程序启动脚本到MapTask。

(12)MRAppmaster向ResourceManager申请2个容器,运行ReduceTask。

(13)Reduce向Map获取相应分区的数据。

(14)程序运行完后,MR会向ResourceManager注销自己。

2.Yarn的调度器

(1)FIFO/容量调度器/公平调度器

(2)apache默认容量调度器为容量;CDH默认调度器为公平调度器;

(3)公平/容量默认一个default,需要创建多队列;

(4)中小企业:hive、spark、flink、mr。大企业:业务模块:登陆、注册、购物车、营销,好处:解耦、降低风险;

(5)调度器特点:

        相同点:支持多队列、可以借资源、支持多用户;

        不同点:容量调度器:优先满足先来的任务执行;

                       公平调度器:在队列里面的任务公平享有队列资源;

(6)生产环境怎么选:

        中小企业:对并发度要求不高,选择容量;

        中大企业:对并发度要求较高,选择公平;

3.开发需要重点掌握内容

(1)队列运行原理;

(2)Yarn常用命令;

(3)核心参数配置;

(4)配置容量调度器和公平调度器;

(5)Tool接口使用;

END