1.问题现象
测试环境1.Redhat7.4
2.CDH5.16.1
在HDFS上有许多Hive Staging目录,占用了大量的空间,有些目录占用的空间甚至比原始表还大,如下截图显示:

2.异常重现及分析
1.使用beeline、hive、spark-shell等多种方式执行Hive SQL语句验证产生的hive staging目录是否不会被清除,结果发现在SQL执行结束后产生的staging档案均会自动被移除。
2.使用Hue上的Hive Editor来进行验证,发现执行的SQL产生的staging目录在SQL执行完成后并不会被清除,在Hue上执行一个Hive的Insert语句

使用hadoop命令看到在相应表下生成的hive-staging_hive_xxx的临时目录一直存在并未因为SQL执行完成而清除掉。

根据上述分析发现,出现上述问题的原因主要是由于在Hue上使用Hive Editor执行查询导致。Hue为了让使用者能够检视历史执行SQL及返回结果,所以必须确保每个查询的结果是可以开启的。
因此,Hue上在查询执行期间建立的staging目录,Hive的清除事件永远不会被呼叫,也就导致了所有通过Hue执行的查询建立的staging目录永远不会被删除。
接下来针对上述问题进行提出两种解决方案,具体看如下说明。
3.问题解决
3.1.解决方案一
通过设定使用者离开Hive的查询界面时强制Hue关闭查询,可以通过如下方式操作:
1.登入CM进入Hue的配置界面

2.在搜寻栏输入“hue*.ini”在配置项中增加如下内容
[beeswax]
close_queries=true

3.完成上述配置后重启Hue服务即可
注意:上述解决方法也存在弊端,使用者无法再通过Hue检视历史执行的SQL语句及查询结果,且使用者在执行查询时离开Hive的编辑页面,则正在执行的查询也会关闭(查询不会后台执行)。
3.2.解决方案二
通过设定HiveServer2的以下引数来控制会话和操作/查询的超时时间。
hive.server2.session.check.interval = 1 hour
hive.server2.idle.operation.timeout = 1 day
hive.server2.idle.session.timeout = 3 days
hive.server2.idle.operation.timeout:表示执行的操作及查询超过1天将会被关闭。
引数hive.server2.idle.operation.timeout:除错HiveServer2会话在空闲状态超过3天将会关闭。
hive.server2.session.check.interval:每个小时检查一次。
1.登入CM进入Hive的配置界面

2.根据自己当前丛集使用情况和查询时间适当的修改这些值,如下截图为Fayson测试修改的引数


4.总结
1.在Hue上的Hive编辑器执行SQL查询时,由于Hue上需要储存历史查询SQL及结果,所以会导致执行SQL过程中查询的staging目录没有被Hive的清除事件删除。
2.可以通过修改Hue的配置,指定close_queries=true,当用户离开Hive的编辑器页面后Hue会强制关闭查询,该解决方法会有一定的弊端。
3.也可以通过配置HiveServer2的会话、操作/查询的超时时间来关闭查询,该方法可以根据丛集的使用情况及查询时间适当的调整。





























