在HDFS上删除超过10天的文件

时间:2017-05-29 05:15:55

标签: hadoop hdfs

有没有办法在HDFS上删除超过10天的文件?

在Linux中我会使用:

AsNoTracking()

有没有办法在HDFS上执行此操作? (根据文件创建日期删除)

6 个答案:

答案 0 :(得分:7)

这个怎么样:

ifconfig

详细说明为here

答案 1 :(得分:4)

解决方案1:使用daemon12

回答的多个命令
hdfs dfs -ls /file/Path    |   tr -s " "    |    cut -d' ' -f6-8    |     grep "^[0-9]"    |    awk 'BEGIN{ MIN=14400; LAST=60*MIN; "date +%s" | getline NOW } { cmd="date -d'\''"$1" "$2"'\'' +%s"; cmd | getline WHEN; DIFF=NOW-WHEN; if(DIFF > LAST){ print "Deleting: "$3; system("hdfs dfs -rm -r "$3) }}'

解决方案2:  使用Shell脚本

today=`date +'%s'`
hdfs dfs -ls /file/Path/ | grep "^d" | while read line ; do
dir_date=$(echo ${line} | awk '{print $6}')
difference=$(( ( ${today} - $(date -d ${dir_date} +%s) ) / ( 24*60*60 ) ))
filePath=$(echo ${line} | awk '{print $8}')

if [ ${difference} -gt 10 ]; then
    hdfs dfs -rm -r $filePath
fi
done

答案 2 :(得分:2)

是的,您可以尝试 HdfsFindTool

hadoop jar /opt/cloudera/parcels/CDH/lib/solr/contrib/mr/search-mr-job.jar \
  org.apache.solr.hadoop.HdfsFindTool \
  -find /pathhodir -mtime +10 -name ^.*\.txt$ \
  | xargs hdfs dfs -rm -r -skipTrash

答案 3 :(得分:1)

我试图实现上面公认的解决方案。

不幸的是,它仅对我有用。我遇到了3个现实世界中的问题。

首先,hdfs没有足够的RAM来加载和打印所有文件。

第二,即使hdfs可以打印awk的所有文件,在破损之前也只能处理约8300条记录。

第三,表现很糟糕。实施后,它每分钟删除约10个文件。这没什么用,因为我每分钟生成约240个文件。

所以我的最终解决方案是:

tmpfile=$(mktemp)
HADOOP_CLIENT_OPTS="-Xmx2g" hdfs dfs -ls /path/to/directory    |   tr -s " "    |    cut -d' ' -f6-8    |     grep "^[0-9]"    |    awk 'BEGIN{ MIN=35*24*60; LAST=60*MIN; "date +%s" | getline NOW } { cmd="date -d'\''"$1" "$2"'\'' +%s"; cmd | getline WHEN; DIFF=NOW-WHEN; if(DIFF > LAST){ print $3}}; close(cmd);' > $tmpfile
hdfs dfs -rm -r $(cat $tmpfile)
rm "$tmpfile"

我不知道此解决方案是否还有其他限制,但是它可以及时处理50,000多个记录。

编辑:有趣的是,我再次遇到了这个问题,在删除时,由于hdfs rm语句最多只能输入32,000个输入,因此我必须对删除的内容进行批处理。

答案 4 :(得分:0)

hdfs dfs -ls -t /file/Path|awk -v dateA="$date" '{if ($6" "$7 < {target_date}) {print ($8)}}'|xargs -I% hdfs dfs -rm "%" /file/Path

答案 5 :(得分:0)

today=`date +'%s'`
days_to_keep=10

# Loop through files
hdfs dfs -ls -R /file/Path/ | while read f; do
  # Get File Date and File Name
  file_date=`echo $f | awk '{print $6}'`
  file_name=`echo $f | awk '{print $8}'`

  # Calculate Days Difference
  difference=$(( ($today - $(date -d $file_date +%s)) / (24 * 60 * 60) ))
  if [ $difference -gt $days_to_keep ]; then
    echo "Deleting $file_name it is older than $days_to_keep and is dated $file_date."
    hdfs dfs -rm -r $file_name
  fi
done