用于删除HDFS文件的Bash脚本

时间:2016-09-12 14:07:48

标签: bash hdfs

我正在尝试编写一个每天在cron上运行的bash脚本,它会查看hdfs位置并删除该路径中已存在超过一周的文件。我对不同的bash命令做了很多研究,但说实话我不知道从哪里开始。任何人都可以帮助我,或者至少引导我朝着正确的方向前进吗?

在此明确。我从来没有写过一个bash脚本,这就是我不知道从哪里开始的原因。

2 个答案:

答案 0 :(得分:0)

这个怎么样:

DAYS=7; # a week
hdfs dfs -ls -R /user/hduser/input | grep -v "^d" | tr -s " " | cut -d' ' -f6-8 | grep "^[0-9]" | awk -v DAYS="$DAYS" 'BEGIN{ BEFORE=24*60*60*DAYS; "date +%s" | getline NOW } { cmd="date -d'\''"$1" "$2"'\'' +%s"; cmd | getline WHEN; DIFF=NOW-WHEN; if(DIFF > BEFORE){ system("echo "$3) }}'

其中,

获取指定位置的所有文件的列表:

  

hdfs dfs -ls -R / user / hduser / input

从输出列表中删除目录(因为我们只想删除文件):

  

grep -v“^ d”

替换多余的空格以使输出空格分开:

  

tr -s“”

获取所需的列:

  

cut -d'' - f6-8

删除不需要的行:

  

grep“^ [0-9]”

使用awk处理: 将值传递给awk脚本以考虑删除阈值:

  

awk -v DAYS =“$ DAYS”

计算提供的DAYS的秒数值:

  

BEFORE = 24 * 60 * 60 *天;

以秒为单位获取当前时间戳:

  

“日期+%s”| getline NOW

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

  

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

执行命令以获取HDFS文件的纪元值:

  

cmd | getline WHEN;

获得时差:

  

DIFF = NOW-WHEN;

根据差异打印文件位置:

  

if(DIFF> BEFORE){print $ 3}

以上命令只列出早于指定DAYS数的文件。所以首先尝试它们,一旦你确定它工作正常,那么这里是从HDFS中删除文件所需的实际命令:

DAYS=7; # a week
hdfs dfs -ls -R /user/hduser/input | grep -v "^d" | tr -s " " | cut -d' ' -f6-8 | grep "^[0-9]" | awk -v DAYS="$DAYS" 'BEGIN{ BEFORE=24*60*60*DAYS; "date +%s" | getline NOW } { cmd="date -d'\''"$1" "$2"'\'' +%s"; cmd | getline WHEN; DIFF=NOW-WHEN; if(DIFF > BEFORE){ system("hdfs dfs -rm "$3) }}'

希望这有助于!!

答案 1 :(得分:-2)

所以如果HDFS它是一个文件扩展名,那么你可以在下一行添加到cron:

find /path/where/you/wannna -type f -name *.hdfs | xargs rm -rf 

那应该删除扩展名中包含.hdfs的所有文件。