可以用hadoop fs -ls查找超过N天的所有目录(从当前日期开始)吗?
我正在尝试编写一个清理例程来查找和删除在当前日期前N天创建的HDFS上的所有目录(匹配模式)。
答案 0 :(得分:16)
此脚本列出了早于[days]
的所有目录:
#!/bin/bash
usage="Usage: $0 [days]"
if [ ! "$1" ]
then
echo $usage
exit 1
fi
now=$(date +%s)
hadoop fs -lsr | grep "^d" | while read f; do
dir_date=`echo $f | awk '{print $6}'`
difference=$(( ( $now - $(date -d "$dir_date" +%s) ) / (24 * 60 * 60 ) ))
if [ $difference -gt $1 ]; then
echo $f;
fi
done
答案 1 :(得分:6)
如果您正在使用Hadoop的CDH
分发,它会附带一个非常有用的HdfsFindTool命令,其行为类似于Linux的find
命令。
如果您使用默认宗地信息,请按以下步骤操作:
hadoop jar /opt/cloudera/parcels/CDH/jars/search-mr-*-job.jar \
org.apache.solr.hadoop.HdfsFindTool -find PATH -mtime +N
您将PATH替换为搜索路径,将N替换为天数。
答案 2 :(得分:4)
对于真正的集群,这不是一个好主意, 使用ls。如果您有管理员权限, 它更适合使用fsimage。
我修改上面的脚本来说明想法。
首先,获取fsimage
curl "http://localhost:50070/getimage?getimage=1&txid=latest" > img.dump
将其转换为文本(与lsr相同的输出)
hdfs oiv -i img.dump -o fsimage.txt
脚本:
#!/bin/bash
usage="Usage: dir_diff.sh [days]"
if [ ! "$1" ]
then
echo $usage
exit 1
fi
now=$(date +%s)
curl "http://localhost:50070/getimage?getimage=1&txid=latest" > img.dump
hdfs oiv -i img.dump -o fsimage.txt
cat fsimage.txt | grep "^d" | while read f; do
dir_date=`echo $f | awk '{print $6}'`
difference=$(( ( $now - $(date -d "$dir_date" +%s) ) / (24 * 60 * 60 ) ))
if [ $difference -gt $1 ]; then
echo $f;
fi
done
答案 3 :(得分:1)
hdfs dfs -ls /hadoop/path/*.txt|awk' $ 6< " 2017年10月24日"'
答案 4 :(得分:0)
我既没有HdfsFindTool
,也没有fsimage
中的curl
,我也不太喜欢ls
到grep
和{ {1}}再次使用while
date
和awk
和hadoop
循环。
但我感谢您的回答。
我觉得可以只用一个awk
,一个ls
,甚至一个awk
来完成。
我还添加了列出文件或汇总文件的选项,然后选择删除它们以及选择特定目录。最后,我离开目录,只关心文件。
xargs
我希望其他人觉得这有用。