首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将多个文件按日期在同一个目录中传递给Mapreduce

将多个文件按日期在同一个目录中传递给Mapreduce
EN

Stack Overflow用户
提问于 2017-01-04 11:42:14
回答 1查看 774关注 0票数 0

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

不知道我怎么能做到。

代码语言:javascript
运行
复制
hadoop jar EventLogsSW.jar EventSuspiciousWatch /user/hdfs/eventlog/*.snappy /user/hdfs/eventlog_output/op1

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

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

谢谢。

你好,莫汉。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-04 13:12:29

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

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

代码语言:javascript
运行
复制
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.解释:

代码语言:javascript
运行
复制
$ 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中处理多个文件:

代码语言:javascript
运行
复制
#!/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中处理多个文件--同时处理一个文件():

代码语言:javascript
运行
复制
#!/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)..."
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41462964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档