博学之,审问之,慎思之,明辨之,笃行之🏂
hive on spark搭建好后,任务提交会有问题,因为通过hive会话提交的任务一直存在且不会结束(除非关掉这个hive会话),根本原因是这些任务提交到了Yarn的同一个队列中,前面的任务没有执行完毕后面的任务不会执行,所以解决办法是增加一个Yarn队列,指定任务提交的队列,这样就不会出现任务的阻塞。
目录
一、情景复现
二、原因
三、Yarn队列配置—增加队列
1. 情景复现:
搭建好hive on spark 后,在命令行直接进入hive会话,提交任务后,在ResourceManager
上jps查看进程可以看到有个进程ApplicationMaster
一直存在,打开ResourceManager
的8088端口可以看到刚才提交的任务一直在default队列中而且状态是RUNNING运行状态,尽管刚才的SQL已经跑完了,但是任务还是处于运行状态,这是因为hive的会话一直开着,而且只要这个会话不关闭,他这个任务就不会结束。
查看任务:
我们再尝试着向Yarn提交一个任务,发现他一直卡在Runing job那里不动
再次查看web页面,发现任务已经提交上来
退出hive会话,再次查看,发现任务开始运行…
2. 原因:
梳理:原因是同一个队列中它前面的任务没有执行完,还没有轮到它执行。
分析:因为Yarn调度器默认是容量调度器,容量调度器中的多个队列可以并发执行,但是刚才的两个任务他们都提交到了同一个队列(default)中,而同一个队列中,又遵循先进先出(FIFO调度器)的原则,当前面的任务还没有执行完毕时,后面的任务不会执行,所以就出现了上面的现象。
优化:增加一个队列,将任务提交到不同的队列中。
3. Yarn队列配置—增加队列
增加一个名字叫hive的队列
修改hadoop配置文件目录下的capacity-scheduler.xml
配置文件
1.修改如下配置。增加hive队列,将默认队列的的资源容量设置为50%
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队列已经添加成功。
6.要向此队列提交任务的话,可以在hive客户端执行以下命令:
hive (default)> set mapreduce.job.queuename=hive;