Experiences/Hadoop

1-5. Hadoop 첫 프로그램 실습(WordCount)

프로그래머 2012. 8. 28. 16:46

먼저, 실습에 앞서 하둡에는 3가지 실행 모드가 존재한다. (자세한 내용은 나중에 따로 설명하도록 하겠다.)


1. Standalone(독립실행) 모드

2. Pseudo-distributed(가상 분산) 모드

3. Fully distributed(완전 분산) 모드


첫 번째 실습은, Standalone(독립 실행) 모드로 실행된다.

Standalone 모드의 특징을 간략히 이야기하면, HDFS를 사용하지 않고 다른 데몬들도 실행시키지 않는다.

즉, 로컬 머신에서만 독립적으로 사용한다. 

이유는 MapReduce 프로그램의 로직을 개발하고 디버깅하는데에 목적이 있다.


# bin/hadoop


하둡에는 다양한 명령들이 존재한다.


근데 우선은 하둡을 실행하기 위한 명령(bin/hadoop jar <jar>)만 알고 있으면 된다.

자세히 들여다보면, 자바로 작성된 하둡 프로그램은 jar 파일 형태로 압축된 후에 실행된다.


사실 WordCount는 이미 예제 파일 안에 포함되어 있다.


하둡이 설치된(이하 $HADOOP_HOME) 폴더에보면 hadoop-examples-$VERSION.jar 파일이 있을 것이다.

거기 안에 보면 이미 WordCount 예제가 그 속에 담겨져 있다.


아무런 인수 없이 그냥 wordcount를 실행시켜보자.


# bin/hadoop jar hadoop-examples-1.0.3.jar wordcount

Usage: wordcount <in> <out>


wordcount는 두 개의 인수만을 가지고 있다고 나타내준다.

<in>은 단어 세기를 수행할 텍스트 문서나 입력 디렉터리이고 <out>은 결과값을 저장할 출력 디렉터리이다.


먼저 wordcount를 실행시키기 위해서 우선 input 디렉터리를 생성하자.


# mkdir input


그리고 몇 개의 문서를 입력 디렉터리에 넣는다.

오바마의 연설을 파일에 첨부했다. (obama.txt)


input 폴더에 문서를 넣고 


# bin/hadoop jar hadoop-examples-1.0.3.jar wordcount input output


# more output/*


이렇게 화면이 나오면 성공!


근데 답을 보면... America와.. America. Americans, 이라는 것을 다 세어준다... 

토큰을 사용할 때 단순히 공백만 고려하고 구두점을 고려하지 않았디 때문에 모두 별개의 단어로 인식했다.

대문자의 경우도 마찬가지이다. 


그렇다면 이번에는 위의 토큰들을 제대로 인식할 수 있도록 소스를 수정해보자.


먼저 수정하기 전에, 기존 소스(WordCount.java)를 컴파일한 후, jar파일로 압축해서 실행하는 단계까지 실습해보자.


작업을 따로 하기 위해서 작업 디렉터리를 생성하고 예제를 복사해보자.


# mkdir -p playground/src        

# mkdir -p playground/classese 

-p 옵션은 해당 폴더가 있으면 생성하지 않고 없으면 생성해준다.


# cp src/examples/org/apache/hadoop/examples/WordCount.java playground/src/WordCount.java

cp(copy) 의 첫번째 인수에는 복사할 대상, 그리고 다음 인수에는 복사되어질 장소와 파일명을 말한다.


이미 hadoop 폴더에 src/examples/org/apache/hadoop/examples/ 안에 여러 예제 소스들이 제공되어지고 있다.


# javac -classpath hadoop-core-*.jar -d playground/classes playground/src/WordCount.java

hadoop-core-*.jar라고 해도 되고 hadoop-core-1.0.3.jar라고 쳐도 똑같다.


WordCount.java파일을 hadoop-core-*.jar파일의 클래스를 참조하여 playground/classes 폴더에 컴파일한다라는 뜻이다.


근데.. 모든 것이 순탄하면 좋으련만... 아마도.. 에러가 뜰 것이다..

playground/src/WordCount.java:54: cannot access org.apache.commons.cli.Options

class file for org.apache.commons.cli.Options not found

    String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();

                         ^

1 error


이것이 무엇이란 말인가.. 똑같이 했는데 왜 안된단 말인가....
에러 메세지를 확인해보면, cannot access org.apach.commons.cli.Options 라는 메시지가 있다.

org.apach.commons.cli.Options를 엑세스 할 수 없다는 소리인데.. 해결책을 찾아보았더니.. 
hadoop-core-*.jar 파일 안에 있는 cli.jar 파일을 인식하지 못해서 그랬던 것이었다.

# javac -classpath hadoop-core-*.jar:lib/commons-cli-1.2.jar -d playground/classes playground/src/WordCount.java

빨간 부분을 추가해줘서 다시 컴파일 했더니 아주 잘되는 것을 확인할 수 있었다.


항상 느끼는 것이지만, 단순한 경로설정에 의해서 일어나는 에러가 많다는 사실을 깨달았다.


여기까지 성공했으니, 이제 jar 파일로 압축해보자.


# jar -cvf playground/wordcount.jar -C playground/classes/ .

playground/wordcount.jar 이름으로 playground/classes/ 폴더의 안에 있는 것들(.)을 압축한다는 뜻이다.


압축이 되었다면 이제 새롭게 압축한 파일을 이용해서 하둡을 실행해보자.

근데 실행에 앞서서, 출력될 디렉터리(output)은 자동으로 만들어지기 때문에, 그 폴더를 다시 사용할 것이라면 삭제해주어야 한다.


# rm -rf output

-rf는 폴더를 아무런 메시지 없이 삭제한다는 뜻이다.


# bin/hadoop jar playground/wordcount.jar input output


과연!! 될 것인가!!.......


두둥.... 아까도 이야기했지만, 항상 잘 안된다... 

여기서 꼭 짚고 넘어가야할 것이 있다.

자바를 아는 사람들이라면 이 에러메세지에 대해서 찾는 것은 식은죽 먹기일 것이나, 

여기는 자바를 전문적으로 아는 사람이 아닌, 배우고자 하는 학생의 기준으로 작성되기 때문에, 그리고 나도 그렇게 겪고 있었기 때문에, 그 실패를 바탕으로 적고 있는 것이다.

아까도 이야기 했던, 바로 경로 설정이다. 

위의 에러 메세지는 wordcount 클래스의 main 메서드를 찾을 수 없다는 것이다. 

그렇다면 어떻게 해결해야 할까?


# bin/hadoop jar playground/wordcount.jar org.apache.hadoop.examples.WordCount input output

빨간 부분을 보면 WordCount 대소문자도 정확히 구분한 것을 볼 수 있다. 그리고 압축된 폴더 안의 경로는 

/ 가아닌 .으로 경로를 설정해주는 것 같다. (정확한 것은 아니고 개인적인 생각이다.)


지금까지 하둡의 기본적인 실행을 다뤄보고,

제공되는 java 파일을 이용해서 컴파일해서 만든 파일을 이용해서 직접 실행해보는 것까지 다루어보았다.

다음에는 이제 공백 토큰만을 인식하는 것이 아닌 (공백 탭 엔터 . , : ; ? ! [ ] ')를 인식하도록 만들어보자.



'Experiences > Hadoop' 카테고리의 다른 글

2-1. 하둡의 구성요소  (6) 2012.08.29
1-6. Hadoop 첫 프로그램 실습(WordCount) - 2  (0) 2012.08.28
1-4. 하둡을 위한 개발환경 설정하기  (2) 2012.08.28
1-3. MapReduce의 이해  (0) 2012.08.27
[!] WordCount 에러  (0) 2012.08.26