Yarn容量调度器优化之并行处理问题

0 引 言

Yarn默认调度器为Capacity Scheduler(容量调度器),且默认只有一个队列——default。如果队列中执行第一个任务资源不够,就不会再执行第二个任务,一直等到第一个任务执行完毕。

1 实 验

(1)启动1个hive客户端,执行以下插入数据的sql语句。

hive (default)> insert into table student values(1,'abc');

执行该语句,hive会初始化一个Spark Session,用以执行hive on spark任务。由于未指定队列,故该Spark Session默认占用使用的就是default队列,且会一直占用该队列,直到退出hive客户端。

可访问ResourceManager的web页面查看相关信息。

(2)在hive客户端开启的状态下,提交一个MR。

[root@hadoop102 ~]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi 1 1

MR任务同样未指定队列,所以其默认也提交到了default队列,由于容量调度器单个队列的并行度为1。故后提交的MR任务会一直等待,不能开始执行。

任务提交界面如下:

ResourceManager的web页面如下:

(3)容量调度器default队列中,同一时间只有一个任务执行,并发度低,如何解决呢?

方案一:增加ApplicationMaster资源比例,进而提高运行app数量。

方案二:创建多队列,比如增加一个hive队列。

2 增加ApplicationMaster资源比例

针对容量调度器并发度低的问题,考虑调整yarn.scheduler.capacity.maximum-am-resource-percent该参数。默认值是0.1,表示集群上AM最多可使用的资源比例,目的为限制过多的app数量。

(1)在hadoop102的/opt/module/hadoop-3.1.3/etc/Hadoop/capacity-scheduler.xml文件中修改如下参数值

[root@hadoop102 hadoop]$ vim capacity-scheduler.xml

<property>

    <name>yarn.scheduler.capacity.maximum-am-resource-percent</name>

    <value>0.5</value>

    <description>

      集群中用于运行应用程序ApplicationMaster的资源比例上限,

该参数通常用于限制处于活动状态的应用程序数目。该参数类型为浮点型,

默认是0.1,表示10%。所有队列的ApplicationMaster资源比例上限可通过参数

yarn.scheduler.capacity.maximum-am-resource-percent设置,而单个队列可通过参数yarn.scheduler.capacity.<queue-path>.maximum-am-resource-percent设置适合自己的值。

    </description>

  </property

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

[root@hadoop102 hadoop]$ xsync capacity-scheduler.xml

(3)关闭正在运行的任务,重新启动yarn集群

[root@hadoop103 hadoop-3.1.3]$ sbin/stop-yarn.sh

[root@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh

4 增加Yarn容量调度器队列

方案二:创建多队列,也可以增加容量调度器的并发度。

在企业里面如何配置多队列:

按照计算引擎创建队列hive、spark、flink

按照业务创建队列:下单、支付、点赞、评论、收藏(用户、活动、优惠相关)

有什么好处?

假如公司来了一个菜鸟,写了一个递归死循环,公司集群资源耗尽,大数据全部瘫痪。

解耦。

假如11.11数据量非常大,任务非常多,如果所有任务都参与运行,一定执行不完,怎么办?

可以支持降级运行。

下单 √

       支付√

              点赞X

1 增加容量调度器队列

(1)修改容量调度器配置文件

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

<property>

    <name>yarn.scheduler.capacity.root.queues</name>

    <value>default,hive</value>

    <description>

     再增加一个hive队列

    </description>

</property>


<property>

    <name>yarn.scheduler.capacity.root.default.capacity</name>

<value>50</value>

    <description>

      default队列的容量为50%

    </description>

</property>

同时为新加队列添加必要属性:

<property>

    <name>yarn.scheduler.capacity.root.hive.capacity</name>

<value>50</value>

    <description>

      hive队列的容量为50%

    </description>

</property>


<property>

    <name>yarn.scheduler.capacity.root.hive.user-limit-factor</name>

<value>1</value>

    <description>

      一个用户最多能够获取该队列资源容量的比例,取值0-1

    </description>

</property>


<property>

    <name>yarn.scheduler.capacity.root.hive.maximum-capacity</name>

<value>80</value>

    <description>

      hive队列的最大容量(自己队列资源不够,可以使用其他队列资源上限)

    </description>

</property>


<property>

    <name>yarn.scheduler.capacity.root.hive.state</name>

    <value>RUNNING</value>

    <description>

      开启hive队列运行,不设置队列不能使用

    </description>

</property>


<property>

    <name>yarn.scheduler.capacity.root.hive.acl_submit_applications</name>

<value>*</value>

    <description>

      访问控制,控制谁可以将任务提交到该队列,*表示任何人

    </description>

</property>


<property>

    <name>yarn.scheduler.capacity.root.hive.acl_administer_queue</name>

<value>*</value>

    <description>

      访问控制,控制谁可以管理(包括提交和取消)该队列的任务,*表示任何人

    </description>

</property>


<property>

    <name>yarn.scheduler.capacity.root.hive.acl_application_max_priority</name>

<value>*</value>

<description>

      指定哪个用户可以提交配置任务优先级

    </description>

</property>


<property>

    <name>yarn.scheduler.capacity.root.hive.maximum-application-lifetime</name>

<value>-1</value>

    <description>

      hive队列中任务的最大生命时长,以秒为单位。任何小于或等于零的值将被视为禁用。

</description>

</property>

<property>

    <name>yarn.scheduler.capacity.root.hive.default-application-lifetime</name>

<value>-1</value>

    <description>

      hive队列中任务的默认生命时长,以秒为单位。任何小于或等于零的值将被视为禁用。

</description>

</property>

(2)分发配置文件

[root@hadoop102 ~]$ xsync /opt/module/hadoop-3.1.3/etc/hadoop/capacity-scheduler.xml

(3)重启Hadoop集群

2 测试新队列

(1)提交一个MR任务,并指定队列为hive

[root@hadoop102 ~]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi -Dmapreduce.job.queuename=hive 1 1

(2)查看ResourceManager的web页面,观察任务被提交到的队列

猜你喜欢

转载自blog.csdn.net/godlovedaniel/article/details/108583602