删除HDFS上超过10天的文件

问题描述 投票:0回答:8

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

在 Linux 中我会使用:

find /path/to/directory/ -type f -mtime +10 -name '*.txt' -execdir rm -- {} \;

有没有办法在 HDFS 上做到这一点? (根据文件创建日期进行删除)

hadoop hdfs
8个回答
21
投票

解决方案 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

16
投票

这个怎么样:

hdfs dfs -ls /tmp    |   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) }}'

详细说明在这里


4
投票

是的,您可以尝试使用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

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 个输入。


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

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

0
投票

谢谢@Ani Menon 的回答

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) }}'

并更新至

EXPIRED_DAY=80; PP='a hdfs path'; hdfs dfs -ls "${PP}" | tr -s ' ' | cut -d' ' -f6-8 | grep "^[0-9]" | awk -v TEST=${TEST} -v EXPIRED_DAY=${EXPIRED_DAY} 'BEGIN{LAST=24*60*60*EXPIRED_DAY; "date +%s" | getline NOW} {cmd="date -d'\''"$1" "$2"'\'' +%s"; cmd | getline WHEN; DIFF=NOW-WHEN; if(DIFF>LAST){print "\""$3"\""}}' | tr '\n' '  ' | xargs -I '{}' -n 100 hdfs dfs -rm -r '{}'

  1. 参数化参数的过期日(
    EXPIRED_DAY
    )和路径(
    PP
    )
  2. 添加带引号的单路径防止路径空间分裂(
    {print "\""$3"\""}
    )
  3. 浴去除多路径更效率
    xargs

并运行部分命令来查看删除

EXPIRED_DAY=80; PP='a hdfs path'; hdfs dfs -ls "${PP}" | tr -s ' ' | cut -d' ' -f6-8 | grep "^[0-9]" | awk -v TEST=${TEST} -v EXPIRED_DAY=${EXPIRED_DAY} 'BEGIN{LAST=24*60*60*EXPIRED_DAY; "date +%s" | getline NOW} {cmd="date -d'\''"$1" "$2"'\'' +%s"; cmd | getline WHEN; DIFF=NOW-WHEN; if(DIFF>LAST){print "\""$3"\""}}'


-1
投票

只是为了添加之前提交的答案的另一个变体(我不想假装是原创的)。可以修改脚本以递归删除子文件夹或文件

#!/bin/bash
function hdfs-list-older-than () {
# list all content | filter out sub-folders | filter by creation datetime and isolate filepath
  hdfs dfs -ls  $1 | grep ^- | awk -v d=$2 -v t=$3 '{if($6 < d || ($6 == d && $7 < t) ){print $8}}'
}
hdfs-list-older-than $1 `date -d "-10 days"  +'%Y-%m-%d %H:%M'` | xargs hdfs dfs -rm {}
© www.soinside.com 2019 - 2024. All rights reserved.