【问题标题】:pass multiple files based on date in same directory as Input to Mapreduce根据与输入相同目录中的日期将多个文件传递给 Mapreduce
【发布时间】:2017-01-04 11:42:14
【问题描述】:

我有一个要求,我必须使用来自同一目录的多个具有特定日期的文件作为 mapreduce 作业的输入。

不知道该怎么做。

hadoop jar EventLogsSW.jar EventSuspiciousWatch /user/hdfs/eventlog/*.snappy /user/hdfs/eventlog_output/op1

示例:从 eventlog 目录我只需要提供日期文件进行处理。

eventlog 目录已从 Flume 记录器代理获取日志数据,因此它每天有 1000 个新文件。我只需要为我的流程提供日期文件。

谢谢。

问候, 莫汉。

【问题讨论】:

    标签: hadoop mapreduce hadoop-streaming


    【解决方案1】:

    你可以使用 bash date 命令作为$(date +%Y-%m-%d):

    例如,如下运行将查找/user/hdfs/eventlog/2017-01-04.snappy日志文件,输出将存储到/user/hdfs/eventlog_output/2017-01-04hdfs目录:

    hadoop jar EventLogsSW.jar EventSuspiciousWatch /user/hdfs/eventlog/$(date +%Y-%m-%d).snappy /user/hdfs/eventlog_output/$(date +%Y-%m-%d)
    

    要获取特定的日期格式,请参阅this answer OR 输入man date 命令以了解有关date 的更多信息...


    在提供更多详细信息后更新:

    1.解释:

    $ file=$(hadoop fs -ls /user/cloudera/*.snappy|grep $(date +%Y-%m-%d)|awk '{print $NF}')
    $ echo $file
    /user/cloudera/xyz.snappy
    $ file_out=$(echo $file|awk -F '/' '{print $NF}'|awk -F '.' '{print $1}')
    $ echo $file_out
    xyz
    $hadoop jar EventLogsSW.jar EventSuspiciousWatch /user/hdfs/eventlog/$file /user/hdfs/eventlog_output/$file_out
    

    2。制作 shell 脚本以每天重用这些命令......并且以更合乎逻辑的方式

    此脚本可以处理多个 hdfs 中当前系统日期的文件:

    #!/bin/sh
    #get today's snappy files
    files=$(hadoop fs -ls /user/hdfs/eventlog/*.snappy|grep $(date +%Y-%m-%d)|awk '{print $NF}')
    
    #Only process if today's file(s) available...
    if [ $? -eq 0 ]
    then   
        # file(s) found now create dir
        hadoop fs -mkdir /user/hdfs/eventlog/$(date +%Y-%m-%d)
        counter=0
            #move each file to today's dir
            for file in $files
            do
                hadoop fs -mv $file /user/hdfs/eventlog/$(date +%Y-%m-%d)/
                counter=$(($counter + 1))
            done
        #run hadoop job
        hadoop jar EventLogsSW.jar EventSuspiciousWatch /user/hdfs/eventlog/$(date +%Y-%m-%d) /user/hdfs/eventlog_output/$(date +%Y-%m-%d)
    fi
    
    echo "Total processed file(s): $counter"
    echo "Done processing today's file(s)..."
    

    此脚本可以处理多个文件 - 一次一个文件 - 在 hdfs 中用于当前系统日期:

    #!/bin/sh   
    #get today's snappy files
    files=$(hadoop fs -ls /user/hdfs/eventlog/*.snappy|grep $(date +%Y-%m-%d)|awk '{print $NF}')
    
    #Only process if today's file(s) available...
    if [ $? -eq 0 ]
    then
    counter=0
        for file in $files
        do    
            echo "Processing file: $file ..."    
            #get output dir name
            file_out=$(echo $file|awk -F '/' '{print $NF}'|awk -F '.' '{print $1}')
    
            #run hadoop job
            hadoop jar EventLogsSW.jar EventSuspiciousWatch /user/hdfs/eventlog/$file /user/hdfs/eventlog_output/$file_out
    
            counter=$(($counter + 1))
        done
    fi
    
    echo "Total processed file(s): $counter"
    echo "Done processing today's file(s)..."
    

    【讨论】:

    • 感谢您的回复。文件名中没有任何日期。例如:--199346735859.snappy
    • 但是这样会一次处理一个文件....通过将所有文件移动到新目录中处理,然后在该目录上运行hadoop作业,可以在一个hadoop作业中运行所有文件
    • 谢谢。这对我帮助很大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多