Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用shell脚本获取在hadoop中最近5分钟内创建的文件_Shell_Unix_Hadoop_Hdfs - Fatal编程技术网

使用shell脚本获取在hadoop中最近5分钟内创建的文件

使用shell脚本获取在hadoop中最近5分钟内创建的文件,shell,unix,hadoop,hdfs,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/lo

我在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/
目录将不断地在其中获取新文件。
我想获得在过去五分钟内创建的文件,并将当前时间考虑在内。然后我需要将这些文件复制到我的本地计算机中。

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

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 } ' 
hadoop fs-ls/tmp/logs/root/logs | awk'{if(($6==“'2016-08-18'”&&&$7=“'20:55'”)打印$8}'
可以使用当前时间戳对其进行相应的修改。

这样如何:

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 }}'
hdfsdfs-ls/tmp | tr-s”“| cut-d”“-f6-8 | grep”^[0-9]“| awk”开始{MIN=5;LAST=60*MIN;”date+%s“| getline NOW}{cmd cmd date d'\'\''$1'$2'\+%s”;cmd getline WHEN;DIFF=NOW-WHEN;if(DIFF
说明:

列出所有文件:

hdfs dfs-ls/tmp

替换额外空间:

tr-s“

获取所需的列:

切口-d''-f6-8

删除不需要的行:

grep“^[0-9]”

使用awk进行处理:

awk

初始化差异持续时间和当前时间:

最小值=5;最后=60*MIN;“日期+%s”|立即获取行

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

cmd=“日期-d'\'''''$1'$2'\''+%s”

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

cmd | getline WHEN

获取时差:

DIFF=现在-何时

根据差异打印输出:

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

每次执行此命令时,日期的硬编码值都必须更改。我正在尝试HADOOP_目录数组=($(HADOOP fs-ls/tmp/log/root/log | awk'{if(($6==“$get_from_date”&$7=“$get_to_time”))打印$8}'))HADOOP_目录数组=($(HADOOP fs-ls/tmp/log/root/log/log | log | awk'})但是除了6美元、7美元和8美元之外,什么都没有出现,日期和时间的价值也得到了反映。这似乎有些复杂,我需要一个简单的。容易理解的东西。感谢您的回复。HDFS不支持开箱即用,就像Linux提供的一样,例如
find/tmp-cmin-5
。上述解决方案并不复杂。只是它有多个管道,一次只做一件事。您可以尝试在shell脚本中分别使用单个命令,而不是单个命令。当我在带有硬编码值的shell脚本中执行相同命令时,它对我有效。awk变量替换可能有问题<代码>#/bin/bash HADOOP_DIRECTORY|ARRAY=($)(HADOOP fs-ls/tmp/log/root/log | awk'{if($6<“‘2016-08-21’””)($6=“‘2016-08-21’”&$7@MohitRane),如果您已经解决了问题,请发布您的答案,或者如果上述解决方案对您有效或有任何帮助,请至少投赞成票。