【问题标题】:How to delete the most recently created files in multiple HDFS directories?如何删除多个 HDFS 目录中最近创建的文件?
【发布时间】:2019-11-15 13:07:28
【问题描述】:

我犯了一个错误,将几百个零件文件添加到按日期分区的表中。我能够看到哪些文件是新的(这些是我要删除的文件)。我在这里看到的大多数情况都与删除某个日期之前的文件有关,但我只想删除我最近的文件。

一天,我可能有 3 个这样的文件,我只想删除新文件。我可以说它是新的,因为我使用 hadoop fs -ls 时的更新时间戳

/this/is/my_directory/event_date1_newfile_20191114
/this/is/my_directory/event_date1_oldfile_20190801
/this/is/my_directory/event_date1_oldfile_20190801

我有很多日期,所以我必须为 event_date2、event_date3 等完成这个,总是从每个日期中删除“new_file_20191114”。

较早的日期是 2019 年 8 月,我的新文件昨天更新了,19 年 11 月 14 日。

我觉得应该有一个简单/快速的解决方案来解决这个问题,但我很难从大多数人询问的情况中找到相反的情况。

【问题讨论】:

  • 我可能是错的,但恐怕我不认为有一个单一的衬里。不过应该只有几行 Bash。
  • 您所有的新文件是否都具有相同的时间戳?或新文件的时间戳大于某个指定时间?
  • @Strick 是的,完全正确 - 我已经能够使用:hdfs dfs -ls /tmp | sort -k6,7 从这篇文章中取得一些进展:stackoverflow.com/questions/37022749/… 所以我现在有了我需要删除的特定文件的列表,并且我现在正试图找到一种方法来批量删除预先创建的文件列表
  • 我会发布答案
  • 我已经发布并回答请检查它是否解决了您的目的

标签: hadoop hive hdfs hql hadoop-partitioning


【解决方案1】:

正如您在回答中提到的,您已经获得了需要删除的文件列表。 创建一个简单的脚本将输出重定向到临时文件

喜欢这个

hdfs dfs -ls /tmp | sort -k6,7 > files.txt

请注意 sort -k6,7 这将给出所有文件,但按时间戳排序。我确定您不想全部删除,因此您可以选择需要删除的前 n 个文件让我们说 100

然后您可以将命令更新为

hdfs dfs -ls /tmp | sort -k6,7 | head -100 |  awk '{print $8}' > files.txt

或者如果您知道新文件的特定时间戳,那么您可以尝试以下命令

hdfs dfs -ls /tmp | sort -k6,7 | grep "<exact_time_stamp>" |  awk '{print $8}' > files.txt

然后读取那个文件,将所有文件一个一个删除

while read file; do
  hdfs -rm $file
  echo "Deleted $file" >> deleted_files.txt #this is to track which files have been deleted

done <files.txt

所以你完成的脚本可以是这样的

#!/bin/bash

 hdfs dfs -ls /tmp | sort -k6,7 | grep "<exact_time_stamp>" |  awk '{print $8}' > files.txt

 while read file; do
     hdfs -rm $file
     echo "Deleted $file" >> deleted_files.txt #this is to track which files have been deleted

   done <files.txt

【讨论】:

  • 看起来您使用head -100 的解决方案让我更接近了。我确切地知道我需要删除多少个文件(最近的 181 个文件)以及它的排序方式,我实际上不得不使用tail -181。因此,如果我知道文件的确切数量,我认为我不需要 grep 来获取时间戳,对吗?所以……就我的目的而言,这看起来合适吗?
  • 是的,如果您知道确切的文件,则无需 grep。但为了安全起见,只需检查 "hdfs dfs -ls /tmp | sort -k6,7 | grep "" | wc -l" 的输出是否也是 180 左右.. 仅用于重新检查..休息,你可以继续你的尾巴方法
  • 请看我也在使用 awk '{print $8}' 来获取确切的文件路径,而不是您需要验证的其他列..所以也在您的命令中更新它
  • hdfs dfs -ls /tmp |排序-k6,7 | grep "2019-11-14 21:03" | wc -l 同样适用于 hdfs dfs -ls /tmp |排序-k6,7 | grep "2019-11-14 21:04" | wc -l 并检查两个输出中的一些是否为 181
猜你喜欢
  • 1970-01-01
  • 2015-10-31
  • 2014-10-17
  • 1970-01-01
  • 2018-07-16
  • 1970-01-01
  • 2017-12-19
  • 2014-11-16
  • 2016-04-29
相关资源
最近更新 更多