분산환경을 실현하기 위해 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
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 를 읽어서 해결해야 한다.
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 파일에서 정확한 오류 내용을 확인한후 구글에 검색하면 왠만한 오류수정 내용은 나오는것 같습니다 ^^ 하지만 영어번역이 필수 겠지요 ㅎㅎ