Hadoop 将同一目录中基于日期的多个文件作为输入传递给Mapreduce

Hadoop 将同一目录中基于日期的多个文件作为输入传递给Mapreduce,hadoop,mapreduce,hadoop-streaming,Hadoop,Mapreduce,Hadoop Streaming,我有一个要求,我必须使用来自同一目录的多个文件和特定日期作为mapreduce作业的输入 我不知道怎么做 hadoop jar EventLogsSW.jar EventSuspiciousWatch /user/hdfs/eventlog/*.snappy /user/hdfs/eventlog_output/op1 示例:从eventlog目录中,我只需要显示日期文件进行处理 eventlog目录已从flume logger代理获取日志数据,因此它每天有1000个新文件。我希望我只需要为我

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

我不知道怎么做

hadoop jar EventLogsSW.jar EventSuspiciousWatch /user/hdfs/eventlog/*.snappy /user/hdfs/eventlog_output/op1
示例:从eventlog目录中,我只需要显示日期文件进行处理

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

谢谢

问候,,
默翰

您可以使用bash
date
命令作为
$(日期+%Y-%m-%d)

例如,按以下方式运行将查找
/user/hdfs/eventlog/2017-01-04。snappy
日志文件和输出将存储到
/user/hdfs/eventlog\u 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)
要获取特定的日期格式,请参见键入
人工日期
命令以了解有关
日期
的更多信息


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

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中处理多个文件:

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


谢谢你的回复。文件名中没有任何日期。例如--199346735859.Snappy但使用此选项将一次处理一个文件…通过将要处理的所有文件移动到新目录中,然后在该目录上运行hadoop作业,可以在单个hadoop作业中运行所有文件。这对我帮助很大。
#!/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)..."
#!/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)..."