基于与Mapreduce的输入相同的目录中的日期传递多个文件

时间:2017-01-04 11:42:15

标签: hadoop mapreduce hadoop-streaming

我要求我必须在同一目录中使用多个文件,并将特定日期作为mapreduce作业的输入。

不确定我该怎么做。

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

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

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

感谢。

此致 莫汉。

1 个答案:

答案 0 :(得分:0)

您可以将bash date命令用作$(date +%Y-%m-%d)

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

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

获取具体日期格式,请参阅this answer 输入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)..."