根据日期将多个文件传递到与输入到 Mapreduce 相同的目录中
pass multiple files based on date in same directory as Input to Mapreduce
我有一个要求,我必须使用同一目录中具有特定日期的多个文件作为 mapreduce 作业的输入。
不知道我该怎么做。
hadoop jar EventLogsSW.jar EventSuspiciousWatch /user/hdfs/eventlog/*.snappy /user/hdfs/eventlog_output/op1
示例:从 eventlog 目录我只需要当前日期文件进行处理。
eventlog 目录从 flume 记录器代理获取日志数据,因此它每天有 1000 个新文件。我只需要为我的流程提供日期文件。
谢谢。
此致,
磨憨。
您可以使用 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 }')
$ 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 }')
#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)..."
我有一个要求,我必须使用同一目录中具有特定日期的多个文件作为 mapreduce 作业的输入。
不知道我该怎么做。
hadoop jar EventLogsSW.jar EventSuspiciousWatch /user/hdfs/eventlog/*.snappy /user/hdfs/eventlog_output/op1
示例:从 eventlog 目录我只需要当前日期文件进行处理。
eventlog 目录从 flume 记录器代理获取日志数据,因此它每天有 1000 个新文件。我只需要为我的流程提供日期文件。
谢谢。
此致, 磨憨。
您可以使用 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 }')
$ 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 }')
#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)..."