【问题标题】:Hadoop - Delete only files older than X daysHadoop - 仅删除超过 X 天的文件
【发布时间】:2017-07-03 09:27:02
【问题描述】:

我想编写一个数据保留 shell 脚本,当给定两个输入 - 基本目录和保留期(以天为单位)时,仅删除早于保留期的文件(而不是目录)。我在互联网上搜索过,有一些解决方案,但他们正在列出目录并根据修改时间删除它们。

但是一个目录可能有一个非常旧的时间戳,但可能包含最近更新的文件。

我该如何进行? find 命令中的 mindepthmaxdepth 选项在 HDFS 中不起作用。

基本目录可能有多个子目录,子目录可能有子目录等等。

base 目录为/user/abhikaushik

然后我们有yyyy/mm/dd/hh 形式的子文件夹,例如base/2017/04/23/22 或者base/studies/programming/file1.txt等等

【问题讨论】:

  • @philantrovert 这不是重复的。在您的答案中,您列出了目录中的子目录并删除它们。我想要的是进入所有目录的最大深度并检查那里的文件并删除它们。
  • 这就是我说“可能重复”的原因。以此为参考。如果您使用grep -v 而不是grep,它将向您显示除目录之外的任何内容,您可以使用hdfs dfs -ls -R 实现最大深度。我相信你会解决的。在此处或在该答案上发表评论以获得任何帮助。

标签: shell hadoop hdfs


【解决方案1】:

这个怎么样:

hdfs dfs -ls -R /MY/BASE/DIR/PATH | grep "^-" | tr -s " " | cut -d' ' -f6-8 | awk 'BEGIN{ RETENTION_DAYS=10; LAST=24*60*60*RETENTION_DAYS; "date +%s" | getline NOW } { cmd="date -d'\''"$1" "$2"'\'' +%s"; cmd | getline WHEN; DIFF=NOW-WHEN; if(DIFF > LAST){ print $3 }}'

在哪里,

递归列出所有文件:

hdfs dfs -ls -R /MY/BASE/DIR/PATH

仅从列表中获取 FILES

grep "^-"

替换多余的空格:

tr -s " "

获取所需的列:

剪切 -d' ' -f6-8

使用 awk 处理:

awk

初始化 DIFF 持续时间和当前时间:

RETENTION_DAYS=10;

最后=24*60*60*RETENTION_DAYS;

"日期 +%s" |立即获取线路

创建命令以获取 HDFS 上文件时间戳的 epoch 值:

cmd="date -d'\''"$1" "$2"'\'' +%s";

执行命令获取HDFS文件的epoch值:

命令 |何时获取;

获取时差:

DIFF=NOW-WHEN;

根据不同打印输出:

if(DIFF > LAST){ print $3 }}

----------------------------------------------- ----------------------------------


确定上述命令列出了您要删除的文件后继续操作

现在,无需在最后一步执行print 操作,您可以执行您真正想要的操作,即删除旧文件,如下所示:

hdfs dfs -ls -R /MY/BASE/DIR/PATH | grep "^-" | tr -s " " | cut -d' ' -f6-8 | awk 'BEGIN{ RETENTION_DAYS=10; LAST=24*60*60*RETENTION_DAYS; "date +%s" | getline NOW } { cmd="date -d'\''"$1" "$2"'\'' +%s"; cmd | getline WHEN; DIFF=NOW-WHEN; if(DIFF > LAST){ system("hdfs dfs -rm -r -skipTrash "$3 ) }}'

您只需要根据您的要求(此处为 10 天)更改 /MY/BASE/DIR/PATHRETENTION_DAYS 的值。

希望这会有所帮助!

【讨论】:

  • 它对我有用。但它保留了目录名称。目录中的文件被删除,但目录仍然存在。
  • 上述解决方案仅适用于文件,因为它具有grep "^-"。您也可以通过将目录替换为grep -v "^Found" 来删除目录。但是请记住,现在无论该目录中文件的时间戳是什么,它都会删除目录。
【解决方案2】:

试试这个-

删除 2017-0 到 8 年创建的所有文件。

hadoop fs -rm -r `hadoop fs -ls -R <location> | grep '.*2017-[0-8].*' | awk '{print $8}'`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多