使用find命令清理linux服务器及hdfs集群日志及垃圾文件

699 阅读3分钟

linux


#!/bin/bash
#访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
#修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。
#变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间

#统计文件大小
du -sh data  opt  root  script  var

#列出当前文件夹下所有文件及路径
#find data -type f -print


# {} ; :固定写法,大括号+空格++;
#删除所有 /data 目录下三天前的文件
find /data -mtime +3 -name "*.*" -exec rm -rf {} \;

# 删除root家目录文件
#此操作会删除linux中的重要隐藏目录文件,注意使用方式
#find ~/ -mtime +3 -name "*.*" -exec rm -rf {} \;

#-o代表的是 or, 默认为-a and
find /root/ -mtime +3 -name "*.json" -o -name "*.sh" -o -name "*.txt" -o -name "*.jar" -o -name "*.csv" -o -name "*.sql" -exec rm -rf {} \;


#删除该目录下7天前的所有日志文件
find /opt -mtime +7 -name "*.log" -o -name "*.out" -exec rm -rf {} \;


#超过七天的备份jar包
find /script -mtime +7 -name "*.jar_*" -exec rm -rf {} \;


find /var -mtime +30 -name "*.log.*" -exec rm -rf {} \;
#删除7天的日志文件并排除kafka数据存储目录
#find /var -mtime +7 -name "*.log" -o -path /var/local/kafka/data -prune -false -exec rm -rf {} \;

#清空7天的日志文件并排除kafka数据存储目录
find /var -mtime +7 -name "*.log" -o -path /var/local/kafka/data -prune -false | xargs truncate -s 0

hdfs

查看根目录存储使用情况

第一列为文件(目录)大小 第二列为所有副本之和的大小 第三列为目录名称

hdfs dfs -du  -h /

1.5 K    4.5 K    /anaconda-ks.cfg
14.8 G   44.4 G   /data
311.0 K  933.0 K  /dolphinscheduler
0        0        /flink-checkpoints
6.4 K    19.3 K   /home
445.3 M  890.7 M  /streamx
0        0        /system
15.6 G   31.5 G   /tmp
843.2 G  1.9 T    /user

统计根目录所有文件之和大小

hdfs dfs -du  -s -h /

874.1 G  1.9 T  /

根据时间删除hdfs数据

# grep -v items 过滤功能 -v为反查 如果遇到items 会直接过滤掉该行
#hdfs路径
path="/data/script/ods/idm"
#删除七天前的数据
dt=`date -d "7 day ago" +%Y%m%d`

hdfs dfs -ls -R ${path} |awk '{print $6,$NF}' | grep -v items | while read filetime filepath
do

    parsefiletime=$(date -d $filetime +%Y%m%d)

    #echo $dt
    #echo $parsefiletime
    #-ge 大于等于  -le 小于等于
    if [[ ${dt} -ge ${parsefiletime} ]];then
      hdfs  dfs -rm -r  $filepath
    fi
done

命令详情

-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [-e] [<path> ... ] 。
  列出符合指定文件模式的内容。如果没有指定路径
  指定,/user/<currentUser>的内容将被列出。对于一个目录
  会返回其直接子目录的列表(除非指定了-d选项)。
  
  目录条目的形式是。
        permissions - userId groupId sizeOfDirectory(in bytes)
  修改日期(yyyy-MM-dd HH:mm) 目录名
  
  和文件条目的形式是:
        permissions numberOfReplicas userId groupId sizeOfFile(in bytes)
  修改日期(yyyy-MM-dd HH:mm) 文件名
  
    -C 只显示文件和目录的路径。
    -d 目录作为普通文件列出。
    -h 以人类可读的方式显示文件的大小,而不是字节数。
        而不是一个字节数。
    -q 打印? 而不是不可打印的字符。
    -R 递归地列出目录的内容。
    -t 按修改时间对文件进行排序(最近的在前)。
    -S 按大小对文件进行排序。
    -r 反转排序的顺序。
    -u 使用最后访问时间而不是修改时间来显示和排序。
        显示和排序。
    -e 显示文件和目录的清除编码策略。


清理hive数仓数据

1、遍历数仓所有表名

hdfs dfs -ls  /user/hive/warehouse/ods.db | awk -F "/" '{print $NF}'|while read dbtablename
do

    echo $dbtablename
    echo "所有表名都拿到了,可以按分区删除。也可以直接调belline直接清空表,执行操作即可"
done

示例(我司需删除所有数仓ODS层历史数据,但保留每个月月初的数据)

log_path=./remove_hadoop_hive_history_file.log

#清空脚本文件
truncate -s 0 $log_path

hdfs dfs -ls  /user/hive/warehouse/ods.db | awk -F "/" '{print $NF}'|while read dbtablename
do

    #echo $dbtablename
    #echo "所有表名都拿到了,可以按分区删除。也可以直接调belline直接清空表,执行操作即可"
        # 来个示例 
        #我司需删除所有数仓ODS层历史数据,但保留每个月月初的数据 实现

        #填写日期区间 左闭右开
        first='20200101'
        second='20230101'

        while [ "$first" != "$second" ]
        do

        #格式化yyyymmdd为yyyymm
        partition_y_m=`date -d "${first}" +%Y%m`

        sql="alter table ods.${dbtablename} drop partition (dt >'${partition_y_m}02', dt<='${partition_y_m}31');"
        #脚本命令写入文件
        echo $sql >> $log_path

        #时间递增
        first=`date -d "-1 month ago ${first}" +%Y%m%d`

        done
done

#命令执行
#beeline -u jdbc:hive2://0.0.0.0:10000 -e "$log_path"

2、按照给定的开始时间及结束时间删除分区(并兼容过滤某些特定日期的能力,如月初,月末)

搞大数据的scala必知必会,没学的建议学习。本工具类是遍历出所有的日期删除sql语句,并不会直接删除表分区。如果需执行删除操作,引hive_jdbc依赖进来删就可以。如果没有涉及保留月初月末的日期,则建议直接更改代码直接以 < > =操作符完成清理操作。不必遍历出每条sql去执行增大服务压力


/**
 * 删除分区SQL
 * @param listBuffer
 * @param starTime
 * @param endTime
 */
def parseArrayHiveTableName(listBuffer: ListBuffer[String], starTime: (Int, Int, Int), endTime: (Int, Int, Int)): ListBuffer[String] = {
  listBuffer
    .map(x => {
      deleteTimeBuffer(starTime, endTime)
        .map(y => {
          s"alter table $x drop partition (dt = '$y');"
        })
    })
    .flatten
}

/**
 * 递归不停的去叠加时间
 * @param fromDt
 * @return
 */
def dateStream(fromDt:LocalDate):Stream[LocalDate] = fromDt #::dateStream(fromDt.plusDays(1))

/**
 * 传入开始结束时间,过滤月初和月末时间
 * @param starTime
 * @param endTime
 */
def deleteTimeBuffer(starTime: (Int,Int,Int), endTime: (Int,Int,Int)): ListBuffer[String] ={
  dateStream(LocalDate.of(starTime._1, starTime._2, starTime._3))
    .takeWhile(_.isBefore(LocalDate.of(endTime._1, endTime._2, endTime._3)))
    //过滤月初
    .filter(_.getDayOfMonth != 1)
    //过滤月末
    .filter(x => {
      x.isBefore(x.plusMonths(1).plusDays(-x.getDayOfMonth))
    })
    .map(_.toString.replace("-",""))
    .to[ListBuffer]
}

def main(args: Array[String]): Unit = {
  //表名构成的数组
  val listBuffer = Array("ods.ods_crm_approval_authorization", "ods.ods_crm_crm_custom").to[ListBuffer]
  //开始时间
  val starTime = (2022, 1, 1)
  //结束时间
  val endTime = (2022, 9, 1)

  parseArrayHiveTableName(listBuffer, starTime, endTime)
    .foreach(println(_))
}