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(_))
}