본문 바로가기

HaDoop...?

HADOOP 프로그래밍!

제목이 좀 이상하다.

음 일단 정리를 하자면

하둡에서 HDFS 와 Map/Reduce 는 HADOOP_HOME(이하 HH) 밑에 hadoop-version-core.jar 파일 안에 같이 있다.

그림으로 보면 이렇게 말이다.


hadoop-version-core.jar 안에는 Map/Reduce인 JobTracker, TaskTracker 프로그램과 HDFS의 NameNode, DataNode 가 있는 것이다. ( 정확히 말하면 HDFS 안에는 세컨트 네임노드도 있지만.. )

그래서 Map/Reduce 가 필요없는 시스템이면 자원낭비일 수 있다. 

그래서 저 두 개를 나누는 컴파일 작업을 했다. 

고로 hadoop-version-HDFS.jar 를 만드는 것이다!


물론 문제를 잡자면. 기껏 분리해도 몇 MB가 줄어드는 것이고 굳이 나눌 필요가 있나? 싶은데

java 가 미래에 스마트폰에 쓰일 줄 알았을까? 그렇다고 이게 쓰인다는 말은 아니고 HDFS 를 Source 쪽으로 좀 더 자세히 알아보려는 게 목적이다. 그 중 이 작업은 첫 번째 작업일 것이다.


본론으로 돌아와서 hadoop-version-core.jar 을 hadoop-HDFS.jar hadoop-MapReduce.jar 로 분리하는 것이다.

하지만 필자는 HDFS 만 필요함으로 HDFS.jar 만 만들 것이다. "MapReduce.jar 도 해보고 싶다." 하시는 분은 아래 포스터에서 NameNode.java 가 중심이 아닌 TaskTracker.java 나 JobTracker.java 로 시작하여 필요한 Source 를 추가하면 된다.

시작하기 전에 Source 부터 분리해야 한다. 거대한 core.jar 안에 HDFS 와 Map/Reduce Source가 같이 있는 것이니 분리작업부터 해야 한다. 분리작업은 http://gh0stsp1der.tistory.com/65 이 포스터에서 볼 수 있다.


1. build.xml 살펴보기

컴파일도 순서가 있다. build.xml 을 분석해본 결과 빌드를 하면 build 이라는 디렉터리가 생성되고 그 안에 classes 이라는 디렉터리 안에 HH/src 에 있는 java 파일들이 컴파일되어 class로 저장되어있다.


정리하면 build.xml 은

HH/src/hdfs/org/apache/hadoop/hdfs/**.java 파일들과

HH/src/core/org/apache/hadoop/**.java 파일들을 컴파일하여 

HH/build/classes/org/apache/hadoop/**.class 파일로 생성한다.

이거 말고도 Map/Reduce와 여러 디렉터리의 *.java 파일도 컴파일하지만 HDFS에 필요한 파일은 core, hdfs 에 있다.

그리고 ant jar 이라는 명령어를 실행하면 이러한 class를 모아서 jar 파일로 만들어 build 디렉터리에 hadoop-version-dev-core.jar 파일을 생성한다.


자 이젠 패키지별 컴파일 순서를 알아야 한다. 왜?

A.class 랑 B.class 가 있다. 

A.class 에는 B.class 자원(메서드, 변수 등)을 사용하고 있다. 

그러면 어떤 class 부터 컴파일을 해야 하나? 답은 B.class 부터 컴파일을 해야 한다. 그래야 A.class 에서 B.class 자원을 읽을 수 있다. 그러면 우리가 컴파일 해야 하는 core/*.java 와 hdfs/*.java 중에 무엇부터 컴파일 해야 되는지 알아볼 것이다.


기존의 하둡 디렉터리로 간다.

ant jar 명령을 실행하면 블라블라 뜨고 SUCCESSFUL이라는 메세지가 뜰 것이다.

자 여기서 블라블라를 다시 한 번 보자. 너무 블라블라해서 화면이 끝까지 못 올라간다.

ant jar >> test 

(자세한 결과를 보기 위해 build 디렉터리를 지우자. 컴파일러는 바보가 아니라서 미리 생성된 class는 재컴파일을 하지 않는다. 컴파일 과정을 전체 보려면 rm -rf build 명령어를 실행 후 ant jar 명령을 실행하자.)

vim test


자 컴파일 과정이 보인다.

Buildfile: /usr/local/hadoop-0.20.2/build.xml         <-- 딱 봐도 알겠다. build.xml 위치를 나타낸다.

clover.setup:                                                     <-- 뭐하는 놈인지 모르겠다. 일단 필요 없어 보이니 패스

ivy-download:                                                   <-- 이놈도 뭐하는 놈인지 모르겠다. 나중에 분석하고 일단 패스


init:                                                                  <-- 드디어 뭔가 알 듯한 용어가 나왔다. 초기화한다.

    [mkdir] Created dir: /usr/local/hadoop-0.20.2/build/classes   <-- mkdir 명령어를 사용하여 필요한 디렉터리를 생성하고

    [mkdir] Created dir: /usr/local/hadoop-0.20.2/build/tools        <-- 아래 쭉 생성

    [mkdir] Created dir: /usr/local/hadoop-0.20.2/build/src

    [mkdir] Created dir: /usr/local/hadoop-0.20.2/build/webapps/task/WEB-INF

    [mkdir] Created dir: /usr/local/hadoop-0.20.2/build/webapps/job/WEB-INF

    [mkdir] Created dir: /usr/local/hadoop-0.20.2/build/webapps/hdfs/WEB-INF

    [mkdir] Created dir: /usr/local/hadoop-0.20.2/build/webapps/datanode/WEB-INF

    [mkdir] Created dir: /usr/local/hadoop-0.20.2/build/webapps/secondary/WEB-INF

    [mkdir] Created dir: /usr/local/hadoop-0.20.2/build/examples

    [mkdir] Created dir: /usr/local/hadoop-0.20.2/build/ant

    [mkdir] Created dir: /usr/local/hadoop-0.20.2/build/c++

    [mkdir] Created dir: /usr/local/hadoop-0.20.2/build/test

    [mkdir] Created dir: /usr/local/hadoop-0.20.2/build/test/classes

    [mkdir] Created dir: /usr/local/hadoop-0.20.2/build/test/testjar

    [mkdir] Created dir: /usr/local/hadoop-0.20.2/build/test/testshell

    [mkdir] Created dir: /usr/local/hadoop-0.20.2/build/test/extraconf

    [touch] Creating /tmp/null2031219602                                <-- 뭔가 만든다. 근데 모르겠다.

   [delete] Deleting: /tmp/null2031219602                                <-- 또 바로 지운다. Log 인가? 나중에 분석 ㄱㄱ

     [copy] Copying 7 files to /usr/local/hadoop-0.20.2/build/webapps    <-- webapps 를 복사하고

     [exec] src/saveVersion.sh: line 32: svn: command not found           <-- 명령을 실행했는데 명령이 없단다.

     [exec] src/saveVersion.sh: line 33: svn: command not found


record-parser:                                                                    <-- 뭐하는 놈인지 모르겠다. 패스
compile-rcc-compiler:                                   <-- 오 뭔가 그럴싸한 놈이 나왔다. 컴파일러란다. 그런데 rcc? 모르니까 패스

compile-core-classes:                                  <-- 등장 ! core-classes 를 컴파일한다.

compile-mapreduce-classes:                         <-- 또 등장! Map/Reduce 를 컴파일한다.

compile-hdfs-classes:                                   <-- 또 등장이다 ! HDFS 를 컴파일한다.


그리고 블라블라블라 C++ 어쩌고 나오다가

jar:                                                                  <-- jar 파일을 만든다.

BUILD SUCCESSFUL                                         <-- 성 to the 공

Total time : 13 seconds                                      <-- 총 걸린 시간 13초


빠르게 컴파일 순서를 알아보았다. 너무 대충이긴 하지만 나중에!! 나중에 분석하고 일단 필요한 것부터 추출하자.

전체 순서를 봤을 때

1. clover setup 뭔가 설치를 하고

2. ivy download 뭔가 다운로드를 해서

3. init 필요한 디렉터리를 생성하고

4. 컴파일러가 동작하고

5. java 파일을 class로 만들고

6. jar 파일로 합친다! 끝!


깔끔하다. 그리고 컴파일 할 때는 core 부터 한다. 그리고 Map/Reduce와 HDFS 가 컴파일된다.

이 말은 HDFS 가 core.class 들이 필요하다는 말이다.

필요한 순서를 알았으니 build.xml 을 열어보자


(참고로 필자는 xml 을 전혀 모르며.. 밑에 모든 해석은 혼자 엉터리로 이해한 해석이므로 미리 양해를 구합니다.)


<project name="Hadoop" default="compile" xmlns:ivy="antlib:org.apache.ivy.ant">

</project>

name : 프로젝트 이름

default : 기본적으로 불릴 target( OOP에서 디폴트 생성자라고 생각하면 되나. 어쨌든 ant 명령어만 입력했을 때 compile target으로 지정한 부분이 실행된다.)

xmlns:ivy : 모름. 일단 필요 없다고 판단


<property name="home" value="."/>    굳이 표현하자면 변수라고 생각하면 된다.

name : 변수이름

value : 그 이름이 의미하는 값

사용방법 : ${home} 

예시 : ${home}/src/docs -> ./src/docs ( . 은 build.xml 이 있는 위치 )

응용 : <property name="docs" value=${home}/src/docs"/> ( 이렇게 사용 가능 )


<target name="compile" depends="compile-core, compile-contrib, compile-ant-tasks, compile-tools" description='Compile core, contrib">

</target>

name : target 이름 ( 함수 이름이라고 생각하면 이해가 쉽다. )

depends : 이 target 을 실행하기 전에 부르는 target ( 함수 안에서 함수를 부른다고 생각하면 된다. )

description : 설명 ??

실행 순서 : compile-core -> compile ( 정확히 말하면 compile 이 먼저 실행된다. 하지만 실행했는데 depends 를 참고하여 해당 target을 실행한 후 돌아와 실행하는것 같다. 

정리하면 compile (depends 발견) -> compile-core -> compile 이 런식으로 수행 되는듯하다. 


오늘은 여기까지 정리하기가 힘들다. 내일 이어서 하겠다. ㅠ

내일은 간단하게 build.xml 을 만들어 볼 것이다.


p.s : ANT 사용법 = http://byulbada.egloos.com/2389050