hadoop 살펴보기(3)

그럼 본격적으로 hadoop에 대해 살펴보자. google 파일 시스템에 대해서도 이야기 할 것이 더 많지만 글로 보는 것보다 한번 운영해보는 것이 더 빨리 이해하리라 생각한다.
hadoop에 대한 자세한 설명을 하기 전에 먼저 설치해보고 실행하는 것을 먼저 해보자.
다음 문서에 보면 설치 방법이 잘 나와 있다.

NutchHadoopTutorial


하지만 테스트 상황에서는 장비도 여러대 없고, 대부분이 windows 환경이다 보니 필자의 경우에는 windows에서 1대의 장비에 설치하는 방법에 대해 설명한다. 그리고 nutch를 설치하여 실제 검색 엔진 기반으로 hadoop이 어떻게 작동하는지 확인하는 것도 좋겠지만 이 컬럼의 주요 이슈는 hadoop의 주요 구성 및 설명에 있기 때문에 hadoop만 설치하는 것으로 한다.

먼저 다음 사이트에서 hadoop을 다운로드 받는다.

http://lucene.apache.org/hadoop/

현재(2006.9.5)까지의 버전은 0.5이다. 압축을 푼 다음 본 컬럼에서 첨부한 파일 중 DF.java 파일을 다운로드 받아 src/java/apache/hadoop/fs에 복사한다.
DF.java에는 현재 file system에서 사용 가능한 free 공간을 가져오는 기능이 구현되어 있다. hadoop의 default 구현에는 Linux의 "df" 명령을 이용하여 가져오고 있기 때문에 windows에서는 오류가 발생한다. 이 부분을 필자가 오류가 나지 않도록 수정해놓았다. (물론 windows의 free disk 정보는 가져오지 않는다. *^^*)

이제 ant 명령으로 소스를 build 한다. 다음과 같은 디렉토리 구성이 나타난다. 여기서 실제 사용하는 파일은 다음과 같다.



- build/classes : hadoop 관련 클래스
(Linux에서는 굳이 build 하지 않고 hadoop-0.5.0.jar 만 classpath에 설정한 다음 수행해도 되지만 여기서는 DF.java를 새로 빌드 했기 때문에 build 된 클래스를 사용한다.)
- lib 아래의 jar 파일들
- conf 디렉토리 : 환경설정관련 변수

bin 파일에는 Linux 환경에서 hadoop의 데몬 서버들을 실행시키는 shell 명령이 존재하는데 해당 명령에 대한 내용은 위의 NutchHadoop 문서를 참고하기 바란다. 나중에 설명하겠지만 hadoop은 모두 4종류의 데몬 서버가 실행된다. 이것들이 원래 운영환경에서는 수십 ~ 수백대의 서버에서 각각의 역할에 맞게 실행되기 때문에 일일이 수작업으로 실행시키는 것이 불가능하다. 이것을 script로 원격에서 실행시키기 위해 ssh를 사용하고 있다. bin 디렉토리에 있는 shell 프로그램은 이것과 관련된 명령들이다.

- 환경설정
환경설정을 하기 위해 먼저 confhadoop-site.xml 파일을 다음과 같이 설정한다.

<?xml  version="1.0"?>
<?xml-stylesheet  type="text/xsl"  href="configuration.xsl"?>

<configuration>
<property>
    <name>fs.default.name</name>
    <value>localhost:9000</value>
    <description>
        The  name  of  the  default  file  system.  Either  the  literal  string  
        "local"  or  a  host:port  for  NDFS.
    </description>
</property>

<property>
    <name>mapred.job.tracker</name>
    <value>localhost:9001</value>
    <description>
        The  host  and  port  that  the  MapReduce  job  tracker  runs  at.  If  
        "local",  then  jobs  are  run  in-process  as  a  single  map  and  
        reduce  task.
    </description>
</property>

<property>  
    <name>mapred.map.tasks</name>
    <value>2</value>
    <description>
        define  mapred.map  tasks  to  be  number  of  slave  hosts
    </description>  
</property>  

<property>  
    <name>mapred.reduce.tasks</name>
    <value>2</value>
    <description>
        define  mapred.reduce  tasks  to  be  number  of  slave  hosts
    </description>  
</property>  

<property>
    <name>dfs.name.dir</name>
    <value>c:/temp/filesystem/name</value>
</property>

<property>
    <name>dfs.data.dir</name>
    <value>c:/temp/filesystem/data</value>
</property>

<property>
    <name>mapred.system.dir</name>
    <value>/mapreduce/system</value>
</property>

<property>
    <name>mapred.local.dir</name>
    <value>/mapreduce/local</value>
</property>

<property>
    <name>dfs.replication</name>
    <value>1</value>
</property>
</configuration>

앞에서 4개의 서버가 필요하다고 하였는데 hadoop-site.xml 파일에서 위의 굵게 설정한 부분에서 두개의 서버에 대해 설정한다.
"fs.default.name" 설정은 파일시스템의 master data(inode 정보)를 관리하는 NameNode 서버에 대한 설정이다. 여기서는 물론 localhost로 설정하였고 port는 9000번을 사용하도록 하였다.
"mapred.job.tracker" 설정은 분산컴퓨팅 처리를 위한 Job 관리를 책임지는 JobTracker 서버에 대한 설정이다. 이것 역시 localhost로 하고 port는 9001번으로 설정하였다.
나머지 설정은 filesystem에서 사용하는 block(chunk)들이 실제 저장되는 local file system의 디렉토리를 지정한다. hadoop의 실제 파일 저장은 OS 의 파일시스템을 사용한다.
마지막에 있는 "dfs.replication"는 block(chunk)의 복사본을 몇개를 두느냐에 대한 설정이다. 일반적으로는 "3으로 설정하지만 예제에서는 machine를 하나만 사용하기 때문에 "1"로 설정하였다.

4개의 서버 중 나머지 2개에 대한 설정은 hadoop-default.xml 파일에 있는데 별도의 설정은 필요없다. 단지 port정도만 변경할 수 있지만 여기서는 default port를 사용한다.

"dfs.datanode.port" : DataNode 서버에 대한 설정

다음 그림은 전체 서버의 구성에 대한 그림이다.



다음은 cont 디렉토리에 있는 "slaves" 파일을 다음과 같이 편집한다.

localhost


slaves 파일은 실제 파일이 저장되는 data node에 대한 목록을 기록한다. 여기서는 localhost 하나지만 실제 운영환경에서는 서버명이 한줄에 하나씩 작성된다. 이 파일은 실제 실행 중에 사용된다기 보다는 서버 실행을 위한 script 실행에 사용되는 것 같은데 그래도 혹시 몰라서 설정해 두도록 한다.



- 실행환경 구성
기본적으로 제공하는 script를 사용할 수 없기 때문에 별도의 작업을 진행한다.

1. 첨부한 파일중 *.bat 파일을 모두 다운로드 하여 hadoop 설치 디렉토리에 저장한다.
2. setenv.bat 파일을 오픈하여 자신의 디렉토리 환경에 맞게 변경한다.
3. 명령창을 열어 다음을 실행한다.
setenv
namenode -format



setenv는 classpath를 설정한다.
"namenode -format"는 hadoop에서 인식 가능한 디렉토리 구조를 구성한다. namenode format는 OS의 local 파일 시스템을 포맷하는 것이 아니지만 hadoop에 저장된 모든 inode 정보를 삭제하기 때문에 주의해서 실행한다.
format에 대한 디렉토리 설정은 앞에서 설정한 conf 파일과 namenode.bat 파일에 있는 -D 옵션에서 설정한 정보를 이용한다.
다음 화면은 format 처리된 후의 디렉토리 구조이다.


(이 화면은 datanode 까지 실행한 다음에 나타나는 화면이다. 원래는 format만 하면 "name" 디렉토리만 만들어진다.)

4. 이제 namenode, datanode, jobtracker, tasktracker를 차례대로 수행시킨다. 별도의 .bat 파일을 만들어서 한번에 수행하도록 구성해도 되지만 필자의 경우 조금 번거롭더라도 하나씩 수행시킨다. 로그나 수행 중 에러등을 확인하기 위해서이다.



5. 테스트를 수행한다.
파일 시스템을 핸들링 하는 명령어를 보기 위해 명령창에서 hadoop.bat 라고 입력한다. 물론 이것을 하기 전에 setenv를 해야 한다.

Usage: java DFSShell [-fs <local | namenode:port>] [-conf <configuration file>] [-D <[property=value>] [-ls <path>] [-ls r <path>] [-du <path>] [-mv <src> <dst>] [-cp <src> <dst>] [-rm <src>] [-put <localsrc> <dst>] [-copyFromLocal <localsrc> <dst>] [-moveFromLocal <localsrc> <dst>] [-get <src> <localdst>] [-getmerge <src> <localdst> [addnl]] [-cat <src>] [-copyToLocal <src> <localdst>] [-moveToLocal <src> <localdst>] [-mkdir <path>] [-report] [-setrep [-R] <rep> <path/file>]

와 같은 결과가 나타난다. 대부분은 명령어만으로 알 수 있을 것이다.
간단하게 local disk에 있는 디렉토리 하나를 hadoop 파일시스템으로 올려보자.

hadoop -copyFromLocal bin dfsbin
hadoop -ls


브라우저를 띄워 다음 URL을 입력하면 상태정보 및 파일 정보를 볼 수 있다.
http://localhost:50070


실제 local filesystem에는 다음과 같이 저장된다. 파일 사이즈가 큰 파일로 테스트를 하면 64MB 단위로 여러개로 쪼개지는 것을 볼 수 있을 것이다.


6. job을 실행시킨다.
hadoop에 분산컴퓨팅 처리를 수행하는 job을 실행시키기 위해서는 hadoop에서 정의한 Map&Reduce API를 이용하도록 클래스를 만들어야 한다. 여기서는 examples에 있는 WordCount 클래스를 실행시킨다.
WordCount는 hadoop-0.5.0-examples.jar 파일에 저장되어 있으며 hadoop에서는 jar 파일에 있는 클래스를 실행시키는 기능도 제공하고 있다.
명령창에서 다음 명령어를 입력한다.

runjar hadoop-0.5.0-examples.jar wordcount -m 1 -r 1 dfsbin result

여기서 dfsbin은 조금전에 업로드한 디렉토리이다. WordCount는 디렉토리 내의 모든 파일에서 단어의 갯수를 세는 프로그램이다. -m은 Map의 갯수이고 -r은 Reduce의 갯수이다. 여기서는 TaskTracker가 하나이기 때문에 1로만 설정하였다. result는 결과가 저장되는 디렉토리 명이다. input, output에 대한 경로는 분산파일시스템내의 경로를 적어야 한다.

WordCount 수행시 주의사항은 input 디렉토리내에 파일만 존재해야 한다. 서브디렉토리가 존재하는 경우 오류가 발생하도록 프로그램 되어 있다.



분산파일시스템을 사용했을 때의 장점은 마지막에서 수행한 Map&Reduce 애플리케이션의 수행에 있다. 여기서는 Map을 하나만 실행시켰지만 Map을 여러개 만들도록 옵션을 바꾸게 되면 엄청난 속도 향상을 느낄 수 있다.
예를 들어 640MB 파일에 대한 WordCount를 할 경우 Map을 10개 만들게 되면 최소 10배 정도의 속도 향상을 느낄 수 있다.
이것은 기존에는 640MB파일을 처음부터 끝까지 읽어 처리하지만 Map에서는 파일을 64MB 사이즈로 10개로 나누어 분산파일시스템에 저장한 다음 해당 파일이 저장되어 있는 서버에서 WordCount를 실행시키기 때문이다. 물론 이것을 thread를 10개로 나누어 동시에 처리하게 할 수도 있지만 기본적으로 파일이 물리적으로 하나만 존재하기 때문에 파일 Read에 병목현상이 발생하게 된다.

* 주의사항 : *.bat 파일에서 첫번째 라인에 있는 환경변수 설정관련해서 마지막 부분의 'babokim'은 실제 로그인된 client의 id 값을 준다. 예를 들어 windows login id가 필자의 경우 'babokim' 이기 때문에 환경변수 값을 babokim으로 하였다. 이 id는 파일 시스템에서 디렉토리를 결정하는데 아주 중요한 역할을 수행한다. 파일 시스템은 "/user/id" 형태로 해당 id에 대한 root 디렉토리를 결정한다.



이번 컬럼에서는 hadoop의 기본적인 사용에 대해 살펴보았다. 다음에는 좀 더 깊은 내부까지 살펴 보도록 하자.

* 본 컬럼은 windows 환경에서 최적화된 내용을 설명한 것이다. Linux 환경인 경우 위에서 설명한 문서를 참고하도록 한다.

- 첨부파일 :



크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 김형준


Trackback URL : http://www.jaso.co.kr/trackback/103

Trackbacks List

  1. Hadoop - MapReduce 테스트

    Tracked from 컴바이블 2007/03/13 23:44 Delete

    Hadoop 세팅을 끝내고..움..이제 성능테스트를 해보도록 하겠다. ㅡㅡahttp://wiki.apache.org/lucene-hadoop/WordCount음 위의 녀석은 디렉토리 안의 모든 파일에서 단어의 갯수를 카운트하는 프로그램이다.WordCount 는 input 디렉토리 내의 파일만 카운트하도록 되어있으며, 서브디렉토리가 있는 경우 에러가 발생한다. 일단 테스트를 하기위해서 866M 짜리 텍스트파일이 들어있는 sample 라는 로컬 디렉토리..

  2. Hadoop - MapReduce 테스트(두번째편)

    Tracked from 컴바이블 2007/03/14 15:15 Delete

    Hadoop - MapReduce 테스트 에서 수행했던 테스트를..보다 다양한 변화를 줘서 돌려보도록 하자.첫번째는, WordCount 에서 변수로 받는 map 의 갯수에 대한 테스트이다.input 파일로는 이전 테스트에서 사용했던 866M 의 텍스트 파일을 그대로 사용했다. 일단 연산이 실행되고나서 map 64% 정도가 수행되고 있는 상황의 첫번째 이미지를 보면, slave 노드들의 %CPU는 거의 모든 노드가 100% 근처에서 버벅대고있다.map..

Comments List

  1. typos 2006/09/06 13:59 # M/D Reply Permalink

    올리셨군요. 안그래도 어제 밤에 hadoop 소스를 살펴보다가 진이 다 빠졌는데, 웬 참조 라이브러리가 그리 많은지, 특히 너치까지 보다보니 ㅎㅎㅎ... 내가 미쳤지요, 밤새 찾고 있었다니.. 지금 보니 lib 패스안에 관련라이브러라 다 있구먼....하여간 올리신대로 테스트 해보겠습니다. 도움에 감사드립니다.

    1. 김형준 2006/09/06 14:02 # M/D Permalink

      안되시는 부분 있으면 답글 다시면 바로 알려드리겠습니다.

  2. typos 2006/09/06 14:54 # M/D Reply Permalink

    말씀만 들어도 든든합니다. 밥사러 분당가야겠군요..^^

  3. 김정은 2006/09/06 16:23 # M/D Reply Permalink

    지난번에 hadoop windows 에서nutch 랑 같이 돌리다가 씨게 고생만 했는데 DF.java 로 업데이트 하면 가능할듯 하네요.. 감사합니다 ^^

  4. typos 2006/09/06 17:38 # M/D Reply Permalink

    namenode에서 ipc.Server의 listener가 안뜨는듯 한데 혹시 ssh같은게 필요한가요?

    1. 김형준 2006/09/06 18:01 # M/D Permalink

      화면 캡쳐해서 보내주시겠어요....
      (babokim at unitel.co.kr)

  5. typos 2006/09/06 18:23 # M/D Reply Permalink

    http://www.blogreader.co.kr/hadooperror.gif
    메일보냈습니다만 혹 몰라서..

    1. 김형준 2006/09/06 18:41 # M/D Permalink

      에러가 아니고 정상적으로 수행된 화면입니다.
      다른 명령창 띄워서 datanode 실행시키면 됩니다.

  6. typos 2006/09/06 18:53 # M/D Reply Permalink

    올리신 화면비교만 하고 리스너 로그가 없는것만 생각하고 데몬서버라는 걸 잊었습니다. 오늘 말씀 고맙고 반가왔습니다.

  7. typos 2006/09/07 01:22 # M/D Reply Permalink

    DF.java에
    String windows = "Filesystem 1K-blocks Used Available Use% Mounted on
    " +
    "/dev/sda2 76793984 6646600 66246404 10% /
    ";
    이걸로 바꾸어 놓으셨네요. 여기에 숫치만 끼워넣으면 되나 보군요.
    혹 윈도우 자체와 Cygwin에서 돌릴때의 퍼포먼스 차이를 본적 있으세요?

    1. 김형준 2006/09/07 08:35 # M/D Permalink

      windows에서는 disk space를 어떻게 가져오는지 몰라서 그냥 static하게 입력해 놓았습니다.

  8. typos 2006/09/07 11:06 # M/D Reply Permalink

    Mustang이란 java6 프로젝트에는 File클래스에 구현이 되어 있다는 군요. http://www.javalobby.org/java/forums/t19527.html
    지금까지의 버전으로는 dos command로 받아오는 방법밖에 없나 본데요.
    dll을 이용하여 JNI로 불러올수 있을지 모르겠군요..

  9. typos 2006/09/07 12:41 # M/D Reply Permalink

    이기능이 꼭 필요한거라면 JNI로 해도 가능하군요. totalspace, available, used ...등 정확한 순서와 포맷을 알려주시면 올려드릴께요. 1K-blocks?

    1. 김형준 2006/09/07 13:01 # M/D Permalink

      아닙니다. 제가 windows 환경에서 구성한 것은 운영 목적이 아니라 개발 목적입니다. hadoop에 추가 기능을 개발할 생각인데 이게 Linux를 개발환경으로 사용하면 귀찮은게 많아서 그냥 windows 환경의 eclipse에서 개발환경 구성했습니다.

    2. 김정은 2006/09/07 13:06 # M/D Permalink

      hadoop 관련 메일링 리스트에 메일을 보내는게 더 좋을듯한데요 ^^ 요런문제가 있으니 해결 해돌라구..

  10. typos 2006/09/09 12:00 # M/D Reply Permalink

    hadoop 0.6이 릴리즈 됐군요.

  11. jam 2012/01/20 11:32 # M/D Reply Permalink

    안녕하세요. 블로그에 계속 포스팅을 하시는 것 같아 오래된 자료이지만 궁금한게 있어 댓글 남깁니다.
    제가 윈도우즈에 하둡을 설치하려고 하는데요. 자료를 찾아보니 linux를 기반으로 한 설치 과정이 대부분이더라구요.
    근데 이 게시물에선 DF.java다운 후 추가하여 새로 빌드를 하는데 DF.java가 여기서 어떤 역할을 하는 지 모르겠습니다. 윈도우즈에 하둡 설치시 꼭 필요한 과정인가요?
    그리고 게시물이 오래되서 그런지 DF.java파일도 다운이 되지 않습니다 ;ㅅ; 오래된 자료라 기억나실련진 모르겠지만 보시게 되신다면 꼭 답변 부탁드립니다 :-D

    1. 김형준 2012/01/21 01:49 # M/D Permalink

      DF, DU는 리눅스, 유닉스 등에서 디스크의 파티션 정보와 디스크 사용량 정보를 가져오는 shell 명령입니다. hadoop의 경우 디스크 사용량 정보가 중요한데 이 명령을 du, df shell 명령을 fork하여 실행한 결과를 이용합니다. 윈도우즈의 경우 이 명령을 사용할 수 없기 때문에 윈도우즈에서 테스트 용도로 사용하는 경우에 한해서 실행이 가능하도록 수정한 것입니다.
      특별한 것은 없고 그냥 명령 실행하지 않고 값을 미리 정한 기본 값으로 설정한 구현입니다.

Leave a comment
« Previous : 1 : ... 313 : 314 : 315 : 316 : 317 : 318 : 319 : 320 : 321 : ... 388 : Next »