hadoopfs-ls可以用来查找所有超过n天(从当前日期算起)的目录吗?我正在尝试编写一个清理例程来查找和删除hdfs上所有在当前日期前n天创建的目录(匹配模式)。
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
ajsxfq5m2#
我没钱 HdfsFindTool ,也不是 fsimage 从 curl ,我不太喜欢 ls 至 grep 与 while 循环使用date awk 以及 hadoop 以及 awk 再一次。但我很感激你的回答。我觉得只要一个就可以了 ls ,一个 awk ,也许还有一个 xargs .我还添加了一些选项来列出文件或在选择删除它们之前对它们进行摘要,以及选择一个特定的目录。最后,我离开目录,只关心自己的文件。
HdfsFindTool
fsimage
curl
ls
grep
while
awk
hadoop
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
我希望其他人觉得这很有用。
mfuanj7w3#
此脚本列出所有早于的目录 [days] :
[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
7tofc5zh4#
hdfs dfs-ls/hadoop/path/*.txt | awk'$6<“2017-10-24”'
lfapxunr5#
如果你碰巧使用 CDH 在hadoop的发行版中,它附带了一个非常有用的hdfsfindtool命令,其行为类似于linux find 命令。如果您使用的是默认的地块信息,请按以下方式操作:
CDH
find
hadoop jar /opt/cloudera/parcels/CDH/jars/search-mr-*-job.jar \ org.apache.solr.hadoop.HdfsFindTool -find PATH -mtime +N
用搜索路径替换path,用天数替换n。
5条答案
按热度按时间cgfeq70w1#
对于真正的集群,使用ls不是一个好主意。如果您有管理员权限,则更适合使用fsimage。
我修改上面的脚本来说明这个想法。
首先,获取fsimage
将其转换为文本(与lsr提供的输出相同)
脚本:
ajsxfq5m2#
我没钱
HdfsFindTool
,也不是fsimage
从curl
,我不太喜欢ls
至grep
与while
循环使用date
awk
以及hadoop
以及awk
再一次。但我很感激你的回答。我觉得只要一个就可以了
ls
,一个awk
,也许还有一个xargs
.我还添加了一些选项来列出文件或在选择删除它们之前对它们进行摘要,以及选择一个特定的目录。最后,我离开目录,只关心自己的文件。
我希望其他人觉得这很有用。
mfuanj7w3#
此脚本列出所有早于的目录
[days]
:7tofc5zh4#
hdfs dfs-ls/hadoop/path/*.txt | awk'$6<“2017-10-24”'
lfapxunr5#
如果你碰巧使用
CDH
在hadoop的发行版中,它附带了一个非常有用的hdfsfindtool命令,其行为类似于linuxfind
命令。如果您使用的是默认的地块信息,请按以下方式操作:
用搜索路径替换path,用天数替换n。