使用shell脚本获取在hadoop中最近5分钟内创建的文件
我在HDFS中有以下文件:使用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
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=现在-何时
根据差异打印输出:
如果(DIFFMIN
的变量值(此处为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),如果您已经解决了问题,请发布您的答案,或者如果上述解决方案对您有效或有任何帮助,请至少投赞成票。