Introduction
하둡을 공부하기 위하여 설치해보자.
연습을 실전 같이! 완전분산(Fully distributed) 모드로 설치한다.
호스트 |
아이피 |
역할 |
코어/메모리 |
hadoop-01 | 192.168.153.10 | NameNode | 1 코어 / 1 GB |
hadoop-02 |
192.168.153.11 |
Secondary NameNode / DataNooe |
1 코어 / 1 GB |
hadoop-03 | 192.168.153.12 | DataNode | 1 코어 / 1 GB |
hadoop-04 | 192.168.153.xxx | DataNode | 1 코어 / 1 GB |
하둡 실행 계정 생성
하둡 실행 계정은 하둡 클러스터를 구성하는 모든 서버에 동일하게 생성해야 한단다. (정말? 실화야?)
"hadoop" 계정을 사용하도록하겠다. 각 서버에 생성하자.
root@hadoop-01:~# adduser hadoop
root@hadoop-02:~# adduser hadoop
root@hadoop-03:~# adduser hadoop
호스트 파일 수정
IP를 직접 사용해도 되지만 호스트명을 사용하자. 각 서버에서 /etc/hosts 파일을 아래와 같이 수정한다.
※ 물론 이 작업을 수행하는 나의 컴퓨터에도 호스트 파일 수정 작업이 되어 있어야 한다.
root@hadoop-01:~# vi /etc/hosts
127.0.0.1 localhost
192.168.153.10 hadoop-01
192.168.153.11 hadoop-02
192.168.153.12 hadoop-03
root@hadoop-02:~# vi /etc/hosts
root@hadoop-03:~# vi /etc/hosts
인코딩 방식 설정
하둡은 인코딩 방식으로 UTF-8을 사용한단다... 다행이 우분투는 기본적으로 UTF-8 사용해서 천만 다행 -_-/
방화벽 해제
어차피 내부통신에다 연습용이니 다 해제!
root@hadoop-01:~# ufw disable
root@hadoop-02:~# ufw disable
root@hadoop-03:~# ufw disable
자바 설치
Oracle JDK 1.7 을 설치 하도록 하겠다.
http://ubuntuhandbook.org/index.php/2014/02/install-oracle-java-6-7-or-8-ubuntu-14-04/
Oracle JDK 7 을 설치 했을 시에 설치되는 위치는 "/usr/lib/jvm/java-7-oracle" 이다.
하둡 클러스터를 위한 SSH 설정
마스터 노드는 클러스터에 위치한 다른 모든 노드들에 접근할 수 있어야 한다. 하둡은 이러한 접근을 위해 SSH를 사용한다.
마스터 노드(hadoop-01)에서 쌍으로 이루어진 SSH 키를 생성한다.
hadoop@hadoop-01:~$ pwd
/home/hadoop
hadoop@hadoop-01:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa): [Enter]
Created directory '/home/hadoop/.ssh'.
Enter passphrase (empty for no passphrase): [Enter]
Enter same passphrase again: [Enter]
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:
c5:f5:5b:3a:83:13:1b:9b:07:2c:dc:11:34:3d:a9:41 hadoop@hadoop-01
The key's randomart image is:
...
생성된 공개키를 다른 서버에 복사한다.
ssh-copy-id -i [복사할 공개키 경로] [대상 서버 계정]@[대상 서버]
hadoop@hadoop-01:~$ ssh-copy-id -i /home/hadoop/.ssh/id_rsa.pub hadoop@hadoop-02
The authenticity of host 'hadoop-02 (192.168.153.11)' can't be established.
ECDSA key fingerprint is 28:1a:ab:fa:2d:a8:e0:c8:5b:ef:f7:ff:74:69:45:96.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
hadoop@hadoop-02's password: [SSH 비밀번호 입력]
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'hadoop@hadoop-02'"
and check to make sure that only the key(s) you wanted were added.
hadoop@hadoop-01:~$ ssh-copy-id -i /home/hadoop/.ssh/id_rsa.pub hadoop@hadoop-03
hadoop@hadoop-01:~$ ssh-copy-id -i /home/hadoop/.ssh/id_rsa.pub hadoop@hadoop-01
하둡 다운로드 및 압축 해제
현재 최신 버전은 1.2.1 이다.
hadoop@hadoop-01:~$ pwd
/home/hadoop
hadoop@hadoop-01:~$ wget https://archive.apache.org/dist/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz
압축 해제!
hadoop@hadoop-01:~$ tar xvfz hadoop-1.2.1.tar.gz
hadoop-env 수정
이것 저것....
hadoop@hadoop-01:~/hadoop-1.2.1/conf$ pwd
/home/hadoop/hadoop-1.2.1/conf
hadoop@hadoop-01:~/hadoop-1.2.1/conf$ vi hadoop-env.sh
# The java implementation to use. Required.
# 현재 우분투 14에 Oracle JDK 7을 설치하면 아래와 같은 경로에 설치된다.
export JAVA_HOME=/usr/lib/jvm/java-7-oracle
# The maximum amount of heap to use, in MB. Default is 1000.
export HADOOP_HEAPSIZE=768
# The directory where pid files are stored. /tmp by default.
# NOTE: this should be set to a directory that can only be written to by
# the users that are going to run the hadoop daemons. Otherwise there is
# the potential for a symlink attack.
export HADOOP_PID_DIR=/home/hadoop/hadoop-1.2.1/pids
masters 수정
masters 파일에는 보조네임 노드를 실행할 서버를 설정한다. (여러개 가능)
hadoop@hadoop-01:~/hadoop-1.2.1/conf$ vi masters
hadoop-02
slaves 수정
slaves 파일에는 데이터 노드를 실행할 서버를 설정한다.
hadoop@hadoop-01:~/hadoop-1.2.1/conf$ vi slaves
hadoop-02
hadoop-03
core-site.xml 수정
이것 저것... ㅠㅠ
hadoop@hadoop-01:~/hadoop-1.2.1/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://hadoop-01:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoop-data</value>
</property>
</configuration>
hdfs-site.xml 수정
...
hadoop@hadoop-01:~/hadoop-1.2.1/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>3</value>
</property>
<property>
<name>dfs.http.address</name>
<value>hadoop-01:50070</value>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>hadoop-02:50090</value>
</property>
</configuration>
mapred-site.xml 수정
..
hadoop@hadoop-01:~/hadoop-1.2.1/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>hadoop-01:9001</value>
</property>
</configuration>
하둡 환경설정 복사
네임노드에서 모든 수정 작업이 완료되면 다른 데이터노드 서버로 파일을 복사한다.
hadoop@hadoop-01:~$ cd ~
hadoop@hadoop-01:~$ tar zcvf hadoop.tar.gz hadoop-1.2.1
hadoop@hadoop-01:~$ scp hadoop.tar.gz hadoop@hadoop-02:/home/hadoop
hadoop@hadoop-01:~$ scp hadoop.tar.gz hadoop@hadoop-03:/home/hadoop
각각 서버로 전송된 파일 압축 해제
hadoop@hadoop-02:~$ tar xvfz hadoop.tar.gz
hadoop@hadoop-03:~$ tar xvfz hadoop.tar.gz
하둡 실행
네임노드를 초기화한다.
hadoop@hadoop-01:~/hadoop-1.2.1/bin$ ./hadoop namenode -format
INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = hadoop-01/192.168.153.10
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 1.2.1
STARTUP_MSG: build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.2 -r 1503152; compiled by 'mattf' on ...
STARTUP_MSG: java = 1.7.0_80
************************************************************/
INFO util.GSet: Computing capacity for map BlocksMap
INFO util.GSet: VM type = 64-bit
INFO util.GSet: 2.0% max memory = 778502144
INFO util.GSet: capacity = 2^21 = 2097152 entries
INFO util.GSet: recommended=2097152, actual=2097152
INFO namenode.FSNamesystem: fsOwner=hadoop
INFO namenode.FSNamesystem: supergroup=supergroup
INFO namenode.FSNamesystem: isPermissionEnabled=true
INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100
INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)
INFO namenode.FSEditLog: dfs.namenode.edits.toleration.length = 0
INFO namenode.NameNode: Caching file names occuring more than 10 times
INFO common.Storage: Image file /home/hadoop/hadoop-data/dfs/name/current/fsimage of size 112 bytes saved in 0 seconds.
INFO namenode.FSEditLog: closing edit log: position=4, editlog=/home/hadoop/hadoop-data/dfs/name/current/edits
INFO namenode.FSEditLog: close success: truncate to 4, editlog=/home/hadoop/hadoop-data/dfs/name/current/edits
INFO common.Storage: Storage directory /home/hadoop/hadoop-data/dfs/name has been successfully formatted.
INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at hadoop-01/192.168.153.10
************************************************************/
전부 실행
hadoop@hadoop-01:~/hadoop-1.2.1/bin$ ./start-all.sh
starting namenode, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-namenode-hadoop-01.out
hadoop-03: starting datanode, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-datanode-hadoop-03.out
hadoop-02: starting datanode, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-datanode-hadoop-02.out
hadoop-01: starting secondarynamenode, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-secondarynamenode-hadoop-01.out
starting jobtracker, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-jobtracker-hadoop-01.out
hadoop-03: starting tasktracker, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-tasktracker-hadoop-03.out
hadoop-02: starting tasktracker, logging to /home/hadoop/hadoop-1.2.1/libexec/../logs/hadoop-hadoop-tasktracker-hadoop-02.out
제대로 올라갔는지 확인하자
hadoop@hadoop-01:~$ jps
3050 JobTracker
2730 NameNode
hadoop@hadoop-02:~$ jps
3067 SecondaryNameNode
2951 DataNode
3190 TaskTracker
hadoop@hadoop-03:~$ jps
3087 TaskTracker
2949 DataNode
http://hadoop-01:50070