• Hadoop3教程(二十五):Yarn的多队列调度器使用案例


    (136)生产环境多队列创建&好处

    生产环境下怎么创建队列?

    • 调度器默认只会开一个default队列,这个肯定是不满足生产要求的;
    • 可以按照框架来划分队列。比如说hive/spark/flink的任务分别放在不同的队列里,不过这么做的效率不高,企业用的不是很多。
    • 按照业务模块来划分队列。比如说登录注册的业务,单独一个队列,购物车单独一个队列,下单功能单独一个队列,等等;

    创建多队列的好处?

    • 担心单一程序耗尽集群所有资源;
    • 实现任务的降级使用。特殊时期可以保证重要的队列资源更充足。比如说双十一的时候,就给下单的那个队列,多补充资源。

    降级怎么理解呢,就是队列之间区分优先级,资源的分配是按照队列所属的业务的优先级来进行的。

    (137)容量调度器多队列提交案例

    仅做了解。

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

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

    如何创建多个队列

    接下来就需要在capacity-scheduler.xml中配置容量调度器的各项参数。直接抄教程的示例了:

    
    <property>
        <name>yarn.scheduler.capacity.root.queuesname>
        <value>default,hivevalue>
        <description>
          The queues at the this level (root is the root queue).
        description>
    property>
    
    
    <property>
        <name>yarn.scheduler.capacity.root.default.capacityname>
        <value>40value>
    property>
    
    
    <property>
        <name>yarn.scheduler.capacity.root.default.maximum-capacityname>
        <value>60value>
    property>
    (2)为新加队列添加必要属性:
    
    <property>
        <name>yarn.scheduler.capacity.root.hive.capacityname>
        <value>60value>
    property>
    
    
    <property>
        <name>yarn.scheduler.capacity.root.hive.user-limit-factorname>
        <value>1value>
    property>
    
    
    <property>
        <name>yarn.scheduler.capacity.root.hive.maximum-capacityname>
        <value>80value>
    property>
    
    
    <property>
        <name>yarn.scheduler.capacity.root.hive.statename>
        <value>RUNNINGvalue>
    property>
    
    
    <property>
        <name>yarn.scheduler.capacity.root.hive.acl_submit_applicationsname>
        <value>*value>
    property>
    
    
    <property>
        <name>yarn.scheduler.capacity.root.hive.acl_administer_queuename>
        <value>*value>
    property>
    
    
    <property>
        <name>yarn.scheduler.capacity.root.hive.acl_application_max_priorityname>
        <value>*value>
    property>
    
    
    
    
    <property>
        <name>yarn.scheduler.capacity.root.hive.maximum-application-lifetimename>
        <value>-1value>
    property>
    
    
    <property>
        <name>yarn.scheduler.capacity.root.hive.default-application-lifetimename>
        <value>-1value>
    property>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78

    如果任务超过了设定的超时时间,那么到时候就会被直接杀死,-1表示不设置。

    参数设置完成后,重启yarn,或者是执行yarn rmadmin -refreshQueues刷新队列配置。就可以看到两条队列了。

    在这里插入图片描述

    如何向指定队列提交任务

    那如何向指定队列提交任务呢?

    以向hive队列提交任务为例,就是执行

    hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount -D mapreduce.job.queuename=hive /input /output
    
    • 1

    就是加入了-D参数,指定了队列名。

    如果不指定队列名的话,默认是都提交到default队列。

    除了上述方式之外,也可以在jar包代码里写死要提交的队列名,如:

    public class WcDrvier {
    
        public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
    
            Configuration conf = new Configuration();
    
            conf.set("mapreduce.job.queuename","hive");
    
            //1. 获取一个Job实例
            Job job = Job.getInstance(conf);
    
            。。。 。。。
    
            //6. 提交Job
            boolean b = job.waitForCompletion(true);
            System.exit(b ? 0 : 1);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    这样,这个任务在提交的时候,就会直接提交到hive队列。

    (138)容量调度器任务优先级

    资源紧张的时候,高优先级的任务将先获取到资源。

    默认情况下,Yarn将所有任务的优先级限制为0,如果想使用任务的优先级功能,则需要做一些设置。

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

    <property>
        <name>yarn.cluster.max-application-priorityname>
        <value>5value>
    property>
    
    • 1
    • 2
    • 3
    • 4

    分发配置,并重启Yarn:

    [atguigu@hadoop102 hadoop]$ xsync yarn-site.xml
    [atguigu@hadoop103 hadoop-3.1.3]$ sbin/stop-yarn.sh
    [atguigu@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh
    
    • 1
    • 2
    • 3

    然后通过连续提交下面任务,来模拟资源紧张的环境:

    [atguigu@hadoop102 hadoop-3.1.3]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi 5 2000000
    
    • 1

    在这里插入图片描述

    再次提交高优先级任务:

    [atguigu@hadoop102 hadoop-3.1.3]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi  -D mapreduce.job.priority=5 5 2000000
    
    • 1

    通过-D设置了新提交的任务优先级是5,高于当前在运行的所有任务,这个任务马上就获取到了资源:
    在这里插入图片描述
    上面的例子是在任务提交时设置任务的优先级,也可以通过以下命令修改正在执行的任务的优先级

    yarn application -appID  -updatePriority 优先级
    
    • 1

    (139)公平调度器案例

    公平调度器,中大型公司主要使用的。

    需求:在默认的default队列基础之上,再创建两个队列,分别是test和atguigu(以用户所属组命名)。期望实现下面效果:

    • 提交任务时若指定队列,则提交至指定队列运行;
    • 提交任务时未指定队列,test用户提交的任务到test队列运行,atguigu用户提交的任务到atguigu队列运行

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

    (1)配置文件参考资料:

    https://hadoop.apache.org/docs/r3.1.3/hadoop-yarn/hadoop-yarn-site/FairScheduler.html

    (2)任务队列放置规则参考资料:

    https://blog.cloudera.com/untangling-apache-hadoop-yarn-part-4-fair-scheduler-queue-basics/

    修改yarn-site.xml文件,如下:

    <property>
        <name>yarn.resourcemanager.scheduler.classname>
        <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairSchedulervalue>
        <description>配置使用公平调度器description>
    property>
    
    <property>
        <name>yarn.scheduler.fair.allocation.filename>
        <value>/opt/module/hadoop-3.1.3/etc/hadoop/fair-scheduler.xmlvalue>
        <description>指明公平调度器队列分配配置文件description>
    property>
    
    <property>
        <name>yarn.scheduler.fair.preemptionname>
        <value>falsevalue>
        <description>禁止队列间资源抢占description>
    property>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    "禁止队列间资源抢占"这个功能就是之前提到过的,不同队列间的资源借调,这里是直接关掉了。

    创建并配置fair-scheduler.xml:

    
    <allocations>
      
      <queueMaxAMShareDefault>0.5queueMaxAMShareDefault>
      
      <queueMaxResourcesDefault>4096mb,4vcoresqueueMaxResourcesDefault>
    
        
      
      <queue name="test">
        
        <minResources>2048mb,2vcoresminResources>
        
        <maxResources>4096mb,4vcoresmaxResources>
        
        <maxRunningApps>4maxRunningApps>
        
        <maxAMShare>0.5maxAMShare>
        
        <weight>1.0weight>
        
        <schedulingPolicy>fairschedulingPolicy>
      queue>
        
        
      
      <queue name="atguigu" type="parent">
        
        <minResources>2048mb,2vcoresminResources>
        
        <maxResources>4096mb,4vcoresmaxResources>
        
        <maxRunningApps>4maxRunningApps>
        
        <maxAMShare>0.5maxAMShare>
        
        <weight>1.0weight>
        
        <schedulingPolicy>fairschedulingPolicy>
      queue>
    
      
      <queuePlacementPolicy>
        
        <rule name="specified" create="false"/>
        
        <rule name="nestedUserQueue" create="true">
            <rule name="primaryGroup" create="false"/>
        rule>
        
        <rule name="reject" />
      queuePlacementPolicy>
    allocations>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    接着分发配置并重启yarn:

    [atguigu@hadoop102 hadoop]$ xsync yarn-site.xml
    [atguigu@hadoop102 hadoop]$ xsync fair-scheduler.xml
    
    [atguigu@hadoop103 hadoop-3.1.3]$ sbin/stop-yarn.sh
    [atguigu@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh
    
    • 1
    • 2
    • 3
    • 4
    • 5

    接下来可以测试提交任务,就不介绍了。

    参考文献

    1. 【尚硅谷大数据Hadoop教程,hadoop3.x搭建到集群调优,百万播放】
  • 相关阅读:
    美国站群服务器如何解决跨国运营中的网络延迟问题?
    OceanBase 分布式数据库【信创/国产化】- OceanBase Demo 环境搭建
    致敬最美逆行者网页设计作品 大学生抗疫感动专题网页设计作业模板 疫情感动人物静态HTML网页模板下载
    Web3:数字化社会的下一步
    如何快速制作令人惊叹的长图海报
    Java中的数组
    【机器学习】文本多分类
    java 基础语法
    [附源码]JAVA毕业设计律师事务所网站(系统+LW)
    SVProgressHUD和MBProgressHUD的优缺点与SVProgressHUD震动实现
  • 原文地址:https://blog.csdn.net/wlh2220133699/article/details/133937306