使用shell脚本获取hadoop在过去5分钟内创建的文件

时间:2016-08-19 06:36:12

标签: shell unix hadoop hdfs

我在HDFS中有文件:

drwxrwx---   - root supergroup          0 2016-08-19 06:21 /tmp/logs/root/logs/application_1464962104018_1639064
drwxrwx---   - root supergroup          0 2016-08-19 06:21 /tmp/logs/root/logs/application_1464962104018_1639065

现在/tmp/logs/root/logs/目录将不断获取其中的新文件。 我想获取在过去五分钟内创建的文件,考虑当前时间。然后我需要将这些文件复制到我的本地机器上。

2 个答案:

答案 0 :(得分:3)

这个怎么样:

hdfs dfs -ls /tmp | tr -s " " | cut -d' ' -f6-8 | grep "^[0-9]" | awk 'BEGIN{ MIN=5; LAST=60*MIN; "date +%s" | getline NOW } { cmd="date -d'\''"$1" "$2"'\'' +%s"; cmd | getline WHEN; DIFF=NOW-WHEN; if(DIFF < LAST){ print $3 }}'

说明:

列出所有文件:

  

hdfs dfs -ls / tmp

替换额外的空格:

  

tr -s&#34; &#34;

获取所需的列:

  

cut -d&#39; &#39; -f6-8

删除不需要的行:

  

grep&#34; ^ [0-9]&#34;

使用awk处理:

  

AWK

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

  

MIN = 5; LAST = 60 * MIN; &#34;日期+%s&#34; | getline NOW

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

  

cmd =&#34; date -d&#39; \&#39;&#39;&#34; $ 1&#34; &#34; $ 2#34;&#39; \&#39;&#39; +%S&#34 ;;

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

  

cmd | getline WHEN;

获得时差:

  

DIFF = NOW-WHEN;

根据差异打印输出:

  

if(DIFF

您只需根据您的要求更改MIN的变量值(此处为5分钟)。 HTH

答案 1 :(得分:0)

我使用下面的命令完成了它:它将为我提供在五分钟窗口之间创建的文件:

hadoop fs -ls /tmp/logs/root/logs | awk '{ if ((($6 == "'"2016-08-18"'" && $7 <= "'"21:00"'") && ($6 == "'"2016-08-18"'" && $7 >= "'"20:55"'"))) print $8 } ' 

可以使用当前时间戳进行相应修改。