1. 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를 사용한다면 그러한 설정을 제어할 수 있는
권한을 가지고 있거나 그에 대한 사용법에 대해 알고 있어야 한다.
2. 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을 설치하고 가동시킨 후에는 변경하는 것이 매우 위험하므로 그에
대해서 고려할 필요가 있다.
3. 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을 지원하지 않으므로
사용하지 않는 것이 좋다.
4. 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에 익숙하지 않다면 직접 수작업으로 개별서버에 모두 동일한 작업을
하면 된다.
5. $
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
6. 만약 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개의 파일을 수정할 것이다.
7. 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
8. 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>
9. </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에서 서비스하고 있다.
10. 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_12
20591687
11/12/07
13:15:36
INFO
mapred.FileInputFormat:
Total
input
11. 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
12. 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