카테고리 없음

hadoop를 이용한 WordCount 테스트

라미로 2018. 3. 26. 03:32

- 공식 사이트 대로 진행하였다.
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 }