由于历史日志的多年积攒,集群的资源十分紧张,而且有一些日志对线上意义已经不大了,所以部分日志需要清除,部分需要压缩,释放资源。
删除日志
hadoop fs -rm -r /user/hdfs/rsync/2017*/*.txt
*为通配,该命令慎用,建议多次测试之后使用
压缩日志
第一次尝试使用hdfs上自带的归档命令进行操作
hadoop archive -archiveName 最终生成的文件名.har -p 需要归档的文件或文件夹,可多写 最终生成的文件路径
例如:hadoop archive -archiveName rsync_2018.har -p /user/hdfs/rsync aaa/2018* bbb/2018* /archive/rsync
这个命令其实就是将你以前的日志文件都归档到一个文件夹下,但是有一个缺点就是,不会保留以前的文件夹名称,这点很坑,上图吧
原始数据
归档后
由于后期可能还会溯源,所以这种方式只能pass掉了。
后来采用的是先将hdfs日志文件拉到本地
hadoop fs -get /user/hdfs/rsync/2018-01* /home/cronjob/wpq/hdfs/rysnc
如果数据量不大,可以考虑一次拉取一年的数据,数据量大的话就别这样操作,会影响hdfs的读写,接着在本地使用命令压缩,压缩比1:6
#! /bin/bash
echo " startTime: "+ `date "+%Y-%m-%d %H:%M:%S"`
dir=/home/cronjob/wpq/hdfs/rysnc
for file in $dir/*
do
if [ -d $file ]
then
for file2 in $file/*
do
if [[ $file2 == *txt ]]
then
tar --warning=no-file-changed -zcvP -f $file2'.gz' $file
rm -rf $file2
echo $file2" COMPRESS SUCCESS"
fi
done
fi
done
echo " endTime: "+ `date "+%Y-%m-%d %H:%M:%S"`
最后将压缩后的文件上传到hdfs目标目录下,测试没问题之后,删除原始目录文件
hadoop fs -put /home/cronjob/wpq/hdfs/rysnc/* /user/hdfs/rsync
hadoop fs -rm -r /user/hdfs/rsync/2018*/*.txt
希望对有类似需求的同学有所帮助,也可以用代码去压缩。
但是,有一点:压缩方案千万种,数据安全第一条。校验不充分,自己两行泪。