2017-01-04 1 views
0

mapreduce 작업의 입력으로 특정 날짜의 동일한 디렉토리에있는 여러 파일을 사용자에게 사용해야하는 경우가 있습니다.Mapreduce에 대한 입력과 동일한 디렉토리에있는 날짜를 기준으로 여러 파일을 전달하십시오.

내가 어떻게 할 수 있는지 잘 모르겠다.

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

예 : eventlog 디렉토리에서 처리하기 위해 현재 날짜 파일 만 필요합니다.

eventlog 디렉토리는 flume logger 에이전트에서 로그 데이터를 가져 오므로 매일 1000 개의 새 파일이 있습니다. 나는 나의 프로세스를 위해서만 현재의 날짜 파일이 필요하다.

감사합니다.

감사합니다. 모한.

답변

0

date 명령 $(date +%Y-%m-%d) 당신은 bash는 사용할 수 있습니다

예를 들어, 다음과 같이 실행하면 /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또는 유형 man date에 대해 자세히 알아 보려면 명령을 참조하십시오. 10 ... 제공 자세한 내용은 이후


갱신 :

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. 메이크업 쉘 스크립트 ... 그리고에 더 논리적 인 방법

이 스크립트는 하나 이상의 파일을 처리 할 수 ​​있습니다 현재 시스템 날짜 HDFS에서 ES :

#!/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)..." 
+0

감사 응답. 파일 이름에 날짜가 없습니다. 예 : --199346735859.snappy –

+0

@MohankumarManivannan - 업데이트 된 대답보기 .... –

+0

하지만이 파일은 한 번에 하나씩 처리됩니다. 하나의 단일 hadoop 작업을 모두 실행하려면 처리 할 모든 파일을 이동해야합니다. 새 디렉터리에 다음 해당 디렉터리에 hadoop 작업을 실행합니다 –