温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。
Fayson的github: https://github.com/fayson/cdhproject
提示:代码块部分可以左右滑动查看噢
1
文档编写目的
Hive作业在运行时会在HDFS的临时目录产生大量的数据文件,这些数据文件会占用大量的HDFS空间。这些文件夹用于存储每个查询的临时或中间数据集,并且会在查询完成时通常由Hive客户端清理。但是,如果Hive客户端异常终止,可能会导致Hive作业的临时或中间数据集无法清理,从而导致Hive作业临时目录占用大量的HDFS空间。本篇文章Fayson主要介绍如何解决清理Hive作业产生的临时文件。
1.CM和CDH版本为5.15
2
Hive作业临时目录说明
Hive作业在运行时会在HDFS的指定目录下生成作业临时或中间数据集存储目录,此临时目录路径有hive-site.xml配置中的hive.exec.scratchdir参数定义:
当前Fayson的CDH5.15.0中Hive版本为1.1.0,Hive作业的临时或中间数据集在HDFS的/tmp/hive/${user.name}目录下:
3
清理Hive作业临时及目录
由于Hive客户端的作业异常退出客户端无法正常的清理HDFS的临时目录,从而导致临时数据文件占用了大量的HDFS空间。因此,需要在Hive作业临时目录中删除不需要的目录和已完成作业的目录文件。
注意:清理临时Hive作业产生的临时目录时,不能删除任何正在运行的Hive作业这样可能会导致作业运行失败。只可以删除不再与当前正在执行的Hive作业相关联的文件和目录。
1.创建一个定时清理作业的脚本hive_clean.sh内容如下:
[root@cdh3 clean]# vim hive-clean.sh
#!/bin/bash
kinit -kt /opt/cloudera/clean/hdfs.keytab hdfs/cdh3.fayson.com@FAYSON.COM
yarn jar /opt/cloudera/parcels/CDH/lib/solr/contrib/mr/search-mr-*-job.jar org.apache.solr.hadoop.HdfsFindTool -find '/tmp/hive/' -type d -name '*' -mtime +7 | xargs hdfs dfs -rm -r -f -skipTrash
(可左右滑动)
2.将hive-clean.sh脚本放在/opt/cloudera/clean目录下
注意:Fayson的集群启用了Kerberos,所以这里使用了hdfs用户的keytab,确保执行HDFS命令时有权限删除不用用户创建的临时文件和目录。
3.在Linux中配置crontab定时任务,脚本如下:
[root@cdh3 ~]# chmod +x /opt/cloudera/clean/hive-clean.sh
[root@cdh3 ~]# crontab -e
*/1 * * * * /opt/cloudera/clean/hive-clean.sh > /opt/cloudera/clean/clean.log 2>&1 &
(可左右滑动)
这里配置的crontab为每分钟执行一次脚本可以将执行频率调整至1天即“* * */1 * *”
4.查看执行日志
4
总结
1.Hive作业在运行时会将临时或中间结果存储HDFS,如果Hive客户端作业异常退出会导致HDFS上存储的临时数据不能被清除而导致HDFS空间被占用。
2.可以通过创建定时任务定期的将Hive作业的临时文件和目录删除
3.清理Hive作业临时文件和目录时需要注意,不能将正在运行的作业文件和目录清除,否则会导致作业运行失败。
提示:代码块部分可以左右滑动查看噢
为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。
推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。