在hdfs中查找早于n天的目录

pieyvz9o  于 2021-06-03  发布在  Hadoop
关注(0)|答案(5)|浏览(548)

hadoopfs-ls可以用来查找所有超过n天(从当前日期算起)的目录吗?
我正在尝试编写一个清理例程来查找和删除hdfs上所有在当前日期前n天创建的目录(匹配模式)。

cgfeq70w

cgfeq70w1#

对于真正的集群,使用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
ajsxfq5m

ajsxfq5m2#

我没钱 HdfsFindTool ,也不是 fsimagecurl ,我不太喜欢 lsgrepwhile 循环使用
date awk 以及 hadoop 以及 awk 再一次。但我很感激你的回答。
我觉得只要一个就可以了 ls ,一个 awk ,也许还有一个 xargs .
我还添加了一些选项来列出文件或在选择删除它们之前对它们进行摘要,以及选择一个特定的目录。最后,我离开目录,只关心自己的文件。


# !/bin/bash

USAGE="Usage: $0 [N days] (list|size|delete) [path, default /tmp/hive]"
if [ ! "$1" ]; then
  echo $USAGE
  exit 1
fi
AGO="`date --date "$1 days ago" "+%F %R"`"

echo "# Will search for files older than $AGO"
if [ ! "$2" ]; then
  echo $USAGE
  exit 1
fi
INPATH="${3:-/tmp/hive}"

echo "# Will search under $INPATH"
case $2 in
  list)
    hdfs dfs -ls -R "$INPATH" |\
      awk '$1 ~ /^[^d]/ && ($6 " " $7) < '"\"$AGO\""
  ;;
  size)
    hdfs dfs -ls -R "$INPATH" |\
      awk '$1 ~ /^[^d]/ && ($6 " " $7) < "'"$AGO"'" {
           sum += $5 ; cnt += 1} END {
           print cnt, "Files with total", sum, "Bytes"}'
  ;;
  delete)
    hdfs dfs -ls -R "$INPATH" |\
      awk '$1 ~ /^[^d]/ && ($6 " " $7) < "'"$AGO"'" {print $8}' | \
      xargs hdfs dfs -rm -skipTrash
  ;;
  *)
    echo $USAGE
    exit 1
  ;;
esac

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

mfuanj7w

mfuanj7w3#

此脚本列出所有早于的目录 [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
7tofc5zh

7tofc5zh4#

hdfs dfs-ls/hadoop/path/*.txt | awk'$6<“2017-10-24”'

lfapxunr

lfapxunr5#

如果你碰巧使用 CDH 在hadoop的发行版中,它附带了一个非常有用的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。

相关问题