- 공식 사이트 대로 진행하였다.
https://hadoop.apache.org/docs/r3.0.0/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html
1. 하둡 설치 ( 하둡버전 : 3.0.1, 서버 : CentOS7( 커널 3.10.0-693.11.6.el7.x86_64 ) )
[root@localhost /]# mkdir /hadoop
[root@localhost /]# cd /hadoop/
[root@localhost hadoop]# wget https://dist.apache.org/repos/dist/release/hadoop/common/hadoop-3.0.1/hadoop-3.0.1.tar.gz
tar -xvf hadoop-3.0.1.tar.gz
cd hadoop-3.0.1
* 테스트용 standalone 실행
mkdir input
cp etc/hadoop/*.xml input
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.1.jar grep input output 'dfs[a-z.]+'
cat output/*
* 테스트 결과
[root@localhost hadoop-3.0.1]# cat output/*
1 dfsadmin
2. 환경변수 세팅
- JAVA_HOME의 경우 이미 되어있다면 하지 않아도 상관없다. 한다면, 경로에 유의
export JAVA_HOME=/usr/java/default
export PATH=${JAVA_HOME}/bin:${PATH}
export HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar
3. 소스 제작
매우 친절하게 Example: WordCount v1.0 항목에 소스가 있다.
WordCount.java 로 이름을 생성하면 된다.
4. 컴파일
bin/hadoop com.sun.tools.javac.Main WordCount.java
jar cf wc.jar WordCount*.class
# 아래와 같이 wc.jar 로 변환된 것을 확인 할 수 있다.
[root@localhost hadoop-3.0.1]# ls -al wc.jar
-rw-r--r-- 1 root root 3075 3월 26 02:41 wc.jar
5. 텍스트 파일 준비
- 일단... 말 그대로 WordCount 이기 때문에, 적당한 텍스트 파일부터 생성해야한다.
예제에서는 /user/joe/wordcount/input 디렉토리 안에 텍스파일을 가지고 진행하였으니,
그대로 준비..
[root@localhost hadoop-3.0.1]# mkdir -p /user/joe/wordcount/input
[root@localhost hadoop-3.0.1]# echo Hello World Bye World > /user/joe/wordcount/input/file01
[root@localhost hadoop-3.0.1]# echo Hello Hadoop Goodbye Hadoop > /user/joe/wordcount/input/file02
[root@localhost hadoop-3.0.1]#
[root@localhost hadoop-3.0.1]# bin/hadoop fs -cat /user/joe/wordcount/input/file01
Hello World Bye World
[root@localhost hadoop-3.0.1]#
[root@localhost hadoop-3.0.1]# bin/hadoop fs -cat /user/joe/wordcount/input/file02
Hello Hadoop Goodbye Hadoop
6. 실행
bin/hadoop jar wc.jar WordCount /user/joe/wordcount/input /user/joe/wordcount/output
7. 결과 확인
[root@localhost hadoop-3.0.1]# bin/hadoop fs -cat /user/joe/wordcount/output/part-r-00000
Bye 1
Goodbye 1
Hadoop 2
Hello 2
World 2
한번 더 해보려했더니, org.apache.hadoop.mapred.FileAlreadyExistsException 예외가 나면서, 수행이 되질 않더라.
이 해결책이 맞는 방법은 아닌것 같지만 일단 파일시스템에서 삭제하고 하면 된다.
bin/hadoop fs -rmr /user/joe/wordcount/output
8. 분석
TokenizerMapper 클래스는 Job 의 Mapper 로 등록되고,
IntSumReducer 클래스는 Combiner 와, Reducer로 등록되었다.
IntSumReducer 가 어째서 두번이나 등록되었는가를 생각해본다면 아래와 같이 생각 할 수 있다.
STEL 1. Map 으로 분해하는 작업이 아래와 같을때
a a b c c -> { a: 1 } { a : 1 } , { b : 1 } , { c : 1 } , { c : 1}
a a b c c d -> { a: 1 } { a : 1 } , { b : 1 } , { c : 1 } , { c : 1} , { d : 1 }
STEP 2. 컴바인 해주는 프로세스나,
{ a : 2 , b : 1 , c : 2 } , { a : 2 , b : 1 , c : 2 , d : 1}
STEP 3. 컴바인 된 결과를 다시 요약하는 프로세스가 동일하기 때문에, 같은 클래스를 사용한것.
{ a : 4 , b : 2 , c : 4 , d:1 }