在HDFS中查找超过N天的目录

时间:2012-09-27 03:55:53

标签: hadoop hdfs

可以用hadoop fs -ls查找超过N天的所有目录(从当前日期开始)吗?

我正在尝试编写一个清理例程来查找和删除在当前日期前N天创建的HDFS上的所有目录(匹配模式)。

5 个答案:

答案 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,我也不太喜欢lsgrep和{ {1}}再次使用while dateawkhadoop循环。 但我感谢您的回答。

我觉得可以只用一个awk,一个ls,甚至一个awk来完成。

我还添加了列出文件或汇总文件的选项,然后选择删除它们以及选择特定目录。最后,我离开目录,只关心文件。

xargs

我希望其他人觉得这有用。