Hello World 수준의 Map Reduce 프로그램을 만들어보자.
StandAlone 모드.
우선 분석 할 데이터는
텍스트 파일로 아래와 같이 정의 되어있다.
S 20110712:000000 0 2 scna ....
S 20110712:000001 0 5 scnb ...
우린 여기서 scnX에 해당하는 것들의 카운트를 해 볼 예정이다.
딱 봐도 로그죠.. ~
우선 Mapper가 필요.
ScnCountMapper.java
간단한 분석..
Mapper<Key, Value, Key, Value>를 상속해야 하는데
앞의 K,V는 파일로부터 입력되는 K,V이다.
나중에 실행하는쪽에서 InputType을 정할 수 있는데 텍스트파일일 경우 기본적으로 Line단위의 Read이고
앞에 Key는 LongWritable로 각 라인 시작지점의 바이트 오프셋 주소이며.. Value는 해당 Line의 Text가 된다.
뒤에 있는 K,V는 Reducer로 보낼 K,V이다.
즉, 이것이 Reducer의 입력 K,V가 된다.
여기서는 scnX의 카운트를 분석 할 것이 때문에 K는 Text가 V는 IntWritable이 되겠다.
ScnCountReducer.java
Reducer의 간단한 분석.
마찬가지로 Reducer<K , V, K, V>를 상속하는데
앞의 K,V는 Mapper의 출력 K,V로써 타입을 맞춰주면 된다.
뒤의 K,V는 실제 분석 후 output을 작성 할 때 사용되는 K,V로 여기서는 scnX와 카운트가 될 것이므로
역시 Text, IntWritable로 선언하였다.
ScnCountDriver.java 간단한 분석..
실제로 하둡에 의해서 실행 될 클래스이다.
FileInputFormat에 의해서 입력 받을 파일 경로가 지정되며
FileOutputFormat에 의해서 출력이 써질 경로가 지정된다.
setOutPutKeyClass, setOutputKeyVlaueClass는 Reducer의 출력형태이다.
(일반적으로 같게 한다.)
실행.
컴파일 된 class들을 하둡이 있는 서버로 옮기고
HADOOP_HOME/conf/hadoop-env.sh 파일에 HADOOP_CLASSPATH를 지정한다.
그리고 HADOOP_HOME/bin에서 아래와 같이 실행
아래와 같이 실행된다.
결과를 보기위해 output으로 지정된 곳으로가서..
파일을 열어보면 끝,,
위 예제는 standalone 모드 기준입니다.
그래도 뭔가 되긴 하는구나.
StandAlone 모드.
우선 분석 할 데이터는
텍스트 파일로 아래와 같이 정의 되어있다.
S 20110712:000000 0 2 scna ....
S 20110712:000001 0 5 scnb ...
우린 여기서 scnX에 해당하는 것들의 카운트를 해 볼 예정이다.
딱 봐도 로그죠.. ~
우선 Mapper가 필요.
ScnCountMapper.java
간단한 분석..
Mapper<Key, Value, Key, Value>를 상속해야 하는데
앞의 K,V는 파일로부터 입력되는 K,V이다.
나중에 실행하는쪽에서 InputType을 정할 수 있는데 텍스트파일일 경우 기본적으로 Line단위의 Read이고
앞에 Key는 LongWritable로 각 라인 시작지점의 바이트 오프셋 주소이며.. Value는 해당 Line의 Text가 된다.
뒤에 있는 K,V는 Reducer로 보낼 K,V이다.
즉, 이것이 Reducer의 입력 K,V가 된다.
여기서는 scnX의 카운트를 분석 할 것이 때문에 K는 Text가 V는 IntWritable이 되겠다.
ScnCountReducer.java
Reducer의 간단한 분석.
마찬가지로 Reducer<K , V, K, V>를 상속하는데
앞의 K,V는 Mapper의 출력 K,V로써 타입을 맞춰주면 된다.
뒤의 K,V는 실제 분석 후 output을 작성 할 때 사용되는 K,V로 여기서는 scnX와 카운트가 될 것이므로
역시 Text, IntWritable로 선언하였다.
ScnCountDriver.java 간단한 분석..
실제로 하둡에 의해서 실행 될 클래스이다.
FileInputFormat에 의해서 입력 받을 파일 경로가 지정되며
FileOutputFormat에 의해서 출력이 써질 경로가 지정된다.
setOutPutKeyClass, setOutputKeyVlaueClass는 Reducer의 출력형태이다.
(일반적으로 같게 한다.)
실행.
컴파일 된 class들을 하둡이 있는 서버로 옮기고
HADOOP_HOME/conf/hadoop-env.sh 파일에 HADOOP_CLASSPATH를 지정한다.
그리고 HADOOP_HOME/bin에서 아래와 같이 실행
./hadoop com.tistory.devyongsik.search.log.ScnCountDriver 분석파일경로/분석파일명 output_scnario
아래와 같이 실행된다.
11/07/15 13:05:04 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
11/07/15 13:05:04 WARN mapred.JobClient: No job jar file set. User classes may not be found. See JobConf(Class) or JobConf#setJar(String).
11/07/15 13:05:04 INFO input.FileInputFormat: Total input paths to process : 1
11/07/15 13:05:04 INFO mapred.JobClient: Running job: job_local_0001
11/07/15 13:05:04 INFO mapred.MapTask: io.sort.mb = 100
11/07/15 13:05:04 INFO mapred.MapTask: data buffer = 79691776/99614720
11/07/15 13:05:04 INFO mapred.MapTask: record buffer = 262144/327680
11/07/15 13:05:05 INFO mapred.JobClient: map 0% reduce 0%
11/07/15 13:05:06 INFO mapred.MapTask: Starting flush of map output
11/07/15 13:05:06 INFO mapred.MapTask: Finished spill 0
11/07/15 13:05:06 INFO mapred.Task: Task:attempt_local_0001_m_000000_0 is done. And is in the process of commiting
... 중략
... 중략
11/07/15 13:05:57 INFO mapred.LocalJobRunner:
11/07/15 13:05:57 INFO mapred.Task: Task 'attempt_local_0001_m_000016_0' done.
11/07/15 13:05:57 INFO mapred.LocalJobRunner:
11/07/15 13:05:57 INFO mapred.Merger: Merging 17 sorted segments
11/07/15 13:05:57 INFO mapred.Merger: Merging 8 intermediate segments out of a total of 17
11/07/15 13:05:57 INFO mapred.Merger: Down to the last merge-pass, with 10 segments left of total size: 26071733 bytes
11/07/15 13:05:57 INFO mapred.LocalJobRunner:
11/07/15 13:05:58 INFO mapred.Task: Task:attempt_local_0001_r_000000_0 is done. And is in the process of commiting
11/07/15 13:05:58 INFO mapred.LocalJobRunner:
11/07/15 13:05:58 INFO mapred.Task: Task attempt_local_0001_r_000000_0 is allowed to commit now
11/07/15 13:05:58 INFO output.FileOutputCommitter: Saved output of task 'attempt_local_0001_r_000000_0' to output_scnario
11/07/15 13:06:00 INFO mapred.LocalJobRunner: reduce > reduce
11/07/15 13:06:00 INFO mapred.LocalJobRunner: reduce > reduce
11/07/15 13:06:00 INFO mapred.Task: Task 'attempt_local_0001_r_000000_0' done.
11/07/15 13:06:00 INFO mapred.JobClient: map 100% reduce 100%
11/07/15 13:06:00 INFO mapred.JobClient: Job complete: job_local_0001
11/07/15 13:06:00 INFO mapred.JobClient: Counters: 16
11/07/15 13:06:00 INFO mapred.JobClient: File Output Format Counters
11/07/15 13:06:00 INFO mapred.JobClient: Bytes Written=360
11/07/15 13:06:00 INFO mapred.JobClient: FileSystemCounters
11/07/15 13:06:00 INFO mapred.JobClient: FILE_BYTES_READ=5696680093
11/07/15 13:06:00 INFO mapred.JobClient: FILE_BYTES_WRITTEN=282276018
11/07/15 13:06:00 INFO mapred.JobClient: File Input Format Counters
11/07/15 13:06:00 INFO mapred.JobClient: Bytes Read=547403887
11/07/15 13:06:00 INFO mapred.JobClient: Map-Reduce Framework
11/07/15 13:06:00 INFO mapred.JobClient: Reduce input groups=17
11/07/15 13:06:00 INFO mapred.JobClient: Map output materialized bytes=26071815
11/07/15 13:06:00 INFO mapred.JobClient: Combine output records=0
11/07/15 13:06:00 INFO mapred.JobClient: Map input records=1312718
11/07/15 13:06:00 INFO mapred.JobClient: Reduce shuffle bytes=0
11/07/15 13:06:00 INFO mapred.JobClient: Reduce output records=17
11/07/15 13:06:00 INFO mapred.JobClient: Spilled Records=3207007
11/07/15 13:06:00 INFO mapred.JobClient: Map output bytes=23446277
11/07/15 13:06:00 INFO mapred.JobClient: Combine input records=0
11/07/15 13:06:00 INFO mapred.JobClient: Map output records=1312718
11/07/15 13:06:00 INFO mapred.JobClient: SPLIT_RAW_BYTES=1768
11/07/15 13:06:00 INFO mapred.JobClient: Reduce input records=1312718
파일을 열어보면 끝,,
위 예제는 standalone 모드 기준입니다.
그래도 뭔가 되긴 하는구나.