【问题标题】:Get files which are created in last 5 minutes in hadoop using shell script使用 shell 脚本在 hadoop 中获取最近 5 分钟内创建的文件
【发布时间】:2017-05-30 02:00:24
【问题描述】:

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

【问题讨论】:

    标签: shell unix hadoop hdfs


    【解决方案1】:

    这个怎么样:

    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 " "

    获取所需的列:

    剪切 -d' ' -f6-8

    删除不需要的行:

    grep "^[0-9]"

    使用 awk 处理:

    awk

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

    最小值=5;最后=60*分钟; "日期 +%s" |立即获取线路

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

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

    执行命令获取HDFS文件的epoch值:

    命令 |何时获取;

    获取时差:

    DIFF=现在-何时;

    根据不同打印输出:

    if(DIFF

    您只需要根据您的要求更改 MIN 的变量值(这里是 5 分钟)。 高温

    【讨论】:

    • 我正在尝试 HADOOP_DIRECTORY_ARRAY=($(hadoop fs -ls /tmp/log/root/log | awk '{ if ((($6 == "$get_from_date" && $7 = "$get_to_time"))) print $8 } ')) HADOOP_DIRECTORY_ARRAY=($(hadoop fs -ls /tmp/log/root/log | awk '{" $awk_string"}' )) 但是代替 $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 &lt; "'"2016-08-21"'" || ($6 == "'"2016-08-21"'" &amp;&amp; $7 &lt;= "'"20:00"'"))) print $8 } ')) echo "SIZE : " ${#HADOOP_DIRECTORY_ARRAY[@]}
    • @MohitRane ,如果您已经解决了您的问题,请发布您的答案,或者如果上述解决方案对您有用或有任何帮助,请至少支持它。
    【解决方案2】:

    我已经使用以下命令完成了它:它会给我在五分钟窗口之间创建的文件:

    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 } ' 
    

    可以根据当前时间戳进行相应修改。

    【讨论】:

    • 每次执行此命令时,必须更改日期的硬编码值。
    猜你喜欢
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多