2012년 12월 29일 토요일

디자인 패턴에 대해 처음 안 사실

보고 싶은 책이 있어 동네에서 제일 큰 서점에 갔다. 내가 보려는 책 찾다가 옆에 있는 웹 디자인과 관련된 책들이 있는 책장을 살펴 보던 중 Head First Design Patterns 책 발견!
오늘 처음 알았다 디자인 패턴이 웹 화면을 예쁘게 꾸며주기 위해 필요한 것이라는 것을...
 
서점 직원한테 말해 줄걸 그랬나? 자바나 프로그래밍 관련된 곳에 꽂아 놓으라고~
 
 
p.s. 혹시 소프트웨어 개발과 관련된 일 하시는 분 중 '어! 거기 맞지않나?'라고 생각하시는 분들이 없겠지만 혹시라도 있다면, Head First Design Patterns 책 한번 보시길 추천함!
저작자: Yes, 상업적 이용: No, 컨텐츠 변경: No

2012년 12월 15일 토요일

Hadoop Cluster 설치하기

설치환경

클러스터를 구성하기 위하여 VirtualBox를 이용하여 삽질을 통해 가상머신을 3개 준비하였으며, 각 가상머신에는 CentOS 6.3 버전을 개발용도로 설치, 호스트 이름과 IP주소는 다음과 같이 지정하였다.

호스트 명 IP주소 용도
alpha.centos 192.168.70.11 NameNode, DataNode, JobTracker
beta.centos 192.168.70.12 DataNode, TaskTracker
gamma.centos 192.168.70.13 DataNode, TaskTracker

실 운용이라면 NameNode에 다른 서비스를 올리지 않겠지만 스터디 환경 구축이 목적이므로 필요한 서비스를 모두 올렸다.

"hadoop" 그룹 내 "hadoop" 계정을 생성하여 설치 시 사용하였다. 시스템 내 다른 계정으로 해도 상관없다.

준비해야 할 것들

Hadoop은 Java로 만들어졌다. 이 말은 즉, Java 실행환경이 설정되어 있어야 한다는 뜻이다. 그것도 1.6.x 이상이어야 한다고 Hadoop 홈페이지에 친절하게 쓰여 있다. 그리고 Java가 어디 설치되어 있는 지 Hadoop에게 알려 주기 위하여 환경변수 JAVA_HOME도 설정해 주어야 한다.

클러스터를 구성할 것이기 때문에 클러스터 노드 간 통신을 해야 한다. Hadoop의 노드는 ssh(Secure Shell)를 이용하여 통신을 하므로 ssh/sshd가 설치되어 있어야 하며 보통은 Linux를 설치할 때 같이 설치된다.

마지막으로 필요한 것은 Hadoop 배포판이다. 다들 짐작하듯이 Hadoop 사이트에서 받을 수 있다. 정확히 얘기하면 http://apache.mirror.cdnetworks.com/hadoop/common/에서 받을 수 있다. 현재도 계속 기능을 추가하여 개발 중이므로 여러 가지 버전이 다양한 형태로 존재한다. 난 현재 stable 버전인 1.0.4 버전 gz 형태(hadoop-1.0.4/hadoop-1.0.4.tar.gz)를 받아 설치하였다. rpm 형태를 받아 설치해도 되지만 자동으로 설치하는 것보다 수동으로 이것 저것 만져보면서 하는 것이 좋을 거란 생각에서 gz 형태를 사용하였다.

이상 필요한 것들을 정리하면 다음과 같다.

1. 1.6.x 이상의 Java Runtime 및 JDK 설치.
2. ssh/sshd 설치되어 있지 않다면 설치.
3. Hadoop 배포판 받기.

이런 것들 이외 기본적인 Linux 명령 사용법, vi 사용법, *.java 컴파일 방법, jar 만드는 법, *.class 파일 실행하는 방법, 놀자는 아이들 달래는 방법, 애인이나 와이프에게 지금 하는 건 노는 게 아니라고 설득하는 것 등등등 많은 것들이 필요하지만 모두 안다고 생각하고 출발~

설치과정

설치하기 위한 모든 준비가 끝났다면 이제 설치해 보자. 설치하기 위한 개략적인(?) 과정은 다음과 같다.

1. Hadoop 배포판 설치하고자 하는 디렉토리에 압축해제 및 복사.
2. 환경변수 JAVA_HOME, HADOOP_HOME 설정.
3. 클러스터 노드 식별을 위한 hosts 파일 설정.
4. SSH 자동인증을 위한 공개키(Public Key) 생성 및 공유.
5. Hadoop에서 필요로 하는 디렉토리 만들기.
6. Hadoop 환경설정 스크립트 실행.
7. 설정파일들 손보기.
8. 설정파일들 클러스터 내 노드간 공유.
9. NameNode 초기화 및 실행.

1. Hadoop 배포판 설치

Hadoop 배포판 파일을 설치하고자 하는 디렉토리로 복사하고 해당 디렉토리로 이동.
(난 /opt 밑에 설치했음.)

[hadoop@alpha ~]# cp hadoop-1.0.4.tar.gz /opt
[hadoop@alpha ~]# cd /opt

배포판 hadoop-1.0.4.tar.gz을 다음과 같이 압축해제.

[hadoop@alpha opt]# gunzip hadoop-1.0.4.tar.gz
[hadoop@alpha opt]# tar -xf hadoop-1.0.4.tar
  or
[hadoop@alpha opt]# tar -xzf hadoop-1.0.4.tar

그러면 다음과 같은 디렉토리가 생긴 것을 볼 수 있다.

[hadoop@alpha opt]$ ls -l
total 186732
drwxr-xr-x. 14 hadoop hadoop      4096 Oct  3 14:17 hadoop-1.0.4
-rw-r--r--.  1 hadoop hadoop 191201280 Dec 08 18:31 hadoop-1.0.4.tar
drwxr-xr-x.  2 root   root        4096 Jun 22  2012 rh
[hadoop@alpha opt]$

설치 끝. 앞으로 여기가 Hadoop 홈디렉토리($HADOOP_HOME) 혹은 설치디렉토리($HADOOP_INSTALL)가 된다(이 경우는 "/opt/hadoop-1.0.4"임). 이제 실행에 필요한 환경을 설정하자.

설치 후 HDFS 등을 실제 구동할 때 환경변수 $HADOOP_HOME가 deprecated 되었다는 메시지를 볼 수 있는데 Hive, HBase 등 다른 모듈과 같이 사용하려면 필요하답니다.

2. 환경변수 JAVA_HOME, HADOOP_HOME 설정

Linux에서 환경변수는 export 명령을 이용하여 설정한다.

[hadoop@alpha ~]# export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64
[hadoop@alpha ~]# export HADOOP_HOME=/opt/hadoop-1.0.4

영문 타입핑 연습이 필요한 경우라면 매번 모든 노드에 로그인해서 export 명령을 실행해도 된다. 하지만 많이 귀찮을 것이다. 귀찮음을 없애기 위하여 /etc/profile 파일을 수정하자.

[hadoop@alpha ~]# vi /etc/profile

다음과 같은 vi 화면이 나타나고 제일 뒤쪽에 필요한 export 명령을 추가하자

# /etc/profile
 
# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc
 
(중략)
 
export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64
export HADOOP_HOME=/opt/hadoop-1.0.4
 
~

(환경변수에 설정된 디렉토리 경로는 시스템 환경 및 사용자의 성향에 따라 다른 거 다 아시죠?)

3. hosts 파일 설정

클러스터 네트워크 상의 노드를 이름으로 식별하기 위한 설정이다. /etc/hosts 파일에 각 노드의 이름과 IP주소를 명시하여 노드 이름으로 입력되어도 IP주소로 찾아 갈 수 있게 하자. 텍스트 파일이니까 vi 같은 맘에 드는 에디터를 이용하여 편집하면 된다. 단, root 권한 필요. 난 다음과 같이 노드의 이름과 IP주소를 할당하여 클러스터를 구성하였다. (이것도 시스템 환경 및 사용자의 성향에 따라 다른 거 다 아시죠?)

[root@alpha ~]# cat /etc/hosts
192.168.70.11          alpha.centos
192.168.70.12          beta.centos
192.168.70.13          gamma.centos

'난 IP주소를 이용하여 클러스터 내 노드를 지정할거야'라고 한다면 설정하지 않아도 된다.

네트워크 카드가 2개 이상인 경우 hosts 파일 내 루프백 주소(127.0.0.1)가 있으면 Hadoop 데몬이 제대로 Listening하지 못하는 현상이 발생했었다. 127.0.0.1이 있다면 제거하자.

노드의 이름과 IP주소 정보는 클러스터 내 모든 노드가 공유할 필요가 있다. 각 노드마다 로그인해서 vi를 이용하든지 아니면 다음 명령을 이용하여 hosts 파일을 공유하자.

[root@alpha ~]# rsync /etc/hosts root@beta.centos:/etc/hosts
[root@alpha ~]# rsync /etc/hosts root@gamma.centos:/etc/hosts
[root@alpha ~]# 

4. SSH 자동인증을 위한 공개키(Public Key) 생성 및 공유

SSH(Secure SHell)은 인증키를 이용하여 상호 인증 후 접속을 허락하는 보안성 높은 암호화 통신방식(?)이다. 이 말은 인증키만 맞으면 묻지도 따지지도 않고 연결을 허락한다는 뜻이다. 그럼 인증키를 맞추는 방법은 뭘까? 방법은 "① 인증키 생성, ② 키 공유"이다. 농담같지만 정말이다(^^;;;). 그러면 어떻게 생성하고 공유하는 지 자세히 살펴보자.

① 인증키 생성

ssh-keygen 명령을 이용한다. 사용방법은 다음과 같다.

[hadoop@alpha conf]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa): (a)
Created directory '/home/hadoop/.ssh'.
Enter passphrase (empty for no passphrase): (b)
Enter same passphrase again: (c)
Your identification has been saved in /home/hadoop/.ssh/id_rsa.
Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub.
The key fingerprint is:
8d:a1:0d:23:a8:0d:1b:e9:4b:06:fa:63:4a:25:a8:e8 hadoop@alpha.centos
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
| . .             |
|= . . o .        |
|=*   . = +       |
|==..  . S .      |
|=.+              |
|oo+              |
|oo .             |
|.E               |
+-----------------+
[hadoop@alpha conf]$ 

ssh-keygen 명령을 수행할 때 인수로 중요한 것은 인증키 생성 방식이다. RSA와 DSA 방식이 있는데 위 경우는 RSA 방식으로 인증키를 생성한 경우이다. 구동 중인 ssh가 어떤 방식을 사용하고 있는지에 맞춰 생성해야 한다.

(a)에서는 생성할 인증키를 저장할 위치를 지정한다. 굳이 바꿀 필요가 없다. 그냥 <Enter>.

(b)에서는 암호(password)와 비슷한 통과문구(passphrase)를 입력한다. 그냥 ssh 인증용 암호라고 생각하면 될 것 같다. 여기에 통과구문를 입력하면 ssh를 이용하여 접속할 때마다 입력한 통과구문을 암호처럼 입력해야 한다. 우리의 목적은 Hadoop 데몬들 간 자동으로(아무런 입력없이) ssh 통신을 할 수 있도록 하는 것이기 때문에 아무것도 입력하지 않는다. 그냥 <Enter>.

(c)에서는 (b)에서 입력한 것을 그대로 입력한다. 아무것도 입력하지 않았으므로 여기도 그냥 <Enter>.

이제, 인증키가 생성되었다는 메시지와 함께 id_rsa, id_rsa.pub 파일이 생긴것을 확인할 수 있다. id_rsa는 개인키(Private Key)이고 id_rsa.pub는 공개키(Public Key)이다. 인수를 DSA 방식으로 지정하면 id_dsa, id_dsa.pub가 생성된다.

[hadoop@alpha ~]$ ls -l ~/.ssh
합계 16
drwx------. 2 hadoop hadoop 4096 2012-12-31 13:29 .
drwx------. 5 hadoop hadoop 4096 2012-12-31 13:29 ..
-rw-------. 1 hadoop hadoop 1675 2012-12-31 13:29 id_rsa
-rw-r--r--. 1 hadoop hadoop  401 2012-12-31 13:29 id_rsa.pub

상호 자동인증하고자 하는 모든 노드에서 인증키 생성 작업을 수행하여 id_rsa.pub 파일을 생성하여야 한다. 모두 생성했다면 이제 키를 공유하자.

② 키 공유

여기서 키는 자물쇠를 열 때 필요한 쇠로된 울퉁불퉁한 물건의 형태가 아니라 암호화된 문자열이다. 자동 인증하려면 이 키 문자열이 "~/.ssh/authorized_keys"에 있어야 한다. 조금 더 상세히 말하면, 노드 A의 hadoop 계정을 이용, 노드 B의 hdfs 계정으로 자동 접속하고 싶다면, A에서 hadoop 계정으로 인증키를 생성하고 생성한 공개키 문자열을 노드 B의 "/home/hdfs/.ssh/authorized_keys" 파일에 복사해 넣어야 한다(접속하고 싶은 쪽의 공개키가 접속되는 쪽에 있어야 한다).

자~ 그러면 실제 해 보자. 여기 저기 옮겨다니면 피곤하니까 한 노드에서만 작업을 하자.

작업의 편의를 위하여 "~/.ssh/" 디렉토리로 이동하자. 그리고 "authorized_keys" 파일이 없다면 다음과 같이 생성하자.

[hadoop@alpha .ssh]$ cat id_rsa.pub >> authorized_keys

"authorized_keys" 파일의 사용권한은 소유자 이외 쓰기가 허락되서는 안된다. Group이나 Other가 쓰기 가능하다면 ssh 자동접속은 물건너 간다(매번 암호를 다시 묻는다). 파일 액세스 권한을 변경하자.

[hadoop@alpha .ssh]$ chmod 755 authorized_keys

이렇게 하면 다른 노드(alpha.centos 이외 노드)에게 줄 내(alpha.centos) 공개키는 준비되었다. 이제 다른 노드의 공개키를 다음 명령을 이용하여 복사해 오자.

[hadoop@alpha .ssh]$ ssh hadoop@gamma.centos cat ~/.ssh/id_rsa.pub >> authorized_keys
The authenticity of host 'gamma.centos (192.168.70.13)' can't be established.
RSA key fingerprint is b9:aa:12:e2:77:f0:44:c5:5e:20:c5:5c:6d:15:fe:f2.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'gamma.centos,192.168.70.13' (RSA) to the list of known hosts.
hadoop@gamma.centos's password: (암호입력)
[hadoop@alpha .ssh]$

자동인증하고자 하는 모든 노드의 공개키를 "authorized_keys"로 복사해 오자. 다음 명령을 한번 더 하자는 뜻이다.

[hadoop@alpha .ssh]$ ssh hadoop@beta.centos cat ~/.ssh/id_rsa.pub >> authorized_keys

이제 모든 노드의 공개키를 복사했다면 authorized_keys가 완성되었고 모든 노드에 복사해 주면 모든 과정이 끝난다. 복사는 다음과 같이 하자.

[hadoop@alpha .ssh]$ scp ./authorized_keys hadoop@beta.centos:~/.ssh/
hadoop@beta.centos's password: (암호입력)
authorized_keys                               100% 1202     1.2KB/s   00:00
[hadoop@alpha .ssh]

최종 확인을 위하여 ssh로 접속해 보면,

[hadoop@alpha .ssh]$ ssh hadoop@beta.centos
Last login: Wed Dec 13 08:36:32 2012 from alpha.centos
[hadoop@beta ~]$ _

묻지도 따지지도 않고 접속되는 모습을 확인할 수 있다. 만약, 암호를 묻는다면 공개키는 제대로 생성했는지, RSA인지 DSA인지 authorized_keys 파일에 공개키 내용이 제대로 복사되었는 지, 권한은 올바른 지 등을 확인해 보자.

5. Hadoop용 디렉토리 만들기

Hadoop의 실행환경을 설정하기 위하여 hadoop-setup-conf.sh를 실행하면 필요로 하는 디렉토리들이 몇 가지 있다.

디렉토리 설명 기본값
Config Hadoop 실행을 위하여 필요한 설정파일 저장위치 /etc/hadoop
Log 실행 중 발생하는 로그 저장위치 /var/log/hadoop
PID 클러스터 내 노드를 위한 PID 정보 저장위치 /var/log/hadoop
NameNode 네임노드의 데이터 저장위치 /var/lib/hadoop/hdfs/namenode
DataNode 데이터 노드의 데이터 저장위치 /var/lib/hadoop/hdfs/datanode
JobTracker MapReduce 작업용 디렉토리 /var/lib/hadoop/mapred

기본값을 그대로 사용해도 무방하다. 중요한 것은 각 노드의 역할에 따라 필요한 디렉토리가 실제로 존재해야 한다는 것이다. 지정한 디렉토리가 있는지 확인하고 없다면 만들자. 난 다음과 같이 생성하였다.

디렉토리 설정값
Config /opt/hadoop-1.0.4/conf
Log /opt/hadoop-1.0.4/data/log
PID /opt/hadoop-1.0.4/data/log
NameNode /opt/hadoop-1.0.4/data/namenode
DataNode /opt/hadoop-1.0.4/data/datanode
JobTracker /opt/hadoop-1.0.4/data/mapred

모든 노드에 지정한 폴더가 있어야 한다. 노드의 역할에 따라 없어도 되는 디렉토리도 있지만 난 그냥 모두 만들었다. 또 하나 중요한 사항은 생성한 디렉토리의 권한은 drwx------, 즉 소유자만 읽고, 쓰고, 실행할 수 있어야 한다. 그러니 생성한 디렉토리 마다 "chmod 700 ..."을 해 주자.

6. Hadoop 환경설정 스크립트 실행

Hadoop 실행환경 설정을 위한 스크립트 hadoop-setup-conf.sh를 실행하자. 위치는 Hadoop 설치 디렉토리 밑에 있는 ./sbin 디렉토리에 있다. 실행하면 다음과 같은 화면이 나타난다.

[hadoop@alpha sbin]$ ./hadoop-setup-conf.sh
Setup Hadoop Configuration
 
Where would you like to put config directory? (/etc/hadoop) /opt/hadoop-1.0.4/conf
Where would you like to put log directory? (/var/log/hadoop) /opt/hadoop-1.0.4/data/log
Where would you like to put pid directory? (/var/log/hadoop) /opt/hadoop-1.0.4/data/log
What is the host of the namenode? (alpha.centos) (NameNode용 호스트 입력)
Where would you like to put namenode data directory? (/var/lib/hadoop/hdfs/namenode) /opt/hadoop-1.0.4/data/namenode
Where would you like to put datanode data directory? (/var/lib/hadoop/hdfs/datanode) /opt/hadoop-1.0.4/data/datanode
What is the host of the jobtracker? (alpha.centos) (JobTracker용 호스트 입력)
Where would you like to put jobtracker/tasktracker data directory? (/var/lib/hadoop/mapred) /opt/hadoop-1.0.4/data/mapred
Where is JAVA_HOME directory? (/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64) (Java 위치)
Would you like to create directories/copy conf files to localhost? (Y/n) Y

5에서 생성한 디렉토리 위치에 맞춰 위와 같이 입력하고 "Y"를 누르면 입력한 내용을 확인할 수 있는 화면이 나타난다.

Review your choices:
 
Config directory            : /opt/hadoop-1.0.4/conf
Log directory               : /opt/hadoop-1.0.4/data/log
PID directory               : /opt/hadoop-1.0.4/data/log
Namenode host               : alpha.centos
Namenode directory          : /opt/hadoop-1.0.4/data/namenode
Datanode directory          : /opt/hadoop-1.0.4/data/datanode
Jobtracker host             : alpha.centos
Mapreduce directory         : /opt/hadoop-1.0.4/data/mapred
Task scheduler              : org.apache.hadoop.mapred.JobQueueTaskScheduler
JAVA_HOME directory         : /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64
Create dirs/copy conf files : Y
 
Proceed with generate configuration? (y/N) y

"y"를 입력하면 스크립트 수행결과가 나타나고,

chown: changing ownership of `/opt/hadoop-1.0.4/conf/hadoop-env.sh': 명령을 허용하지 않음
chown: changing ownership of `/opt/hadoop-1.0.4/conf/taskcontroller.cfg': 명령을 허용하지 않음
chown: changing ownership of `./../bin/task-controller': 명령을 허용하지 않음
 
Configuration file has been generated in:
 
/opt/hadoop-1.0.4/conf/core-site.xml
/opt/hadoop-1.0.4/conf/hdfs-site.xml
/opt/hadoop-1.0.4/conf/mapred-site.xml
/opt/hadoop-1.0.4/conf/hadoop-env.sh
/opt/hadoop-1.0.4/conf/hadoop-policy.xml
/opt/hadoop-1.0.4/conf/commons-logging.properties
/opt/hadoop-1.0.4/conf/taskcontroller.cfg
/opt/hadoop-1.0.4/conf/capacity-scheduler.xml
/opt/hadoop-1.0.4/conf/log4j.properties
/opt/hadoop-1.0.4/conf/hadoop-metrics2.properties
 
to /opt/hadoop-1.0.4/conf on all nodes, and proceed to run hadoop-setup-hdfs.sh on namenode.
[hadoop@alpha sbin]$

설정파일들은 지정한 Config 디렉토리에 생성된다.

생성된 파일을 다른 노드에 배포하고 hadoop-setup-hdfs.sh를 NameNode에서 실행하라고 친절한 메시지도 보여준다. 그런데 굳이 하지 않아도 된다.

7. 설정파일들 손보기

6번째 단계에서 실행을 위한 환경이 다 갖춰지면 좋을텐데 그렇지가 못하다. 그래서 몇몇 설정 파일을 손봐줘야 한다. 그렇다고 많이는 아니고 4개 정도만 손보면 된다.

첫 번째로 손볼 파일은 hdfs-site.xml 파일이다. 파일명에서 보듯이 분산 파일 시스템 관련된 설정을 저장하는 파일이다.

HDFS도 Linux 파일 시스템과 마찬가지로 생성된 파일, 디렉토리에 대한 권한이 있다. 기본적으로 생성한 자신만 읽고 쓸 수 있게 되어 있어 Web Console 등을 이용하여 파일 내용을 확인할 때 문제가 된다. 이를 해결하기 위하여 hdfs-site.xml 파일에 다음과 같이 umask 값을 지정하자.

<name>dfs.umaskmode</name>
<value>022</value>

umask 값 지정시 지정하고자 하는 권한의 Octet값을 반대로 지정해야 한다. 위와 같이 지정하면 755로 권한이 부여되어 모든 사람이 읽을 수 있게 된다.

두 번째로 손볼 파일은 hadoop-env.sh 파일이다. Hadoop 실행환경을 위하여 만들어진 스크립트인데 이 스크립트에 환경변수 JAVA_HOME가 설정되어 있지 않으면 DataNode에서 Java를 찾는 경우가 있다. 그러니 다른 데서 했더라도 한번 더 해 주자.

세 번째로 손볼 파일은 masters란 파일로 Secondary NameNode의 호스트를 지정하는 파일이다. 난 다음과 같이 지정하였다. (실전에서는 이렇게 하면 안됨.)

[hadoop@alpha conf]$ cat masters
alpha.centos

마지막으로 손볼 파일은 slaves 이다. 이 파일은 DataNode의 호스트를 지정하는 파일로, 내가 지정한 내용은 내가 설치하려는 시스템 구성에 맞게 다음과 같이 수정하였다.

[hadoop@alpha conf]$ cat slaves
alpha.centos
beta.centos
gamma.centos

휴~ 이제 Hadoop 설치 및 설정파일 편집이 끝났다.

8. 설정파일들 클러스터 내 노드간 공유

Hadoop의 핵심인 HDFS와 MapReduce을 실행하기 전 마지막으로 할 일은 지금까지 만든 설정파일을 모든 노드가 공유하는 것이다. 설정파일 편집작업을 한 노드(alpha.centos)에서 다음 명령으로 다른 노드에 설정파일을 공유하자.

rsync /opt/hadoop-1.0.4/conf/* hadoop@beta.centos:/opt/hadoop-1.0.4/conf/
rsync /opt/hadoop-1.0.4/conf/* hadoop@gamma.centos:/opt/hadoop-1.0.4/conf/

공유 후 각 노드의 시스템 환경에 따라 변경해 주어야 할 것들이 있다면 해당 부분을 수정하자. 예를 들어 JAVA_HOME 같은 것들~

9. NameNode 초기화 및 실행.

하드 디스크를 새로 사면 사용하기 전에 포맷을 한다. HDFS도 마찬가지다. 사용하기 전에 정보를 담고 있을 NameNode를 포맷해야 한다.

[hadoop@alpha conf]$ hadoop namenode -format
Warning: $HADOOP_HOME is deprecated.
 
12/12/15 13:58:55 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = alpha.centos/192.168.70.11
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 1.0.4
STARTUP_MSG:   build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.0 -r 1393290; compiled by 'hortonfo' on Wed Oct  3 05:13:58 UTC 2012
************************************************************/
Re-format filesystem in /opt/hadoop-1.0.4/data/namenode ? (Y or N) Y
12/12/15 13:59:00 INFO util.GSet: VM type       = 64-bit
12/12/15 13:59:00 INFO util.GSet: 2% max memory = 19.33375 MB
12/12/15 13:59:00 INFO util.GSet: capacity      = 2^21 = 2097152 entries
12/12/15 13:59:00 INFO util.GSet: recommended=2097152, actual=2097152
12/12/15 13:59:01 INFO namenode.FSNamesystem: fsOwner=hadoop
12/12/15 13:59:01 INFO namenode.FSNamesystem: supergroup=supergroup
12/12/15 13:59:01 INFO namenode.FSNamesystem: isPermissionEnabled=true
12/12/15 13:59:01 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100
12/12/15 13:59:01 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)
12/12/15 13:59:01 INFO namenode.NameNode: Caching file names occuring more than 10 times
12/12/15 13:59:01 INFO common.Storage: Image file of size 112 saved in 0 seconds.
12/12/15 13:59:01 INFO common.Storage: Storage directory /opt/hadoop-1.0.4/data/namenode has been successfully formatted.
12/12/15 13:59:01 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at alpha.centos/192.168.70.11
************************************************************/
[hadoop@alpha conf]$

포맷이 끝나고 나면 Hadoop 데몬을 띄울 차례다. Hadoop 설치 디렉토리 중 ./bin 디렉토리에 보면 데몬을 실행할 수 있는 여러 스크립트들이 있다. 이 중 start-dfs.sh는 HDFS 데몬을 모든 노드에 띄우는 스크립트이고, start-mapred.sh는 MapReduce의 JobTracker와 TaskTracker를 띄우는 스크립트이다.

[hadoop@alpha bin]$ start-dfs.sh
Warning: $HADOOP_HOME is deprecated.
 
starting namenode, logging to /opt/hadoop-1.0.4/data/log/hadoop-hadoop-namenode-alpha.centos.out
alpha.centos: starting datanode, logging to /opt/hadoop-1.0.4/data/log/hadoop-hadoop-datanode-alpha.centos.out
gamma.centos: starting datanode, logging to /opt/hadoop-1.0.4/data/log/hadoop-hadoop-datanode-gamma.centos.out
beta.centos: starting datanode, logging to /opt/hadoop-1.0.4/data/log/hadoop-hadoop-datanode-beta.centos.out
alpha.centos: starting secondarynamenode, logging to /opt/hadoop-1.0.4/data/log/hadoop-hadoop-secondarynamenode-alpha.centos.out
[hadoop@alpha bin]$
[hadoop@alpha conf]$ start-mapred.sh
Warning: $HADOOP_HOME is deprecated.
 
starting jobtracker, logging to /opt/hadoop-1.0.4/data/log/hadoop-hadoop-jobtracker-alpha.centos.out
gamma.centos: starting tasktracker, logging to /opt/hadoop-1.0.4/data/log/hadoop-hadoop-tasktracker-gamma.centos.out
alpha.centos: starting tasktracker, logging to /opt/hadoop-1.0.4/data/log/hadoop-hadoop-tasktracker-alpha.centos.out
beta.centos: starting tasktracker, logging to /opt/hadoop-1.0.4/data/log/hadoop-hadoop-tasktracker-beta.centos.out
[hadoop@alpha conf]$

한번에 띄우려면 start-all.sh를 실행하면 된다.

데몬 실행 중 암호같은 것을 묻는다면 ssh 인증키 공유가 잘 안된 것이므로 4단계를 다시 해 보자. 다른 문제가 없는 것같은데 NameNode에 계속 접속 시도한다는 로그가 있으면 NameNode의 방화벽 설정을 변경하자. 기타 오류로 인하여 데몬이 실행되지 않았다면 위 화면 상에 보이는 위치에 *.log 파일을 참조하여 수정하자.

제대로 데몬이 띄워졌다면 다음과 같이 확인해 볼 수 있다.

[hadoop@alpha conf]$ jps
23503 Jps
21953 SecondaryNameNode
23392 TaskTracker
21827 DataNode
23271 JobTracker
21706 NameNode

실행 중인 데몬을 중지시키고 싶으면 앞서 실행한 스크립트에서 "start"만 "stop"으로 바뀐 스크립트를 이용하면 된다. "끝"

저작자: Yes, 상업적 이용: No, 컨텐츠 변경: No

2012년 12월 10일 월요일

노트북에 분산환경을 위한 가상머신 구축하기 #3

새로운 가상머신 추가
지금까지 가상머신을 이용하여 노트북에 분산환경을 구축하기 위한 노드 하나에 대한 작업을 끝냈다. 3개의 노드를 만들겠다면 지금까지 했던 과정을 2번 반복하고 4개 만들겠다면 3번 반복하면 된다. 끝~
.
.
.
.
.
.
다시 하려니 막막하다. 다른 방법은 없을까? 있다!! VirtualBox에 복제라는 기능이 있다. 양이랑 개만 복제하는 줄 알았는데 가상머신도 복제할 수 있다. 이 기능을 이용하여 다른 노드는 쉽게 추가할 수 있다.
복제하고자 하는 가상머신을 선택하고 오른쪽 버튼을 누르면 "복제" 메뉴가 보인다. 과감히 선택하자. 다음과 같은 화면을 볼 수 있다.
복제해서 만들어질 가상머신의 이름을 입력하고 MAC 주소 초기화 옵션을 체크하자. "다음" 버튼을 누르면 복제방식을 선택하는 화면이 나타난다.
Deep하게 Copy하는 "완전한 복제"를 선택하고 복제를 시작하자.
복제 진행정도를 나타내는 프로그레스 바가 나오는데 전혀 믿을 수 없다. 10시간 넘게 기다리라고 하기도 한다. 취소하지 말고 기다리자. 수십분 안에 끝난다. 복제가 끝나면 이전에 없던 새로운 가상머신(beta.centos)이 만들어져 있다.
새로운 가상머신 네트워크 설정
만들어진 가상머신을 똑같이 복제하여 생성했기 때문에 두 가상머신의 시스템 설정이 똑같다. IP주소도 똑 같고, 호스트 명도 똑같고 모든 것이 다 똑같다. 이러한 설정들을 복제된 가상머신에 맞게 바꿔 줄 필요가 있다. 바꿀 설정값은 다음과 같다.
설정 작업
포트 포워딩 복제한 가상머신의 포트 포워딩 값을 그대로 가지고 있으므로 복제된 가상머신에 맞게 변경하기.
호스트명 변경 복제한 가상머신의 호스트 이름을 그대로 가지고 있으므로 이것도 변경해 주자.
MAC 주소 변경 복제된 가상머신의 네트워크 설정 파일의 MAC 주소를 새로 부여된 MAC 주소로 변경하기.
포트 포워딩
VirtualBox 관리자에서 가상머신의 설정 버튼을 누르고 네트워크 설정탭에 들어가 변경하면 된다. (노트북에 분산환경을 위한 가상머신 구축하기 #2 참고.)
호스트명 변경
이제 복제된 가상머신을 시작하자. 시작하면 다음 화면과 같이 가상머신의 호스트 이름이 복제한 가상머신과 같게 나오는 걸 볼 수 있다.
다음 명령을 이용하여 호스트 명을 변경하자.
[root@alpha ~]# hostname beta.centos
"/etc/sysconfig/network" 파일에서 HOSTNAME도 변경하자. 다시 로그인하면 바뀐 호스트명을 볼 수 있다.
MAC 주소 변경
내/외부 접속을 위하여 가상머신의 ifcfg-eth0, ifcfg-eth1 파일 내 MAC 주소를 변경해야 한다. VirtualBox의 가상머신 네트워크 설정화면에서 각 네트워크 어댑터의 MAC 주소를 보고 각 파일을 변경하자. 변경할 부분은 다음과 같다.
[root@beta ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="dhcp"
NM_CONTROLLED="yes"
ONBOOT=yes
TYPE="Ethernet"
HWADDR=08:00:27:79:0A:FB    <- 변경할 부분
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0"


[root@beta ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE="eth1"
BOOTPROTO="none"
NM_CONTROLLED="yes"
ONBOOT=yes
TYPE="Ethernet"
HWADDR=08:00:27:46:1B:5B    <- 변경할 부분
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth1"
NETMASK=255.255.255.255
IPADDR=192.168.70.12        <- 변경할 부분
GATEWAY=192.168.70.1
마지막으로
이런식으로 만들어 놓은 가상머신을 복제하고 설정을 변경함으로써 가상머신을 계속 만들 수 있다. 호스트 PC의 성능에 따라 만들 수 있는 가상머신의 개수는 차이가 있겠지만 3개 정도는 돌릴 수 있지 않을까 생각한다. 난 내 PC에 가상머신을 3개 만들어 테스트를 위한 분산환경을 구축해 놓았으며 다음과 같이 설정하였다.
번호 호스트 명 내부 IP
1 alpha.centos 192.168.70.11
2 beta.centos 192.168.70.12
3 gamma.centos 192.168.70.13
가상머신들을 이용항 Hadoop Cluster를 구성해서 사용 중이다. 조금 느린 듯 해도 분산환경에서 이것 저것 해 보기에 꽤 괜찮다.
저작자: Yes, 상업적 이용: No, 컨텐츠 변경: No

2012년 12월 9일 일요일

노트북에 분산환경을 위한 가상머신 구축하기 #2

CentOS 설치
좀 많이 찜찜하지만 가상머신에 OS 먼저 설치하자. 받은 CentOS 이미지 파일을 가상머신의 가상 CD/DVD에 넣고 "시작" 버튼을 누른다. 부팅 화면을 지나고 나면 다음과 같은 CentOS 설치화면이 나타난다. "Install or upgrade an existing system"을 선택하자.
Media를 테스트 할 건지 여부를 묻는 화면은 그냥 건너 뛰자.
"OK" 버튼을 누르면 설치를 시작한다.
메모리를 적게 지정하면 3D 영화를 넘어 4D가 나오는 세상인데 위와 같은 화면으로 설치를 해야 한다. 하지만 메모리를 충분히(1GB) 지정했기에 다음과 같은 설치화면이 나타난다.
설치 과정은 이미지로 대체. (순서: 왼쪽에서 오른쪽으로)
설치 과정 중 다음 화면은 좀 중요하기 때문에 크게 표시하였다. 뭐 하는데 중요하냐 하면, 어떤 툴들을 설치할지 정하는 화면이기 때문이다. "Software Development Workstation"으로 지정해야 개발에 필요한 툴들이 설치되기 때문에 꼭 이걸로 지정하자.
다시 또 왼쪽에서 오른쪽으로~
설치 끝!
1024MB로 잡아 놓은 메모리를 512MB로 내릴 예정이고 굳이 X-Window를 사용할 필요가 없기 때문에 초기화면을 변경할 필요가 있다. "프로그램 >> 시스템 도구 >> 터미널" 메뉴로 터미널을 실행하자. 터미널 화면에서 root로 사용자를 변경한 후 "/etc/inittab" 파일을 수정하자.
[TurboK@alpha ~]$ su
암호: (root 암호입력)
[root@alpha TurboK]# vi /etc/inittab
위 명령을 수행하면 터미널에 다음과 같은 화면이 나타날 것이다.
제일 아래 줄에 있는 "id: 5: initdefault:"을 "id: 3: initdefault:"으로 바꾸자. 그리고 나서 다시 부팅하면 다음과 같은 콘솔화면에 나타난다.
가상머신의 메모리도 512MB로 내리자.
CentOS 업데이트
최신 버전의 이미지를 받아 왔지만 업데이트 할 것들이 있다. root 권한으로 로그인 하고 다음 명령을 수행하자.
[root@alpha ~]# yum update
설치과정대로 했다면 그럴리가 없겠지만 혹시라도 네트워크 접속이 안돼서 update 할 수 없다고 하면 다음 파일을 확인해 보자.
[root@alpha ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="dhcp"
NM_CONTROLLED="yes"
ONBOOT=yes
TYPE="Ethernet"
UUID="cdbc86e4-6180-48b8-bb12-d0e9ff10a085"
HWADDR=08:00:27:46:B4:E4
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0"
[root@alpha ~]#
위 콘솔화면에서 "ONBOOT=yes" 값이 OS 설치 시 네트워크 설정을 따로 하지 않으면 "no"로 되어 있다. "no"로 되어 있다면 "yes"로 바꾸고 네트워크를 재시작하자.
[root@alpha ~]# service network restart
그래도 안된다면 호스트 PC가 인터넷에 접속할 수 있는 상태인지 체크해 보자.
굉장히 많은 Update가 기다리고 있다. 참고 기다리자. 다 참았다면 네트워크 설정으로 고고~
네트워크 설정
들어가기 전에 "브리지 어댑터"를 사용할 수 있는 경우라면 이 과정은 필요 없으므로, "/etc/sysconfig/network-scripts/ifcfg-eth0" 파일만 고정 IP주소를 갖도록 설정하고 넘어가자.
(Linux Newort 설정 참고.)
앞서 가상머신을 만들고 설정을 변경할 때 NAT로 설정하고 넘어가자고 했다. 그리고 NAT는 문제가 있는데 첫째 외부에서 접속하기 위하여 포트 포워딩해야 하고, 둘째 가상머신끼리 토킹하기 위하여 다른 네트워크를 설정해야 한다는 것이였다. 이제 이 설정들을 하려고 한다. ssh로 외부에서 접속해야 하니까 포트 포워딩 먼저 하자.
포트 포워딩
포트 포워딩이란 말 그대로 TCP/IP에서 사용하는 포트라는 애를 다른 데(포트)로 전달(포워딩)하는 것을 말한다. 네트워크 공유기 사용할 때 한 번쯤 써 봤을 지도 모르겠는데 거기 있는 거랑 똑같다. VirtualBox에서 포트 포워딩은 가상머신의 설정 대화상자에서 네트워크 탭에 있다. NAT로 설정했을 경우만 활성된다.
버튼을 누르면 다음과 같은 화면이 나타난다.
오른쪽에 있는 "+" 버튼을 눌러 행을 추가한 후 이름과 포트를 입력하면 된다. IP는 굳이 입력할 필요없다. 다음 그림은 호스트 PC의 2201번 포트로 들어오는 데이터를 가상머신의 22번 포트로 전달하도록 지정한 것이다.
왜 22번 포트로 포워딩 했느냐? ssh 접속을 위해서다. ssh설정을 바꾸지 않았다면 22번 포트를 이용하기 때문이다. 정리하면, 호스트 PC에서 putty와 같은 ssh client를 이용하여 127.0.0.1의 2201번 포트에 접속하면, 포트 포워딩을 통해 가상머신(alpha.centos)의 22번 포트로 접속할 수 있다.
가상머신에 구축한 웹서버에 접속하고 싶다면 마찬가지 방법으로 포트 포워딩을 지정하면 된다.
호스트 전용 네트워크 어댑터 추가
이제 가상머신끼리 통신할 수 있도록 해보자. VirtualBox의 NAT로는 보안 등을 이유로 가상머신끼리 통신할 수 없단다. 그렇다면 어떻게 해야 하나? 고민 고민하다가 든 생각! "네트워크 어댑터를 하나 더 달면 되지."
VirtualBox에서 제공하는 네트워크 기능 중에 "호스트 전용 네트워크"라는 것이 있다. 이것을 이용하면 호스트 PC 상에 있는 가상머신끼리 통신할 수 있다.
VirtualBox 관리자의 "파일 >> 환경설정" 메뉴를 실행하면 다음과 같은 설정창이 나타나고 네트워크 탭을 누르면 호스트 전용 네트워크로 사용할 어댑터를 추가할 수 있는 화면이 나타난다. "+" 버튼을 누르면 새로운 어댑터가 생성된다.
추가된 어댑터를 선택하고 드라이버 모양의 버튼을 눌려 네트워크 정보를 다음과 같이 입력하자.
DHCP 서버는 굳이 사용할 필요가 없다.
이제 가상머신에 네트워크 어댑터를 하나 더 달자. 다는 방법은 가상머신의 네트워크 설정창에 들어가 "어댑터 2" 탭을 선택하고 사용하도록 체크만 하면 끝.
체크하고 나서 "호스트 전용 어댑터"를 선택하고 "이름" 부분에 조금 전에 추가한 "VirtualBox Host-Only Ethernet Adapter #2"를 선택하자. 그리고 MAC 주소를 기억해 두자.
이제 할 일은 가상머신을 부팅해 네트워크 설정을 바꾸는 일이다. 가상머신을 부팅하고 접속하여 다음 파일을 새로 만들자.
[root@alpha ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth1
아무것도 없는 빈 화면이 나타날텐데 여기에 네트워크 정보를 다음과 같이 입력하자.
DEVICE="eth1"
BOOTPROTO="none"
HWADDR=00:00:00:00:00:00  <- 기억하자고 한 MAC 주소입력
ONBOOT="yes"
IPADDR=192.168.70.11
NETMASK=255.255.255.255
GATEWAY=192.168.70.1
TYPE=Ethernet
MAC 주소, IP 주소 등은 앞서 설정한 내용에 따라 달라질 수 있다. 다 했다면 네트워크 서비스를 재시작 하자.
[root@alpha ~]# service network restart
확인을 위한 지정한 GATEWAY에 Ping을 날려보자. 잘 날아가면 성공적으로 끝. 만약 안 날라간다면 뭔가 잘못 설정한 것이니 천천히 다시 잘 살펴 보자. 이렇게 찜찜함을 해결하면서 2부 끝~
저작자: Yes, 상업적 이용: No, 컨텐츠 변경: No