当前环境的HDFS的空间使用率,即将达到95%,手动清理比较繁琐,需要写个脚本定期清理下最早5天的日志量。方法之一:

案例

定期检查hdfs的空间占用率,若超过95%,则删除最早5天的日志文件。

解决思路

* 设定使用率阈值
* 查询当前使用率,若达到阈值,查找出最早5天的文件
* 将查找到的文件删除
问题

* Linux shell可以用find通过时间来查找文件,但hdfs shell 的find参数似乎不能用时间来查找。因此需要先将dfs
ls下的文件进行时间排序。就可以找出最早的文件了.
* hdfs dfs rm用来删除文件,这个命令是将文件移动到回收站,回收站同样占用空间。使用-skipTrash参数可以直接永久删除。
脚本编写
#!/bin/bash # 检查dfs磁盘空间,清理过期日志 day=5 limit=95 basedir=/app/applogs
logfile=/app/scripts/logs/clear_hdfs_logs.loglogger(){ msg=$1 cdate=$(date +%F)
ctime=$(date'+%F %T') echo "$ctime $1" >> ${logfile}_$cdate } find_logs(){ n=$1
# find year lasted_year=$(hdfs dfs -ls $basedir |awk -F'/' 'NR>1{print $NF}'
|sort -n|head -n1) logger"lasted year: $lasted_year" # find month basedir_year=
$basedir/$lasted_year lasted_month=$(hdfs dfs -ls $basedir_year |awk -F'/'
'NR>1{print $NF}' |sort -n|head -n1) logger "lasted_month: $lasted_month" #
find day basedir_month=$basedir_year/$lasted_month lasted_days=$(hdfs dfs -ls
$basedir_month |awk -F'/' 'NR>1{print $NF}' |sort -n|head -n$n) for i in
$lasted_days do rm_logs $basedir_month/$i done # check empty dir, and delete
n1=$(hdfs dfs -ls$basedir_month |wc -l) if [ $n1 -eq 0 ];then rm_empty
$basedir_month fi n2=$(hdfs dfs -ls $basedir_year |wc -l) if [ $n2 -eq 0 ];then
rm_empty$basedir_year fi } rm_logs() { target=$1 logger "clear old logs: hdfs
dfs -rm -r -skipTrash$target" hdfs dfs -rm -r -skipTrash $target } rm_empty() {
target=$1 logger "clear empty dir: hdfs dfs -rm -r -skipTrash $target" hdfs dfs
-rm -r -skipTrash$target } disk_used=$(hdfs dfsadmin -report|awk -F':|%' 'NR==5
{print $3}') if [ $(echo "$disk_used > $limit"|bc) -eq 1 ];then logger "current:
$disk_used %, $limit +" find_logs $day else logger "current: $disk_used %,
$limit -, exit " fi

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信