Fully distributed Mode 에서 예제 실행

 


fully distributed mode 에서 하둡 예제를 실행 해보고 클러스터 상태를 모니터링 하는데 사용되는 하둡의 웹 인터페이스를 살펴보겠습니다.


하둡 완전분산모드까지 오류 없이 진행되었다는 가정하에 포스팅 할게요 ^^


일단 분산모드에서 모든 파일의 입출력관리는 모두 hdfs(hadoop file system) 안에서 이루어진다. 

예제 실행을 위해서 입력파일을 hdfs 안에 올려놔야 한다.

start-all.sh 모든 데몬들을 실행시키고 시작한다.


HDFS(hadoop file system) 


[root@master hadoop-1.0.3]# hadoop fs -put input input  // local 에서 input파일을 동일한 이름으로 hdfs 안에 저장

[root@master hadoop-1.0.3]# hadoop fs -ls                    // 검색해보면 파일이 올라갔음을 볼수 있다.

Found 1 items

-rw-r--r--   1 root supergroup         25 2012-08-31 17:16 /user/root/input


wordcount 예제 실행


[root@master hadoop-1.0.3]# hadoop jar hadoop-examples-1.0.3.jar wordcount input output

12/08/31 17:26:13 INFO input.FileInputFormat: Total input paths to process : 1

12/08/31 17:26:13 INFO util.NativeCodeLoader: Loaded the native-hadoop library

12/08/31 17:26:13 WARN snappy.LoadSnappy: Snappy native library not loaded

12/08/31 17:26:13 INFO mapred.JobClient: Running job: job_201208311703_0001

12/08/31 17:26:14 INFO mapred.JobClient:  map 0% reduce 0%

12/08/31 17:26:29 INFO mapred.JobClient:  map 100% reduce 0%

12/08/31 17:26:41 INFO mapred.JobClient:  map 100% reduce 100%

12/08/31 17:26:46 INFO mapred.JobClient: Job complete: job_201208311703_0001            // 작업완료

12/08/31 17:26:46 INFO mapred.JobClient: Counters: 29

12/08/31 17:26:46 INFO mapred.JobClient:   Job Counters

12/08/31 17:26:46 INFO mapred.JobClient:     Launched reduce tasks=1

12/08/31 17:26:46 INFO mapred.JobClient:     SLOTS_MILLIS_MAPS=13171

12/08/31 17:26:46 INFO mapred.JobClient:     Total time spent by all reduces waiting after reserving slots (ms)=0

12/08/31 17:26:46 INFO mapred.JobClient:     Total time spent by all maps waiting after reserving slots (ms)=0

12/08/31 17:26:46 INFO mapred.JobClient:     Rack-local map tasks=1

12/08/31 17:26:46 INFO mapred.JobClient:     Launched map tasks=1

12/08/31 17:26:46 INFO mapred.JobClient:     SLOTS_MILLIS_REDUCES=10384

12/08/31 17:26:46 INFO mapred.JobClient:   File Output Format Counters

12/08/31 17:26:46 INFO mapred.JobClient:     Bytes Written=8

12/08/31 17:26:46 INFO mapred.JobClient:   FileSystemCounters

12/08/31 17:26:46 INFO mapred.JobClient:     FILE_BYTES_READ=18

12/08/31 17:26:46 INFO mapred.JobClient:     HDFS_BYTES_READ=124

12/08/31 17:26:46 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=43087

12/08/31 17:26:46 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=8

12/08/31 17:26:46 INFO mapred.JobClient:   File Input Format Counters

12/08/31 17:26:46 INFO mapred.JobClient:     Bytes Read=25

12/08/31 17:26:46 INFO mapred.JobClient:   Map-Reduce Framework

12/08/31 17:26:46 INFO mapred.JobClient:     Map output materialized bytes=18

12/08/31 17:26:46 INFO mapred.JobClient:     Map input records=5

12/08/31 17:26:46 INFO mapred.JobClient:     Reduce shuffle bytes=18

12/08/31 17:26:46 INFO mapred.JobClient:     Spilled Records=2

12/08/31 17:26:46 INFO mapred.JobClient:     Map output bytes=40

12/08/31 17:26:46 INFO mapred.JobClient:     Total committed heap usage (bytes)=176623616

12/08/31 17:26:46 INFO mapred.JobClient:     CPU time spent (ms)=1660

12/08/31 17:26:46 INFO mapred.JobClient:     Combine input records=4

12/08/31 17:26:46 INFO mapred.JobClient:     SPLIT_RAW_BYTES=99

12/08/31 17:26:46 INFO mapred.JobClient:     Reduce input records=1

12/08/31 17:26:46 INFO mapred.JobClient:     Reduce input groups=1

12/08/31 17:26:46 INFO mapred.JobClient:     Combine output records=1

12/08/31 17:26:46 INFO mapred.JobClient:     Physical memory (bytes) snapshot=179654656

12/08/31 17:26:46 INFO mapred.JobClient:     Reduce output records=1

12/08/31 17:26:46 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=692523008

12/08/31 17:26:46 INFO mapred.JobClient:     Map output records=4



결과 확인


[root@master hadoop-1.0.3]# hadoop fs -ls  //output 디렉토리가 생성되어 있음

Found 2 items

-rw-r--r--   1 root supergroup         25 2012-08-31 17:16 /user/root/input

drwxr-xr-x   - root supergroup          0 2012-08-31 17:26 /user/root/output

[root@master result]# hadoop fs -ls output/   //디렉토리 안에 보면 part-r-00000 이 생성되어 잇음 (오류가 있다면 이 파일이 생기지 않음)

Found 3 items

-rw-r--r--   1 root supergroup          0 2012-08-31 17:26 /user/root/output/_SUCCESS

drwxr-xr-x   - root supergroup          0 2012-08-31 17:26 /user/root/output/_logs

-rw-r--r--   1 root supergroup          8 2012-08-31 17:26 /user/root/output/part-r-00000

[root@master result]# hadoop fs -cat output/part-r-00000      //확인해 보면 정확하게 카운팅이 되어 있음

hello   4


Web UI 로 클러스트 상태 확인하기

익스플로러 창에 http:// 자신의 IP주소:50070 엔터!!

HDFS 웹 인터페이스 HDFS 파일 시스테을 볼수 있고 각 노드의 사용 가능한 저장 용량을 확인 또한 전체적인 클러스터의 상태를 모니터링 




50030 으로 검색하면 madpreduce job 을 모니터링 할수 있다.




  특정 잡을 클리하면 자세한 성능 정보를 볼수 있다.




  여기 까지 오셨다면 hadoop 실행환경은 완벽히 만드셨다고 생각되어 집니다 ^^

  앞으로는 실제 데이타가 MapReduce 프로그램에 의해 처리되는 방식과 실제 소스 부분등 공부할 예정입니다. 

  특정 오류가 나셔서 막히시는 분 계시다면 뎃글 달아주시면 아는 한도 내에서 답글 달아 드릴게요 ^^ 


저작자 표시
신고



Pully distributed Mode


분산환경을 실현하기 위해 centOS 하나를 더 설치하였다. 

노트북 용량 관계로 총 2개의 가상 centOS 로 실행    1대는 마스터와 슬레이브 다른 1대는 슬레이브 역활로 

총 하나의 마스터와 2개의 노드로 구성된 클러스트 환경을 구축함!!

standalone 모드까지 준비되었다는 가정하에 포스팅 하겠음 ^^  준비 안되신 분들은 게시물 처음으로 가셔서 설치 하시기 바람 !!


준비 사항 

cenOS 5.8    2대

192.168.109.128 master    // 1대는 master 역활
192.168.109.129 hadoop1 // 다른 1대는 slave 역활

 

[root@master ~]# vi /etc/hosts  //  아이피 주소를 입력 함 (호스트 이름을 통해 접근하기 위함)

192.168.109.128 master   

192.168.109.129 hadoop1


 

SSH 설정


master는 특정 컴퓨터 사용자 계정이 되고 다른 모든 노들들 은 다른 컴퓨터 사용자 계정이 된다. 특정 컴퓨터 사용자 계정으로 다른 컴퓨터 사용자 계정에 접근하기 위해서 SSH는 표준 공개 키 암호를 제공한다. 이 키는 사용자를 확인하는 데 사용 되는데 하나는 공개(public) 키이고 다른 하나는 개인(private) 키로 설정된다. 공개키는 클러스트에 있는 모든 노드에 저장되고 master는 클러스트에 접근할때 개인키를 보내고 해당 컴퓨터는 이 두 개의 키를 가지고 접근 시도를 허락한다. 

 

SSH 키 생성


[root@master ~]# ssh-keygen -t rsa

Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa):  // 입력없이 enter

Enter passphrase (empty for no passphrase):              // 입력없이 enter

Enter same passphrase again:                                   // 입력없이 enter 

  Your identification has been saved in /root/.ssh/id_rsa.  // 개인키

Your public key has been saved in (/root/.ssh/id_rsa.pub.  // 공개키 

[root@master ~]# cat ~/.ssh/id_rsa.pub  //생성된 키 확인 

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA5HQiMabQyYz3tTkGxA+jXrR0C5sPiyChws

mCFFGdvt4AMMOVoCqopkombAlIeoN7KWLVv+z02zYsaPVZephDfiKtc1XeTp4XoT4OhMbk

rt7unYuX9VGZMu3OlsGfa6pQmZuWlT/hO7a8JSEMYvZhX/XnHW/xpyaMuX4e8bBrO0F1XX

bC/p9gpycIrLz2268sqdgROh8ibG4KsD4x9s1G/gAg8HOa76YlNLBHseTfgVv3+yJIB2TDiIV7au

xIib9l9JOHLdkepx7nDU6/E1bndWQAqJN0/vCyO5SncFOEY+DKHHzQKy8GAqLNpa6IJ4biuCu

tHMX9kXXwxqoOPGlp4Q== root@localhost.localdomain


공개 키 배포 와 로그인 테스트

 

[root@master ~]# scp ~/.ssh/id_rsa.pub root@hadoop1:~/master_key

 

//hadoop1 으로 다시 로그인뒤 master의 키를 인증된 키로 설정한다.

 
[root@hadoop1 ~]# mkdir ~/.ssh

[root@hadoop1 ~]# chmod 700 ~/.ssh

[root@hadoop1 ~]# mv ~/master_key ~/.ssh/authoried_keys

[root@hadoop1 ~]# chmod 600  ~/.ssh/authoried_keys

//이젠 master 계정에서 대상 로그인으로 시도

 

[root@master ~]# ssh hadoop1                   
Last login: Thu Aug 30 04:52:02 2012 from master
[root@hadoop1 ~]#                          // 로그인 완료 !!빠져나가려면 명령창에 단순히 exit  작렬!!

 


 

 

fully distributed 모드 환경 설정

 

 

core-site.xml  //로그 파일, 네트워크 튜닝, I/O 튜닝 , 파일 시스템 튜닝, 압축 등의 하부 시스템을 설정한다.

 

[root@master hadoop-1.0.3]# cd conf 
[root@master conf]# vi core-site.xml 

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

<!-- Put site-specific property overrides in this file. -->

<configuration>
        <property>
                <name>fs.default.name</name>
                <value>hdfs://master:9000</value>
        </property>
</configuration>

 

mapred-site.xml  //맵 리듀스 작업시 각 worknode 로 분배 역할을 하는 서버 위치 설정,

 

[root@master conf]# vi mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
        <property>
                <name>mapred.job.tracker</name>
                <value>master:9001</value>
        </property>
</configuration>

 

hdfs-site.xml  //hadoop file system 설정

 

[root@master conf]# vi hdfs-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>
        <property>
                <name>dfs.replication</name>
                <value>1</value>                        //데이터 복제 갯수 설정 보통 3으로 함
        </property>
        <property>
                <name>dfs.name.dir</name>
                <value>home/hadoop/work/name</value>
        </property>
        <property>
                <name>dfs.data.dir</name>
                <value>home/hadoop/work/data</value>
        </property>
</configuration>

 

- dfs.name.dir : 네임노드에서 사용한다. 파일의 디렉토리 정보와 파일 정보등을 저장한다.
- dfs.data.dir : 데이터노드에서 데이터 파일이 저장. ',' 을 이용해 여러개 지정가능하다.

 

master 와 slave 의 구분을 위해 파일 수정

 

[root@master conf]# vi masters
master

[root@master conf]# vi slaves

master
hadoop1

 

여기 까지 한 환경설정 작업파일은 모두 클러스트에 분산된 slave 노드들에게 동일하게 복사 한다.


[root@master conf]# scp core-site.xml root@hadoop1:$HADOOP_INSTALL/conf
core-site.xml                                 100%  269     0.3KB/s   00:00
//이와 같이 hdfs-site.xml , mapred-site.xml , masters , slaves 파일 모두 모든 슬레이브 노드에 복사

 

Pully distributed Mode 실행

 

 

저장소를 사용하기 위해 HDFS 를 포맷

 


[root@master hadoop-1.0.3]# hadoop namenode -format
12/08/31 03:23:53 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = master/192.168.109.128
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 1.0.3
STARTUP_MSG:   build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.0 -r 1335192; compiled by 'hortonfo' on Tue May  8 20:31:25 UTC 2012
************************************************************/
Re-format filesystem in home/hadoop/work/name ? (Y or N) Y
12/08/31 03:23:55 INFO util.GSet: VM type       = 32-bit
12/08/31 03:23:55 INFO util.GSet: 2% max memory = 19.33375 MB
12/08/31 03:23:55 INFO util.GSet: capacity      = 2^22 = 4194304 entries
12/08/31 03:23:55 INFO util.GSet: recommended=4194304, actual=4194304
12/08/31 03:23:55 INFO namenode.FSNamesystem: fsOwner=root
12/08/31 03:23:55 INFO namenode.FSNamesystem: supergroup=supergroup
12/08/31 03:23:55 INFO namenode.FSNamesystem: isPermissionEnabled=true
12/08/31 03:23:55 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100
12/08/31 03:23:55 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)
12/08/31 03:23:56 INFO namenode.NameNode: Caching file names occuring more than 10 times
12/08/31 03:23:56 INFO common.Storage: Image file of size 110 saved in 0 seconds.
12/08/31 03:23:56 INFO common.Storage: Storage directory home/hadoop/work/name has been successfully formatted.
12/08/31 03:23:56 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at master/192.168.109.128
************************************************************/

 

하둡의 데몬들을 실행

 

[root@master hadoop-1.0.3]# start-all.sh
starting namenode, logging to /tmp/hadoop-1.0.3/libexec/../logs/hadoop-root-namenode-master.out
hadoop1: starting datanode, logging to /tmp/hadoop-1.0.3/libexec/../logs/hadoop-root-datanode-hadoop1.out
master: starting datanode, logging to /tmp/hadoop-1.0.3/libexec/../logs/hadoop-root-datanode-master.out
master: starting secondarynamenode, logging to /tmp/hadoop-1.0.3/libexec/../logs/hadoop-root-secondarynamenode-master.out
starting jobtracker, logging to /tmp/hadoop-1.0.3/libexec/../logs/hadoop-root-jobtracker-master.out
master: starting tasktracker, logging to /tmp/hadoop-1.0.3/libexec/../logs/hadoop-root-tasktracker-master.out
hadoop1: starting tasktracker, logging to /tmp/hadoop-1.0.3/libexec/../logs/hadoop-root-tasktracker-hadoop1.out

 

데몬들의 상태 확인 (본인은 하나의 마스터와 2개의 슬레이브로 구성했기 때문에 namenode 1 , secondary namenode 1, jobtracker 1, datanode 2, tasktracker 2개 가 떠야 한다.

 

[root@master hadoop-1.0.3]# jps  //마스터 상에서 돌아가는 데몬 ( 마스터의 역활과 슬레이브 역활을 하므로 datanode , tasktracker 도 생성)
1151 Jps
32641 DataNode
327 SecondaryNameNode
562 TaskTracker
417 JobTracker
32514 NameNode

 

[root@master hadoop-1.0.3]# ssh hadoop1 //클러스트 계정에서도 확인
Last login: Thu Aug 30 05:53:31 2012 from master
[root@hadoop1 ~]# jps
25562 DataNode
25357 TaskTracker
25702 Jps

 

여기까지 되면 일단락 완전분산모드 환경 성공!!! 휴...

만약 datanode 가 생성이 안되거나 특정 노드가 보이지 않는다면 !! log 에 저장된 ERROR 를 읽어서 해결해야 한다.



ERROR RESOLUTION

 


datanode 가 생성이 안될경우!!!!! 

슬레이브 계정으로 로그인하여 $HADOOP_INSTALL/logs 라는 디렉토리 확인! 각 노드 별로 log 파일이 존재 하므로 오류가 난 해당 노드의 log 파일을 확인하시면 된다 !!

 

 

ERROR case 1:

[root@hadoop1 logs]# cat hadoop-root-datanode-hadoop1.log   // DataNode 에대한 LOG 가 저장되어 있음

2012-08-30 05:53:04,059 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Incompatible namespaceIDs in /tmp/hadoop-1.0.3/home/hadoop/work/data: namenode namespaceID = 908579614; datanode namespaceID = 1581120086

오류내용

dfs.name.dir 디렉토리와  dfs.data.dir 정보가 서로 불일치하여 master 장비의 datanode 부팅 실패함.

복구 방법
     dfs.data.dir 하위의 여러 파일 삭제
     dfs.name.dir 은 hadoop namenode -format 으로 초기화 한다.

 

ERROR case 2:

        

[root@master logs]# cat hadoop-root-secondarynamenode-master.log    //secondarynamenode 가 뜨질 않아 log 파일 확인

2012-08-31 16:20:26,903 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: master/192.168.109.128:9000. Already     tried 0 time(s).

2012-08-31 16:20:27,908 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: master/192.168.109.128:9000. Already tried 1 time(s).

2012-08-31 16:20:28,910 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: master/192.168.109.128:9000. Already tried 2 time(s).



오류내용

리눅스는 자체적으로 방화벽이 설치되어 있어 허용되지 않는 포트 번호로 접속이 시도 될때 접속이 되질 않는다. 지금은 9000번 포포트가 막혀있으므로 접속 오류

복구방법

        

[root@master logs]# vi /etc/sysconfig/iptables     // 방화벽 설정하는곳

-A RH_Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9000 -j ACCEPT      //해당 포트 번호를 허용한다.

-A RH_Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 9001 -j ACCEPT

-A RH_Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 50010 -j ACCEPT

-A RH_Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 50030 -j ACCEPT

-A RH_Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 50040 -j ACCEPT

-A RH_Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 50060 -j ACCEPT

-A RH_Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 50070 -j ACCEPT

-A RH_Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 50090 -j ACCEPT

[root@master logs]# /etc/init.d/iptables restart

방화벽 규칙을 삭제하는 중:                                 [  OK  ]

chains를 ACCEPT 규칙으로 설정함: filter                    [  OK  ]

iptables 모듈을 제거하는 중:                               [  OK  ]


  //슬레이브 노드에서도 수정하여 준다.


[root@hadoop1 ~]# cat /etc/sysconfig/iptables

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p --dport 50010 -j ACCEPT

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p --dport 50040 -j ACCEPT

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p --dport 50050 -j ACCEPT

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p --dport 50060 -j ACCEPT



이방법이 아니면 자체적으로 방화벽 설정을 해제하는 방법도 있다.

[root@master etc]# cd sysconfig
[root@master sysconfig]# service iptables stop
방화벽 규칙을 삭제하는 중:                                 [  OK  ]
chains를 ACCEPT 규칙으로 설정함: filter                    [  OK  ]
iptables 모듈을 제거하는 중:                               [  OK  ]




이외에도 다양한 오류들이 존재하는데 그럴때마다 log 파일을 확인하여 정확한 오류내용을 찾는것이 현명한 방법이다. 
log 파일을 몰랐을때에는 hadoop 만 다시 깔기를 10번 이상 한것 같습니다. ㅠㅠ 
log 파일에서 정확한 오류 내용을 확인한후 구글에 검색하면 왠만한 오류수정 내용은 나오는것 같습니다 ^^ 하지만 영어번역이 필수 겠지요 ㅎㅎ


저작자 표시
신고



하둡의 구성요소



Fully distributed (완전분산모드) 로 시작하기 전에 간단하게 하둡의 구조와 구성요소를 간단하게 알아보고자....글을 씁니다. ^^


첫장에 서 말했듯 하둡은 분산된 환경에서 연산 처리 하기 때문에 여러개의  데몬 또는 상주 프로그램들이 각각의 컴퓨터에서 실행된다. 그로인해 각각의 분산된 데몬들을 관리할수 있는 시스템 구조를 가진다.


hadoop 에서는 큰틀로 Master - Slave 구조를 가진다. 각각의 역활에 맞게 5섯가지의 데몬들이 존재한다.

    • NameNode - 가장 필수적인 하둡 데몬이다. master역활을 하며 datanode 에게I/O 작업을 지시한다.
    • DataNode -  클러스트에 포함되어 있는 slave 머신에서 존재, local 파일 시스템에 위치한 HDFS 블록을 기록하거나 해당 파일을 read
    • Secondary NameNode - 애기치 못한 오류를 처리하기 위해 사용되는 데몬이다.
    • Jobtracker - 클러스트 노드에서 실행되는 사용자 app 들을 관리한다.
    • TaskTracker - 각 slave 노드에 할당된 작업의 실행을 담당한다.






저작자 표시
신고

티스토리 툴바