rhive tutorial supplement 1: rhive 튜토리얼 부록 1 - hadoop 설치
DESCRIPTION
RHive tutorial supplement 1: RHive 튜토리얼 부록 1 - Hadoop 설치 (한글판)TRANSCRIPT
RHive 튜토리얼 부록 1 - Hadoop 설치
RHive 튜토리얼- Hadoop 설치
이 튜토리얼에서는 Hadoop에 대한 지식이 많지 않은 사용자가 RHive를 설치하기에 앞서의 과정으로 필요한 Hadoop을 설치하는 방법에 대해서 간단하게 설명한다.
당연한 것이겠지만 Hive에 의존성을 가지고 있으며 Hive는 Hadoop에 의존성을 가지고 있다. 그렇기 때문에 RHive를 설치하기 위해서는 Hadoop과 Hive가 RHive를 설치하려는 환경에 이미 설치되어 있어야 한다.
이 튜토리얼에서 소개할 Hadoop 설치 방법은 RHive를 사용할 수 있도록 해주는 작은 Hadoop 환경을 구성하는 것이다. 이런 약식의 간단한 설치 방법은 클라우드서비스나 가상화기반의 인프라를의 VM(Virtual Machine)을 이용해서 작은 분산 처리 환경을 빠르게 만드는데 유용할 것이며, 반면에 크고 구조화된(well structured) 여러 사람을 위한 안정화된 복잡한 환경을 구축하려 한다면 적합하지 않을 수 있음을 미리 알려둔다.
Hadoop 설치
작업 환경
이 튜토리얼에서 사용한 환경은 다음과 같은 구성으로 이루어져있다.
• Server cluster environment: 클라우드 서비스 • Server 수: 총 4 virtual machines • Server 사양: 가상머신, 1 core, 1Gb main memory, 25Gb Harddisk for OS, 2TB additional harddisk
• OS: CentOS5 • Network: 10.x.x.x IP address
설치전에 확인할 사항
root 계정, firewall, SElinux 확인하기
Hadoop을 설치하기 위해 준비한 서버들에 root계정으로 접속이 가능하거나 sudo명령어로 root와 같은 시스템권한등급을 행사할 수 있도록 sudoer 권한을 획득한 상태여야 한다. 그리고 각각의 서버들에는 특별한 방화벽 설정이나 보안에 대한 설정이 없어야 하며 만약 그런것이 설정이 되어 있는 Linux를 사용한다면 그러한 설정을 제어할 수 있는 권한을 가지고 있거나 그에 대한 사용법에 대해 알고 있어야 한다.
SElinux나 firewall등이 작동하고 있으며 보안을 위해서 강력한 제한을 가지고 있다면 Hadoop과 관련된 port나 ACL(Access Control List)을 직접 설정해서 서버들간의 연결에 문제가 없도록 설정하거나 SELinux와 firewall을 아예 비활성화 할 필요가 있다. 이 튜토리얼에서는 외부와는 차단된 VM에 Hadoop을 설치하며 이것들은 다른 곳에서 접속이 가능하지 않도록 독립되어 있어 설치된 Linux에서 SELinux와 firewall을 통째로 비활성화하였다.
서버의 IP address 확인
자신이 사용할 서버들의 IP주소를 미리 알아 두어야 한다. 이 튜토리얼에서 사용하는 서버는 각기 아래와 같은 IP address를 가지고 있다.
10.1.1.1
10.1.1.2
10.1.1.3
10.1.1.4
이 튜토리얼에서는 10.1.1.1을 Hadoop name node로 만들 것이다. 그리고 10.1.1.2, 10.1.1.3, 10.1.1.4를 Hadoop의 Job node로 만들것이다.
Hadoop 설치전에 서버에 해 놓을 일
Hostname 설정
각 서버들의 /etc/hosts 파일을 수정해 놓을 필요가 있다. 이미 알고 있겠지만 이 파일들은 hostname과 IP address를 수동으로(manually) 맵핑하는 파일이다. 이렇게 하는 이유는 Hadoop 세팅을 편하게 하기 위해서 이며 이렇게 하면 Hadoop을 configuration을 설정할 때 편리하다.
다음과 같은 설정으로 모든 서버에 (4대의 서버) 접속해서 /etc/hosts 파일을 아래와 같은 라인을 모두 추가해 둔다.
10.1.1.1 node0
10.1.1.2 node1
10.1.1.3 node2
10.1.1.4 node3
node0 ~ node3은 임의로 지정한 hostname이며 기억하기 쉬운 이름이라면 상관없다. 하지만 Hadoop을 설치하고 가동시킨 후에는 변경하는 것이 매우 위험하므로 그에 대해서 고려할 필요가 있다.
Java설치
Hadoop은 Java로 작성되었으므로 당연히 JVM이 필요하다. Java는 대부분 Linux를 설치하고 나면 이미 설치가 되어 있으며, 만약 설치되어 있지 않다고 해도 매우 쉽게 설치할 수 있다. 여러분이 사용하는 서버에 Java가 설치되어 있지 않다면 아래의 명령어를 이용해 모든 서버에 설치한다. (CentOS5 기준)
yum install java
JAVA_HOME 환경변수 설정
JAVA_HOME 환경변수가 설정되어 있어야 한다. JAVA_HOME의 값에는 Java SDK나 JRE가 설치된 디렉토리를 지정해야 하는데, 사용하는 OS가 CentOS라면 아래 명령을 이용해서 알아낼 수 있다.
update-‐alternatives -‐-‐display java
이 튜토리얼에 사용하는 작업환경에서는 JAVA_HOME이 "/usr/lib/jvm/jre-1.6.0-openjdk.x86_64" 이다. JAVA_HOME의 경로는 사용자의 환경이나 설치된 Java의 버전에 따라 달라 질 수 있으므로 자신의 서버에서 정확한 JAVA_HOME을 알아내야 한다. 그에 대한 방법은 관련 Linux 배포판에 대한 문서를 참고하거나 Java 설치법에 대한 다른 문서를 참고하기 바란다.
사용자의 환경에 맞는 적절한 JAVA_HOME을 알아 냈다면 다음과 같이 /etc/profile 또는 ~/.bashrc 등에 JAVA_HOME 환경변수를 등록해 둔다.
JAVA_HOME=/usr/lib/jvm/jre-‐1.6.0-‐openjdk.x86_64/
export JAVA_HOME=/usr/lib/jvm/jre-‐1.6.0-‐openjdk.x86_64
당연히 Java를 설치하고 JAVA_HOME을 설정하는 작업은 Hadoop이 설치될 서버에 모두 공통으로 해야 한다.
Hadoop 다운로드
이제 Hadoop을 설치하기 시작할 것이다. Hadoop은 Java로 작성되어 있어 다운로드 받은 파일의 압축을 해제(uncompress)하는 것만으로도 설치가 완료된다. Hadoop-1.0.0 버전은 rpm과 deb로 패키징 된 것을 지원하기 때문에 압축을 해지 하지 않고 rpm이나 dpkg 등을 이용해서 설치가 가능하다. 하지만 Hive를 함께 사용한다면 Hive가 아직 Hadoop-1.0.0을 지원하지 않으므로 사용하지 않는 것이 좋다.
Hadoop을 설치하기 전에 Hadoop을 설치할 디렉토리를 먼저 만들어 두어야 한다. 다시말하면 압축을 해제할 적당한 디렉토리를 결정하고 생성해야 한다. 그리고 생성될 디렉토리는 공간이 충분한 Harddisk에 위치하도록 고려해야 한다. Hadoop은 작동하기 시작하면 로그 파일등을 만들어 내며 HDFS관리하면서 파일들을 저정하고 관리하기 위해서 많은 디스크 공간을 사용한다. 그렇기 때문에 Hadoop을 설치하려고 하는 디스크의 공간이 충분한지 확인하고 별도로 용량이 큰 추가의 하드디스크가 설치되어 있다면 어느곳에 마운트(mount) 되어 있는지 확인하고 그곳에 설치하는 것이 좋다. 이 튜토리얼에서는 각 2TB 이상의 하드디스크를 각 서버의 "/mnt"에 마운트를 만들어 놓았으며 그 하위에 "/mnt/srv" 디렉토리를 만들고 Hadoop을 그 디렉토리에 설치할 것이다. 이와 같은 디렉토리 구조도 역시 모든 서버에 동일하게 적용되는 것이 좋다.
아래와 같이 srv라는 임의의 디렉토리를 만든다.
mkdir /mnt/srv
cd /mnt/srv
위에서 지정한 베이스(base) 디렉토리 이하에 Hadoop을 설치할 것이다.
이제 Hadoop의 공식홈페이지에서 사용할 Hadoop version을 다운로드 한다. 이 튜토리얼에서는 0.20.203 버전을 사용하는 것을 권장한다. Hadoop의 각 버전들은 아래 사이트를 방문하여 다운로드 할 수 있다. http://www.apache.org/dyn/closer.cgi/hadoop/common/
동일한 버전을 모든 서버에 똑같이 설치해야 하므로 다운로드 받은 파일을 모든 서버에서 복사하거나 다운로드 받은 파일을 모든 서버에 복사하면 된다.
아래와 같이 서버에서 Hadoop의 최신 버전을 다운로드 받는다.
wget http://apache.tt.co.kr//hadoop/common/hadoop-‐0.20.203.0/hadoop-‐0.20.203.0rc1.tar.gz
다운로드 받은 파일의 압축을 해제한다.
tar xvfz hadoop-‐0.20.203.0rc1.tar.gz
하나의 서버에서 다운로드 받은 후 다른 서버에 일괄적으로 동일한 디렉토리를 만들고 파일을 복사하려면 다음과 같이 shell command를 이용해서 할 수 있다. shell command에 익숙하지 않다면 직접 수작업으로 개별서버에 모두 동일한 작업을 하면 된다.
$ for I in `seq 3`; do ssh node$I 'mkdir /mnt/srv' done
$ for I in `seq 3`; do scp hadoop*.gz node$I:/mnt/srv/; done
$ for I in `seq 3`; do ssh node$I 'cd /mnt/srv/; tar xvfz hadoop*.gz'; done
SSH key 설정
Hadoop의 namenode가 각각의 node를 제어할 수 있도록 하기 위해서 null passphrase key를 생성하고 세팅해야 한다. null passphrase key는 ssh의 key를 생성할 때 key의 패스워드를 물어보지 않도록 password를 입력하지 않는 것을 말하며 일반적으로 이것은 보안의 문제로 권장되지 않는 것이다. 하지만 보안시스템이 잘 구성된 안전한 환경내에서 각 서버들간의 접속을 자동화하기 위해서 많이 사용되는 방법이기도 하다. Hadoop은 namenode에서 각각의 서버에 접속해서 tasktracker를 실해하거나 datanode를 실행하는 작업을 하는데 이를 위해서는 이와 같이 null passphrase key를 이용해 password없이 특정한 계정으로 각각의 노드에 접속할 수 있도록 해 주어야 한다. 이 튜토리얼에서는 root계정으로 모든 서버에 각각 접속할 수 있도록 key를 생성하고 설정할 것이다. 더불어 root 계정의 null passphrase key를 생성하는것은 아주 위험한 것이므로 네트워크가 외부와 완전히 차단되어 있지 않다면 사용하지 않는 것이 좋다. null passphrase key를 생성하기 위해서 아래의 명령어로 비밀번호를 물어보지 않는 ssh의 private key와 public key를 생성한다.
ssh-‐keygen \-‐t rsa \-‐P '' \-‐f \~/.ssh/id_rsa
이제 public key를 authorized_keys에 등록한다.
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
이제 아래 명령어로 password를 입력하지 않고 localhost에 ssh로 접속이 가능한지 확인해 본다.
ssh localhost
비밀번호를 물어보지 않고 자동 로긴 되면 완료된 것이다. 이제 접속된 localhost에서 빠져 나온다.
exit
만약 openssh와 key가 제대로 생성되었음에도 불구하고 위와 같이 하였는데도 접속에 성공하지 못했거나 password를 물어보는 prompt를 보게 된다면 sshd의 설정을 확인해 보고 수정을 해야 할 수 있다. 이런 경우 sshd의 설정을 살펴보고 세팅을 변경해 줘야 할 수 있다. sshd의 설정 파일의 경로는 보통 "/etc/ssh/sshd_config" 텍스트 편집기로 수정해서 설정을 고칠 수 있다. 자신에게 익숙한 편집기를 사용해서 sshd_config 파일을 수정한다.
vi /etc/ssh/sshd_config
많은 configuration 값들이 파일안에 있지만 주로 확인해 봐야할 것은 아래와 같은 설정값들이다. 아래의 코드 줄이 비활성화되어 있다면 (줄의 맨 앞에 #이 붙어 있거나 파일의 안에 내용이 존재하지 않는 경우) 아래와 같은 내용을 넣어주거나 수정하고 저장한 후 편집기를 종료(quit)한다.
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
설정파일을 고치고도 localhost에 ssh로 password를 입력하지 않고 접속할 수 없다면 시스템관리자에게 문의하거나 sshd의 설정에 대해서 따로 관련 자료를 참조한다.
이제 만들어 둔 key파일의 public key를 다른 서버들의 ~/.ssh/authorized_keys에 넣어주어야 한다. 원래는 ~/.ssh/id_rsa.pub 파일을 다른 서버들에 복사한 후에 authorized_keys에 추가해 주어야 하지만 이 튜토리얼에서는 편의상 name node에 있는 authorized_keys를 다른 서버에 복사할 것이다. 아래와 같이 전체 복사한다.
$ for I in `seq 3`; do scp ~/.ssh/id_rsa.pub node$I:~/.ssh/; done
Hadoop 환경설정 수정하기
Hadoop이 설치되었으면 Hadoop의 환경설정을 해야 한다. 환경설정 디렉토리로 이동해도 몇개의 파일을 고쳐야만 한다. 이 튜토리얼에서는 hadoop-env.sh, core-site.xml, mapred-site.xml, hdfs-site.xml 라는 총 4개의 파일을 수정할 것이다.
Hadoop conf 디렉토리로 이동
먼저 설치된 Hadoop의 conf 디렉토리로 작업 디렉토리를 변경한다.
cd /mnt/srv/hadoop-‐0.20.203.0/conf
hadoop-env.sh 수정
텍스트편집기를 열어 hadoop-env.sh의 내용을 수정한다.
vi hadoop-‐env.sh
아래의 내용을 찾아 자신이 설정한 디렉토리와 JAVE_HOME을 고쳐주어야 한다.
export JAVA_HOME=/usr/java/default
export HADOOP_LOG_DIR=/mnt/srv/hadoopdata/data/logs
JAVA_HOME은 이 튜토리얼의 앞서 과정에서 알아낸 JAVA_HOME을 동일하게 세팅하면 된다. HADOOP_LOG_DIR은 Hadoop의 log가 저장될 디렉토리로 공간이 충분한 곳을 지정해 두는 것이 좋다. 우리는 /mnt/srv/hadoopdata/data/logs 라는 디렉토리를 사용하도록 할 것이다.
core-site.xml 수정
텍스트 편집기로 core-sie.xml을 오픈한다.
vi core-‐site.xml
파일의 내용중에 fs.default.name과 hadoop.tmp.dir를 적당한 값으로 수정한다.
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://node0:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/mnt/srv/hadoopdata/hadoop-‐${user.name}</value>
<description>A base for other temporary
directories.</description>
</property>
</configuration>
hdfs-site.xml 수정하기
hdfs-site.xml은 수정할 필요가 없다. 하지만 수정할 것이 필요하다면 core-site.xml 파일과 마찬가지로 텍스트 편집기로 오픈해서 설정값을 바꿀 수 있다. 텍스트 편집기로 hdfs-site.xml 파일을 오픈한다.
vi hdfs-‐site.xml
만약 Hadoop이 동시에 오픈할 파일 개수를 늘리고 싶다면 아래와 같이 설정값을 바꿀 수 있다.
<configuration> <property> <name>dfs.datanode.max.xcievers</name> <value>4096</value> </property>
</configuration>
위 부분은 옵션이므로 반드시 해야 하는 것은 아니다.
mapred-site.xml 수정하기
vi와 같은 text editor로 mapred-site.xml를 오픈한다.
vi mapred-‐site.xml
파일을 열어서 내용을 확인해 보면 다음과 유사한 내용을 볼 수 있을 것이며 이 설정중에 mapred.job.tracker 부분에 value를 자신의 환경에 맞도록 설정한다. 나머지는 default를 사용하거나 자신에게 맞는 설정으로 변경하면 된다.
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>node0:9001</value>
</property>
<property>
<name>mapred.jobtracker.taskScheduler</name>
<value>org.apache.hadoop.mapred.FairScheduler</value>
</property>
<property>
<name>mapred.tasktracker.map.tasks.maximum</name>
<value>6</value>
</property>
<property>
<name>mapred.tasktracker.reduce.tasks.maximum</name>
<value>6</value>
</property>
<property>
<name>mapred.child.java.opts</name>
<value>-‐Xmx2048M</value>
</property>
<property>
<name>mapred.reduce.tasks</name>
<value>16</value>
</property>
<property>
<name>mapred.task.timeout</name>
<value>3600000</value>
</property>
</configuration>
Hadoop 가동 시키기
Hadoop 작동 여부 확인하기
Hadoop 설치 후에 웹브라우저를 이용해서 Hadoop의 상태를 확인할 수 있는 webpage에 접속할 수 있다. 보통은 50030의 port에서 서비스하고 있다.
http://node0:50030/
웹페이지에서 아래와 같이 State가 "RUNNING"이라는 메세지를 본다면 Hadoop이 정상적으로 작동하고 있는 것이다.
node0 Hadoop Map/Reduce Administration
Quick Links State: RUNNING
Started: Thu Jan 05 17:24:18 EST 2012
Version: 0.20.203.0, r1099333
Compiled: Wed May 4 07:57:50 PDT 2011 by oom
Identifier: 201201051724
위의 페이지는 Hadoop namenode가 방화벽 안쪽에 있고 50030가 오픈되어 있지 않다면 당연히 접속할 수 없다.
MRbench 실행해 보기
Hadoop은 기본적으로 몇개의 유용한 유틸리티를 제공한다. 그 중에 hadoop-test-*을 이용해서 맵/리듀스 작업을 쉽게 확인해 볼 수 있다. 이 튜토리얼에서 사용하는 Hadoop 버전은 0.20.203.0 이므로 Hadoop home 디렉토리에 hadoop-test-0.20.203.0.jar 파일이 존재해야 하며 이 유틸리티를 이용해서 Hadoop의 Map/Reduce가 작동하는지 다음과 같은 명령으로 확인한다.
$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-‐test-‐0.20.203.0.jar mrbench
위 명령의 수행 결과는 다음과 같다.
MRBenchmark.0.0.2
11/12/07 13:15:36 INFO mapred.MRBench: creating control file: 1 numLines, ASCENDING sortOrder
11/12/07 13:15:36 INFO mapred.MRBench: created control file: /benchmarks/MRBench/mr_input/input_-‐1026698718.txt
11/12/07 13:15:36 INFO mapred.MRBench: Running job 0: input=hdfs://node0:9000/benchmarks/MRBench/mr_input output=hdfs://node0:9000/benchmarks/MRBench/mr_output/output_1220591687
11/12/07 13:15:36 INFO mapred.FileInputFormat: Total input
paths to process : 1
11/12/07 13:15:37 INFO mapred.JobClient: Running job: job_201112071314_0001
11/12/07 13:15:38 INFO mapred.JobClient: map 0% reduce 0%
11/12/07 13:15:55 INFO mapred.JobClient: map 50% reduce 0%
11/12/07 13:15:58 INFO mapred.JobClient: map 100% reduce 0%
11/12/07 13:16:10 INFO mapred.JobClient: map 100% reduce 100%
11/12/07 13:16:15 INFO mapred.JobClient: Job complete: job_201112071314_0001
11/12/07 13:16:15 INFO mapred.JobClient: Counters: 26
11/12/07 13:16:15 INFO mapred.JobClient: Job Counters
11/12/07 13:16:15 INFO mapred.JobClient: Launched reduce tasks=1
11/12/07 13:16:15 INFO mapred.JobClient: SLOTS_MILLIS_MAPS=22701
11/12/07 13:16:15 INFO mapred.JobClient: Total time spent by all reduces waiting after reserving slots (ms)=0
11/12/07 13:16:15 INFO mapred.JobClient: Total time spent by all maps waiting after reserving slots (ms)=0
11/12/07 13:16:15 INFO mapred.JobClient: Launched map tasks=2
11/12/07 13:16:15 INFO mapred.JobClient: Data-‐local map tasks=2
11/12/07 13:16:15 INFO mapred.JobClient: SLOTS_MILLIS_REDUCES=15000
11/12/07 13:16:15 INFO mapred.JobClient: File Input Format Counters
11/12/07 13:16:15 INFO mapred.JobClient: Bytes Read=4
11/12/07 13:16:15 INFO mapred.JobClient: File Output Format Counters
11/12/07 13:16:15 INFO mapred.JobClient: Bytes Written=3
11/12/07 13:16:15 INFO mapred.JobClient: FileSystemCounters
11/12/07 13:16:15 INFO mapred.JobClient: FILE_BYTES_READ=13
11/12/07 13:16:15 INFO mapred.JobClient: HDFS_BYTES_READ=244
11/12/07 13:16:15 INFO mapred.JobClient: FILE_BYTES_WRITTEN=63949
11/12/07 13:16:15 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=3
11/12/07 13:16:15 INFO mapred.JobClient: Map-‐Reduce Framework
11/12/07 13:16:15 INFO mapred.JobClient: Map output materialized bytes=19
11/12/07 13:16:15 INFO mapred.JobClient: Map input records=1
11/12/07 13:16:15 INFO mapred.JobClient: Reduce shuffle bytes=19
11/12/07 13:16:15 INFO mapred.JobClient: Spilled Records=2
11/12/07 13:16:15 INFO mapred.JobClient: Map output bytes=5
11/12/07 13:16:15 INFO mapred.JobClient: Map input bytes=2
11/12/07 13:16:15 INFO mapred.JobClient: Combine input records=0
11/12/07 13:16:15 INFO mapred.JobClient: SPLIT_RAW_BYTES=240
11/12/07 13:16:15 INFO mapred.JobClient: Reduce input records=1
11/12/07 13:16:15 INFO mapred.JobClient: Reduce input groups=1
11/12/07 13:16:15 INFO mapred.JobClient: Combine output records=0
11/12/07 13:16:15 INFO mapred.JobClient: Reduce output records=1
11/12/07 13:16:15 INFO mapred.JobClient: Map output records=1
DataLines Maps Reduces AvgTime (milliseconds)
1 2 1 39487
여기까지의 과정이 에러없이 수행되었다면 Hadoop이 정상적으로 작동했다는 것을 알 수 있다. 이제 여러분 각자의 Map/Reduce 구현체를 작성해서 Hadoop을 이용해서 분산처리를 할 수 있을 것이다. 다만 Hadoop으로만 구성된 환경에서 R로 Map/Reduce 구현체를 작성하기 위해서는 다른 addon 소프트웨어들을 설치하거나 Hadoop streaming방식으로 script를 작성해야 한다. 그리고 Hadoop만을 이용해 HDFS상의 파일들을 관리하려면 GUI방식의 client를 아직은 지원하지 않기 때문에 CLI(Command
Line Interface)에 능숙해야 하며 좀더 세련된 기능을 원한다면 Hive와 PIG와 같은 추가 솔루션을 설치하는 것이 바람직하다.