hive on spark搭建好后,任务提交会有问题,因为通过hive会话提交的任务一直存在且不会结束(除非关掉这个hive会话),根本原因是这些任务提交到了Yarn的同一个队列中,前面的任务没有执行完毕后面的任务不会执行,所以解决办法是增加一个Yarn队列,指定任务提交的队列,这样就不会出现任务的阻塞。

目录

一、情景复现

二、原因

三、Yarn队列配置—增加队列

1. 情景复现:

搭建好hive on spark 后,在命令行直接进入hive会话,提交任务后,在ResourceManager上jps查看进程可以看到有个进程ApplicationMaster一直存在,打开ResourceManager的8088端口可以看到刚才提交的任务一直在default队列中而且状态是RUNNING运行状态,尽管刚才的SQL已经跑完了,但是任务还是处于运行状态,这是因为hive的会话一直开着,而且只要这个会话不关闭,他这个任务就不会结束。

cdh yarn 队列设置 yarn新增队列_cdh yarn 队列设置

cdh yarn 队列设置 yarn新增队列_大数据_02

cdh yarn 队列设置 yarn新增队列_hive on spark_03

查看任务:

cdh yarn 队列设置 yarn新增队列_hive on spark_04


我们再尝试着向Yarn提交一个任务,发现他一直卡在Runing job那里不动

cdh yarn 队列设置 yarn新增队列_yarn增加新队列_05

再次查看web页面,发现任务已经提交上来

cdh yarn 队列设置 yarn新增队列_hadoop_06

退出hive会话,再次查看,发现任务开始运行…

cdh yarn 队列设置 yarn新增队列_大数据_07

2. 原因:

梳理:原因是同一个队列中它前面的任务没有执行完,还没有轮到它执行。

分析:因为Yarn调度器默认是容量调度器,容量调度器中的多个队列可以并发执行,但是刚才的两个任务他们都提交到了同一个队列(default)中,而同一个队列中,又遵循先进先出(FIFO调度器)的原则,当前面的任务还没有执行完毕时,后面的任务不会执行,所以就出现了上面的现象。

优化:增加一个队列,将任务提交到不同的队列中。

3. Yarn队列配置—增加队列

增加一个名字叫hive的队列

修改hadoop配置文件目录下的capacity-scheduler.xml配置文件

1.修改如下配置。增加hive队列,将默认队列的的资源容量设置为50%

cdh yarn 队列设置 yarn新增队列_hive on spark_08

2.增加如下配置

<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>
      一个用户最多能够获取该队列资源容量的比例
    </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>
</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队列中任务的最大生命时长,-1表示时间无限长
</description>
</property>
<property>
    <name>yarn.scheduler.capacity.root.hive.default-application-lifetime</name>
	<value>-1</value>
    <description>
      default队列中任务的最大生命时长
</description>
</property>

3.将配置文件分发给各个机器
4.重启Hadoop集群
5.访问ResourceManager的8088端口,查看队列是否添加成功。
 可以看到hive队列已经添加成功。

cdh yarn 队列设置 yarn新增队列_hive on spark_09


6.要向此队列提交任务的话,可以在hive客户端执行以下命令:

hive (default)> set mapreduce.job.queuename=hive;