shell脚本案例(二):HDFS文件定期清理

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


案例

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

解决思路

  1. 设定使用率阈值
  2. 查询当前使用率,若达到阈值,查找出最早5天的文件
  3. 将查找到的文件删除

问题

  1. Linux shell可以用find通过时间来查找文件,但hdfs shell 的find参数似乎不能用时间来查找。因此需要先将dfs ls下的文件进行时间排序。就可以找出最早的文件了.
  2. hdfs dfs rm用来删除文件,这个命令是将文件移动到回收站,回收站同样占用空间。使用-skipTrash参数可以直接永久删除。

脚本编写

#!/bin/bash
# 检查dfs磁盘空间,清理过期日志

day=5
limit=95

basedir=/app/applogs
logfile=/app/scripts/logs/clear_hdfs_logs.log


logger(){
  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

你可能感兴趣的:(shell,运维)