温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。
Fayson的github: https://github.com/fayson/cdhproject
提示:代码块部分可以左右滑动查看噢
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的会话、操作/查询的超时时间来关闭查询,该方法可以根据集群的使用情况及查询时间适当的调整。
提示:代码块部分可以左右滑动查看噢
为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。
推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。
原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操