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

数仓(九)hadoop集群Yarn容量调度器

畅谈Fintech 2021-08-09
2224


上一节讲解了hive的架构原理,并且搭建了Hive on Spark。最后我们抛出了一个问题“容量调度器default队列中,同一时间只有一个任务执行,并发度低这个问题”

本节我们先会提供两种解决方法,然后介绍hadoop集群Yarn的capacity-scheduler容量调度器机制,其实这块属于Yarn内容。


一、增加ApplicationMaster资源比例


针对容量调度器并发度低的问题,考虑调整
yarn.scheduler.capacity.maximum-am-resource-percent参数。默认值是0.1,表示集群上ApplicationMaster最多可使用的资源比例上限;目的为限制过多的app数量。
1、修改capacity-scheduler.xml
/opt/module/hadoop-3.1.4/etc/hadoop/
    [qiusheng@node01 hadoop]$ vim capacity-scheduler.xml


    2、分发capacity-scheduler.xml配置文件

      [qiusheng@node01 hadoop]$ xsync__nodes.sh capacity-scheduler.xml
      注意:
      分发xsync_nodes.sh脚本可以去看的Hadoop集群搭建那节。
      具体shell代码如下:
        # 2021-04-26
        # authored by qiusheng
        # function: any path to xsync all nodes


        #!/bin/bash
        # 1.判断传入的参数的个数
        if [ $# -lt 1 ]
        then
        echo Not enough params!
        exit;
        fi


        # 2.遍历循环所有节点node
        for hostnode in node01 node02 node03
        do
        echo =============== $hostnode ===============
        #3.循环遍历所有目录,挨个发送
        for file in $@
        do
        #4.判断文件是否存在
        if [ -e $file ]
        then
        #5.获取父目录
                pdir=$(cd -P $(dirname $file);pwd)
        #6.获取当前文件的名称
                fname=$(basename $file)
        #7.创建文件夹即使有文件
        ssh $hostnode "mkdir -p $pdir"
        rsync -av $pdir/$fname $hostnode:$pdir
        else
        echo $file does not exists!
        fi
        done
        done

        3、重新启动yarn集群

          sbin/stop-yarn.sh
          sbin/start-yarn.sh



          二、增加Yarn容量调度器多队列


          1、一般常见的多队列分类:
          • 按照计算引擎创建队列:hive、spark、flink
          • 按照业务创建队列:下单、支付、点赞、评论、收藏等
          2、如何怎么选择呢?
          现在一般都是选择按照业务创建队列,对应作业job特别多的情况下,不是所有任务都是在第一时间需要处理的,有些队列会被降级处理执行,比如下单业务,评论和点赞业务可以降级处理。

          3、修改容量调度器配置文件

          默认在Yarn的配置下,容量调度器只有一条default队列。在capacity-scheduler.xml中可以配置多条队列。

          如下图:除了默认的default队列,再增加1个hive队列。

          并且修改default队列的容量是50%,另外一半50%自然是给hive队列的。

          4、为hive队列添加相对应的属性
          一共有9个<property>配置
            <property>
            <name>yarn.scheduler.capacity.root.hive.capacity</name>
            <value>50</value>
            <description>
            1、hive队列的容量为50%
            </description>
            </property>
            <property>
            <name>yarn.scheduler.capacity.root.hive.user-limit-factor</name>
            <value>1</value>
            <description>
            2、一个用户最多能够获取该队列资源容量的比例,取值0-1
            </description>
            </property>
            <property>
            <name>yarn.scheduler.capacity.root.hive.maximum-capacity</name>
            <value>80</value>
            <description>
            3、hive队列的最大容量(自己队列资源不够,可以使用其他队列资源上限)
            </description>
            </property>
            <property>
            <name>yarn.scheduler.capacity.root.hive.state</name>
            <value>RUNNING</value>
            <description>
            4、开启hive队列运行,如果不设置,则队列不能使用
            </description>
            </property>
            <property>
            <name>yarn.scheduler.capacity.root.hive.acl_submit_applications</name>
            <value>*</value>
            <description>
            5、访问控制,控制谁可以将任务提交到该队列,*表示任何人
            </description>
            </property>
            <property>
            <name>yarn.scheduler.capacity.root.hive.acl_administer_queue</name>
            <value>*</value>
            <description>
            6、访问控制,控制谁可以管理(包括提交和取消)该队列的任务,*表示任何人
            </description>
            </property>
            <property>
            <name>yarn.scheduler.capacity.root.hive.acl_application_max_priority</name>
            <value>*</value>
            <description>
            7、指定哪个用户可以提交配置任务优先级
            </description>
            </property>
            <property>
            <name>yarn.scheduler.capacity.root.hive.maximum-application-lifetime</name>
            <value>-1</value>
            <description>
            8、hive队列中任务的最大生命时长,以秒为单位。任何小于或等于零的值将被视为禁用。
            </description>
            </property>
            <property>
            <name>yarn.scheduler.capacity.root.hive.default-application-lifetime</name>
            <value>-1</value>
            <description>
            9、hive队列中任务的默认生命时长,以秒为单位。任何小于或等于零的值将被视为禁用。
            </description>
            </property>



            5、分发配置文件到其他两台机器上
            /opt/module/hadoop-3.1.4/etc/hadoop/
              xsync__nodes.sh capacity-scheduler.xml
              6、重启hadoop集群
                [qiusheng@node01 hadoop]$ cluster.sh stop[qiusheng@node01 hadoop]$ cluster.sh start
                cluster.sh是我们在hadoop集群搭建的时候,启动三台机器hadoop脚本文件。具体见hadoop集群搭建那节。


                三、测试Yarn容量调度器多队列


                1、观察Resource ManagerUI界面
                http://node02:8088/cluster


                root 下面已经是多队列了。
                2、开启一个hive on spark的队列
                启动hive后,做一个插入操作
                  insert into table student values(2,'list');

                  3、开启一个MR队列

                  随后在开启一个MR队列,我们这里利用hadoop集群自带的圆周率计算问题

                  4、再次观察Resource ManagerUI界面

                  观察ResourceManager界面查看job 

                  http://192.168.8.132:8088/cluster,我们可以看到hive on spark的任务已经执行,但是MR任务没有执行。这个是为什么呢?

                  再看一下queues队列里面,root下面,default队列在执行,hive队列并没有执行;

                  因为多队列的操作,需要指定队列执行名。
                  这里我们先做一个sql操作

                  然后再开一个MR任务还是刚才hadoop集群自带的PI任务,指定hive队列使用

                  -Dmapreduce.job.quenename=hive
                  -D表示运行的时候改变参数值;
                  我们再看队列queues里面,root下面hive队列和default队列都被使用了;



                  其中hive队列详细信息



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

                  添加proriety属性

                    <property>
                    <name>yarn.cluster.max-application-priority</name>
                    <value>5</value>
                    </property>
                    • 分发文件后,重启yarn

                      xsync__nodes.sh yarn-site.xml
                      sbin/stop-yarn.sh
                      sbin/start-yarn.sh


                      6、测试观察Resource ManagerUI界面
                      连续提交任务,直到新提交的任务申请不到资源为止,来测试资源不足问题。
                        hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.4.jar pi 5 1000000
                        显示最后一个队列已经没有资源可以使用了,等待状态

                        再次提交优先级高的任务。

                        -D mapreduce.job.priority=5

                          hadoop jar /opt/module/hadoop-3.1.4/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi  -D mapreduce.job.priority=5 5 1000000

                          我们看这个job,拿到了高级优先任务。




                          四、Yarn容量调度器


                          1、Capacity Scheduler容量调度器

                          Hadoop作业调度器主要有三种:FIFO、容量(Capacity Scheduler)和公平(Fair Scheduler)。ApacheHadoop3.1.3默认的资源调度器是Capacity Scheduler。

                          如下图所示Capacity Scheduler:



                          • 多队列模式

                            root下面有queueA\B \C等队列,每个队列配置一定的资源。

                          • 采用FIFO模式

                            每个队列采用first in first out模式。

                          • 动态共享资源

                            如果一个队列中的资源还有剩余,比如上图中队列B还有50%资源空闲,可以暂时共享给其他需要资源的队列比如A或者C,而且一旦B队列有新的应用job提交,则其他队列A或者C会把当前队列结束后,归还借调的资源给B。

                          • 多租户、多application共享

                            支持多用户,多application应用的job同时运行,为了防止一个用户的作业独占该队列的大部分资源,调度器可以调整配置每个用户提交的作业的资源的比列。避免单队列堵塞等待。


                          2、Capacity Scheduler内部分配规则


                          如上图所示:

                          • queue队列资源分配
                            从root开始,使用深度优先算法,优先选择资源占用率最低的队列分配资源
                            A队列资源分配了20%,先给A队列分配job。
                          • job作业资源分配
                            默认是按照提交到Yarn的作业的优先级以及提交时间的顺便分配资源。
                            A对列中的job1、job2
                          • contain资源分配
                            按照容器的优先级分配资源,如果有 优先级相同,则按照“数据本地性”原则来分配资源。
                            数据本地性原则
                            1. 数据和任务job在同一个节点即同一台服务器上
                            2. 数据和任务job在同一个节点即同一个机柜的机架上
                            3. 数据和任务job不在在同一个节点,也不在同一个机柜的机架上








                          总结:

                          1. 增加ApplicationMaster资源比例;
                          2. 容量调度器多对队列配置;
                          3. 容量调度器队列分配算法;
                          4. 模拟多队列测试并查看UI;




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

                          评论