레이블이 HDFS인 게시물을 표시합니다. 모든 게시물 표시
레이블이 HDFS인 게시물을 표시합니다. 모든 게시물 표시

2013년 1월 19일 토요일

HDFS 셀 명령

Hadoop Homepage에 있는 문서 "File System Shell Guide"를 참고하여 작성하였음!
들어가기
HDFS(Hadoop Distributed File System)는 Linux의 i-node나 Windows의 FAT과 같은 파일을 저장하고 관리, 활용하기 위한 시스템이다. 다른 파일 시스템과 크게 다른 점은 여러 컴퓨터에 파일내용을 나누어 저장한다는 것이다. HDD에서의 i-node나 FAT의 개념을 컴퓨터로 확장해 보면 개념적으로는 HDFS와 거의 같아 보인다. 사용하기 위한 명령도 Linux 명령과 매우 흡사하다.
HDFS 명령 기본형식
HDFS 명령의 기본 형식은 다음과 같다.
[hadoop@alpha ~]$ hadoop fs -[command] [args]
 or
[hadoop@alpha ~]$ hadoop dfs -[command] [args]
"hadoop dfs"가 항상 앞에 붙고 뒤에 명령어(command)가 온다. [command] 앞에 "-" 오타가 아니다. 명령어는 항상 "-"로 시작하기 때문에 명시적으로 표시하였다.
끝에는 명령을 수행하는데 필요한 인수들이 위치한다. HDFS의 모든 명령은 인수(args)로 파일 혹은 파일경로를 가지며, 이들은 URI 형태로 정의된다.
URI
URI(Uniform Resource Identifier)는 말그대로 동일한 리소스를 유일하게 정의하고 식별하기 위한 규약으로 다음과 같은 형태를 가진다.
scheme://authority/path
크게 scheme, authority, path 세 부분으로 구성되며, HDFS 명령의 인수로 사용 시, 각 부분은 HDFS와 Local File System을 나타내기 위하여 다음과 같이 정의된다.
URI HDFS Local FS
scheme 문자열 "hdfs" 문자열 "file"
authority hostname:post (지정안함)
path Linux 파일경로와 동일하게 지정
Exmaple hdfs://alpha.centos:8020/data/README.txt file:///opt/hadoop-1.0.4/README.txt
HDFS의 authority에서 기본 포트를 이용하고 있다면 port는 지정할 필요가 없다. scheme와 authority은 생략가능하며, 생략했을 경우 명령을 수행하는 머신의 설정을 참고한다.
HDFS 셀 명령
이젠 HDFS의 셀 명령에 대하여 본격적으로 알아 보자.
명령어 설명
cat hadoop dfs -cat URI [URI ...]
지정한 파일(들)을 화면에 표시한다.
chgrp hadoop dfs -chgrp [-R] GROUP URI [URI ...]
지정한 파일의 group을 변경한다. 단, 파일의 소유자이거나 슈퍼유저만 변경 가능하다. "-R" 옵션을 붙이면 하위 디렉토리들도 재귀적으로 그룹이 변경된다.
chmod hadoop dfs -chmod [-R] MODE URI [URI ...]
지정한 파일의 권한(Permission)을 변경한다. 파일의 소유자이거나 슈퍼유저만 변경 가능할 수 있으며, "-R" 옵션을 붙이면 하위 디렉토리들도 재귀적으로 권한이 변경된다. MODE는 Linux 명령의 chmod와 똑 같이 지정하면 된다.
chown hadoop dfs -chown [-R] [OWNER][:[GROUP]] URI [URI ...]
슈퍼유저만 사용할 수 있는 파일의 소유자를 변경하는 명령이다. "-R" 옵션을 붙이면 하위 디렉토리들도 재귀적으로 소유자가 변경된다.
copyFromLocal hadoop dfs -copyFromLocal <localsrc> URI
지정한 로컬 파일을 HDFS로 복사한다.
copyToLocal hadoop dfs -copyToLocal [-ignorecrc] [-crc] URI <localdst>
지정한 HDFS 내 파일을 로컬 파일로 복사한다. "-ignorecrc" 옵션을 지정하면 CRC 체크를 실패하더라도 복사해 온다. CRC도 복사해 오고 싶으면 "-crc" 옵션을 사용한다.
count hadoop dfs -count [-q] <path> [path ...]
지정한 디렉토리(들) 내에 있는 디렉토리 개수, 파일 개수, 파일 크기, 디렉토리 명을 순서대로 표시한다. "-q" 옵션은 할당량(quota)에 대한 정보를 추가로 표시한다. QUOTA, REMAINING_QUATA, SPACE_QUOTA, REMAINING_SPACE_QUOTA 값들이 앞쪽에 붙여 나온다.
(왜 이름이 count인지 모르겠다.)
cp hadoop dfs -cp URI [URI ...] <dest>
지정한 파일(들)을 복사한다. 여러 파일이 지정된다면 <dest>는 디렉토리이어야 한다.
du hadoop dfs -du [-s] [-h] URI [URI ...]
지정한 디렉토리에 있는 파일과 디렉토리의 크기를 표시한다. 디렉토리의 경우 디렉토리 내 포함된 파일 및 서브 디렉토리의 크기를 모두 합한 값이 표시된다.
-s 옵션은 표시된 파일의 총크기를 표시한다.
-h 옵션은 사용자 친화적 형태로 크기를 표시한다. (67108864를 64.0m 표시)
※ 1.0.4에서 -s와 -h는 지원하지 않는 듯~
dus hadoop dfs -dus <arg>
지정한 디렉토리 내 파일, 서브 디렉토리의 크기를 모두 더한 값이 표시된다.
expunge hadoop dfs -expunge
휴지통을 비운다. 휴지통에 대한 자세한 내용은 HDFS Architecture Guide 참고.
get hadoop dfs -get [-ignorecrc] [-crc] <src> <localdst>
HDFS 내 지정된 파일을 로컬 파일로 복사한다. copyToLocal 명령과 유사하다.
-ignorecrc 옵션은 CRC 체크를 실패하더라도 파일을 복사해 온다.
파일과 CRC를 복사하려면 "-crc" 옵션을 이용한다.
getmerge hadoop dfs -getmerge <src> <localdst> [addnl]
지정한 HDFS의 디렉토리 내 모든 파일을 붙여 localdst에 저장한다. addnl을 지정하면 저장 시 파일 사이에 addnl에 지정한 문자(열)가 추가로 붙는다.
ls hadoop dfs -ls URI [URI ...]
지정한 HDFS 디렉토리(들)에 포함된 파일, 디렉토리 목록을 표시한다. Linux의 "ls -l" 명령과 비슷하다.
lsr hadoop dfs -lsr URI [URI ...]
ls의 recusive 버전. Linux의 "ls -Rl" 명령과 비슷하다.
mkdir hadoop dfs -mkdir URI [URI ...]
지정한 경로대로 디렉토리를 생성한다. "/data/text" 디렉토리를 생성하려고 할 때 "/data" 디렉토리가 없다면 생성 후 "/data/text"를 생성한다. Linux의 "mkdir -p ..."와 비슷하게 동작한다.
moveFromLocal hadoop dfs -moveFromLocal <localsrc> <dst>
복사 후 파일을 삭제하는 것을 제외하면 put 명령과 동일하다.
put hadoop dfs -put <localsrc> ... <dst>
로컬 PC 내 지정된 파일(들)을 HDFS로 복사한다. 여러 파일을 지정할 경우 <dst>은 디렉토리를 저징해야 한다.
rm hadoop dfs -rm [-skipTrash] URI [URI ...]
지정한 파일(들)을 지운다. 디렉토리를 지우려면 rmr 명령을 이용, 이 명령은 파일에만 가능하다.
"-skipTrash" 옵션을 지정하면 휴지통에 넣지 않고 바로 삭제한다.
rmr hadoop dfs -rmr [-skipTrash] URI [URI ...]
Recursive한 rm 버전이다. 디렉토리를 지정하면 포함된 모든 내용을 지우고 지정한 디렉토리도 지운다.
"-skipTrash" 옵션을 지정하면 휴지통에 넣지 않고 바로 삭제한다.
setrep hadoop dfs -setrep Number [-R] <path>
지정한 파일의 Replication Factor(복제 개수)를 변경한다.
"-R" 옵션을 지정하면 recursive하게 동작한다.
stat hadoop dfs -stat URI [URI ...]
지정한 디렉토리의 통계정보를 표시한다. 그런데 실제로 해보면 뭔가 좀 이상하다.
tail hadoop dfs -tail [-f] URI
지정한 파일의 마지막 1KB를 화면에 표시한다. "-f" 옵션은 Linux의 "tail -f ..."와 같다.
test hadoop dfs -test -[ezd] URI
"-e" 옵션: 지정한 파일이 존재한다면 0을 반환.
"-z" 옵션: 파일 크기가 0이라면 0을 반환.
"-d" 옵션: 지정한 파일이 디렉토리라면 0을 반환.
text hadoop dfs -text <src>
지정한 파일을 텍스트 형태로 화면에 표시한다. zip과 텍스트 형태만 사용할 수 있다.
touchz hadoop dfs -touchz URI [URI ...]
크기가 0인 파일을 생성한다.
명령 실행 샘플
말로만 하면 잘 안 와 닿는다. 직접 해 보는 것이 최고다. 다음은 Hadoop을 "/opt/hadoop-1.0.4"에 설치 후 셀 명령을 실행해 본 결과이다.
[hadoop@alpha hadoop-1.0.4]$ ls -l
합계 7524
-rw-rw-r--.  1 hadoop hadoop  446999 2012-10-03 14:17 CHANGES.txt
-rw-rw-r--.  1 hadoop hadoop   13366 2012-10-03 14:17 LICENSE.txt
-rw-rw-r--.  1 hadoop hadoop     101 2012-10-03 14:17 NOTICE.txt
-rw-rw-r--.  1 hadoop hadoop    1366 2012-10-03 14:17 README.txt
. . . (중략) . . .
drwxr-xr-x.  7 hadoop hadoop    4096 2013-01-11 21:47 docs
-rw-rw-r--.  1 hadoop hadoop    6840 2012-10-03 14:17 hadoop-ant-1.0.4.jar
-rw-rw-r--.  1 hadoop hadoop     410 2012-10-03 14:17 hadoop-client-1.0.4.jar
-rw-rw-r--.  1 hadoop hadoop 3928530 2012-10-03 14:17 hadoop-core-1.0.4.jar
-rw-rw-r--.  1 hadoop hadoop  142452 2012-10-03 14:17 hadoop-examples-1.0.4.jar
-rw-rw-r--.  1 hadoop hadoop     413 2012-10-03 14:17 hadoop-minicluster-1.0.4.jar
-rw-rw-r--.  1 hadoop hadoop 2656646 2012-10-03 14:17 hadoop-test-1.0.4.jar
-rw-rw-r--.  1 hadoop hadoop  287807 2012-10-03 14:17 hadoop-tools-1.0.4.jar
drwxr-xr-x.  2 hadoop hadoop    4096 2013-01-11 21:47 ivy
. . . (중략) . . .
drwxr-xr-x.  9 hadoop hadoop    4096 2012-10-03 14:17 webapps
[hadoop@alpha hadoop-1.0.4]$ hadoop dfs -mkdir /data/text
[hadoop@alpha hadoop-1.0.4]$ hadoop dfs -copyFromLocal *.txt /data/text
[hadoop@alpha hadoop-1.0.4]$ hadoop dfs -ls /data/text
Found 4 items
-rw-r--r--   3 hadoop supergroup     446999 2013-01-25 22:41 /data/text/CHANGES.txt
-rw-r--r--   3 hadoop supergroup      13366 2013-01-25 22:41 /data/text/LICENSE.txt
-rw-r--r--   3 hadoop supergroup        101 2013-01-25 22:41 /data/text/NOTICE.txt
-rw-r--r--   3 hadoop supergroup       1366 2013-01-25 22:41 /data/text/README.txt
[hadoop@alpha hadoop-1.0.4]$ hadoop dfs -mkdir /data/bin
[hadoop@alpha hadoop-1.0.4]$ hadoop dfs -copyFromLocal *.jar /data/bin
[hadoop@alpha hadoop-1.0.4]$ hadoop dfs -ls /data/bin
Found 7 items
-rw-r--r--   3 hadoop supergroup       6840 2013-01-25 23:21 /data/bin/hadoop-ant-1.0.4.jar
-rw-r--r--   3 hadoop supergroup        410 2013-01-25 23:21 /data/bin/hadoop-client-1.0.4.jar
-rw-r--r--   3 hadoop supergroup    3928530 2013-01-25 23:21 /data/bin/hadoop-core-1.0.4.jar
-rw-r--r--   3 hadoop supergroup     142452 2013-01-25 23:21 /data/bin/hadoop-examples-1.0.4.jar
-rw-r--r--   3 hadoop supergroup        413 2013-01-25 23:21 /data/bin/hadoop-minicluster-1.0.4.jar
-rw-r--r--   3 hadoop supergroup    2656646 2013-01-25 23:21 /data/bin/hadoop-test-1.0.4.jar
-rw-r--r--   3 hadoop supergroup     287807 2013-01-25 23:21 /data/bin/hadoop-tools-1.0.4.jar
[hadoop@alpha hadoop-1.0.4]$ hadoop dfs -count /data/text
           1            4             461832 hdfs://alpha.centos:8020/data/text
[hadoop@alpha hadoop-1.0.4]$ hadoop dfs -count /data/bin
           1            7            7023098 hdfs://alpha.centos:8020/data/bin
[hadoop@alpha hadoop-1.0.4]$ hadoop dfs -count /data
           3           11            7484930 hdfs://alpha.centos:8020/data
[hadoop@alpha hadoop-1.0.4]$ hadoop dfs -count -q /data
        none             inf            none             inf            3           11            7484930 hdfs://alpha.centos:8020/data
[hadoop@alpha hadoop-1.0.4]$ hadoop dfs -cat /data/text/NOTICE.txt
This product includes software developed by The Apache Software
Foundation (http://www.apache.org/).
[hadoop@alpha hadoop-1.0.4]$ hadoop dfs -chmod 666 /data/text/NOTICE.txt
[hadoop@alpha hadoop-1.0.4]$ hadoop dfs -ls /data/text
Found 4 items
-rw-r--r--   3 hadoop supergroup     446999 2013-01-25 22:41 /data/text/CHANGES.txt
-rw-r--r--   3 hadoop supergroup      13366 2013-01-25 22:41 /data/text/LICENSE.txt
-rw-rw-rw-   3 hadoop supergroup        101 2013-01-25 22:41 /data/text/NOTICE.txt
-rw-r--r--   3 hadoop supergroup       1366 2013-01-25 22:41 /data/text/README.txt
[hadoop@alpha hadoop-1.0.4]$ hadoop dfs -du /data
7023098     hdfs://alpha.centos:8020/data/bin
461832      hdfs://alpha.centos:8020/data/text
[hadoop@alpha hadoop-1.0.4]$ hadoop dfs -dus /data
hdfs://alpha.centos:8020/data   7484930
[hadoop@alpha hadoop-1.0.4]$ mkdir test
[hadoop@alpha hadoop-1.0.4]$ cd test
[hadoop@alpha test]$ hadoop dfs -getmerge /data/text/ ./MERGED.txt "\n\n\n"
13/01/27 00:41:32 INFO util.NativeCodeLoader: Loaded the native-hadoop library
[hadoop@alpha test]$ ls -l
합계 456
-rwxrwxrwx. 1 hadoop hadoop 461832 2013-01-27 00:41 MERGED.txt
[hadoop@alpha test]$ 
저작자: 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