본문 바로가기

빅데이터, 기계학습/Hadoop

[HADOOP] 하둡 (Hadoop 1.2.1) CentOS 6에 설치하기

[HADOOP] 하둡 (Hadoop 1.2.1) CentOS 6에 설치하기


이 글은 하둡 1.2.1 버전을 CentOS 6에 설치하고 실행하는 방법을 적은 글입니다. 하둡은 완전 분산 모드(Fully distributed)로 설치합니다. 완전 분산 모드는 여러대의 서버로 하둡 클러스터를 구성하는 방식입니다. 하나의 서버에 하둡을 설치하는 독립 실행 모드나 가상 분산 모드와는 달리 실제 서비스에서 사용하는 방식입니다.


설치 환경

아래 사양의 서버 4대에 하둡을 설치해 보겠습니다. 네임노드(HDFS의 Master 역할을 한다. 메타데이터 정보를 가지고 있으며 데이터노드에 I/O 작업을 지시한다.), 보조네임노드(네임노드의 이미지 복제본을 유지한다.), 데이터노드(블록단위로 나뉜 데이터가 저장되는 노드이다. 블록들이 어느 데이터노드에 저장되어 있는지에 관한 정보는 네임노드가 가지고 있다.)를 구성하겠습니다. 보통 네임노드와 보조네임노드는 동일한 사양을 가진 서버에 설치하며 단독으로 구성합니다.

* 하드웨어 : 2 Core CPU, 2GB RAM, 100GB HDD

* 운영체제 : CentOS 6.8 64Bit


하둡 다운로드

1. 하둡 다운로드 미러링 사이트 접속 (http://www.apache.org/dyn/closer.cgi/hadoop/common)

* HTTP 하단의 어떤 링크를 클릭해도 동일한 버전의 하둡 파일을 내려받을 수 있습니다.

2. hadoop-1.2.1.tar.gz의 다운로드 링크 복사

* ex. http://apache.mirror.cdnetworks.com/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz

3. wget으로 서버에 다운로드

* 한 서버에서 다운로드 및 설정 파일을 수정한 후 다른 서버들로 복사할 것이므로 한 서버에만 다운로드합니다.

1
2
$ cd ~/apps
$ wget http://apache.mirror.cdnetworks.com/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz
cs


하둡 사용 계정 설정

리눅스 시스템에서 일반 작업에 root 계정을 사용하게 되면 시스템에 영향을 줄 수 있으므로, `$ adduser [계정명]` 명령어를 사용하여 계정을 만들어 사용하는게 좋습니다. 물론 이미 사용하고 있는 일반 계정이 있다면 그 계정을 사용하셔도 되지만 하둡 클러스터를 구성하는 모든 서버에 같은 이름의 계정이 있어야 합니다. 여기에서는 편의상 hadoop이라는 계정을 사용하도록 하겠습니다.


/etc/hosts 파일 수정

* 이 과정은 꼭 필요한 과정은 아닙니다. IP를 사용하면 되지만 매번 기억하기 힘들기 때문에 호스트 네임을 지정하고 사용하도록 하겠습니다.

* 호스트 파일 수정은 root 권한이 필요합니다.

* 하둡을 설치할 모든 서버의 호스트 파일을 수정합니다.

* 호스트 파일에 하둡을 설치할 서버들의 ip와 원하는 호스트 네임을 입력한다.

* h001 서버는 네임노드, h002는 보조네임노드 + 데이터노드, h003과 h004는 데이터노드이다.

* 실제 서비스용 하둡 클러스터는 보조네임노드가 보통 단독으로 구성됩니다.

1
2
3
4
5
6
7
8
$ sudo vim /etc/hosts
 
...
xxx.xxx.xxx.xxx h001.eucerin
xxx.xxx.xxx.xxx h002.eucerin
xxx.xxx.xxx.xxx h003.eucerin
xxx.xxx.xxx.xxx h004.eucerin
...
cs


서버 인코딩 설정

아래 명령어로 모든 서버의 인코딩 방식이 UTF-8인지 확인한다.

1
2
echo $LANG
en_US.UTF-8
cs

UTF-8이 아니면, 아래 방법으로 인코딩 방식을 변경한다.

1
2
3
4
5
6
7
8
9
$ sudo vim /etc/sysconfig/i18n
...
LANG="en_US.UTF-8"
SUPPORTED="en_US.UTF-8:en_US:en"
SYSFONT="latarcyrheb-sun16"
...
$ source /etc/sysconfig/i18n
echo $LANG
en_US.UTF-8
cs


자바 설치
모든 서버에 자바가 설치되어 있는지 확인한다.
1
2
3
4
$ java -version
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)
cs

자바가 설치되어 있지 않다면, 아래 방법으로 설치한다.

1
2
$ wget http://download.oracle.com/otn-pub/java/jdk/8u121-b13/e9e7ea248e2c4826b92b3f075a80e441/jdk-8u121-linux-x64.rpm
$ rpm -ivh jdk-8u121-linux-x64.rpm
cs


SSH 설정

1. RSA 키 생성

1
2
3
$ ssh-keygen -t rsa
# 질문에는 Enter를 눌러 기본값으로 RSA 키 생성을 완료한다.
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
cs

2. 각 서버에 공개키 복사

1
2
3
$ scp -r ~/.ssh hadoop@h002.eucerin:/home/hadoop
$ scp -r ~/.ssh hadoop@h003.eucerin:/home/hadoop
$ scp -r ~/.ssh hadoop@h004.eucerin:/home/hadoop
cs

3. 접속 확인

연결을 계속 유지할지 물어보는 질문에는 yes를 입력한다. hadoop 계정의 비밀번호를 묻는 등 바로 접속이 되지 않은 경우에는 공개키가 복사되지 않은 것이므로 각 서버의 ~/.ssh/authorized_keys를 확인한다.

1
2
$ ssh h002.eucerin
Last login: Mon Apr 17 11:01:06 2017 from xxx.xxx.xxx.xxx
cs


하둡 압축 해제

1
2
3
4
$ cd ~/apps
$ tar xvfz hadoop-1.2.1.tar.gz
...
$ ls -s hadoop-1.2.1 hadoop
cs


하둡 환경설정 파일 수정

* hadoop-env.sh 파일에 하둡 pid 정보 저장 디렉토리 설정

1
2
3
4
5
6
$ cd ~/apps/hadoop/conf
$ vim hadoop-env.sh
...
# 아래 내용을 추가한다.
export HADOOP_PID_DIR=/home/hadoop/apps/hadoop-1.2.1/pids
...
cs

* master 파일에 보조네임노드 서버 호스트 네임 입력

1
2
3
4
$ pwd
/home/hadoop/apps/hadoop/conf
$ vim masters
h002.eucern
cs

* slaves 파일에 데이터노드 서버 호스트 네임 입력

1
2
3
4
$ vim slaves
h002.eucerin
h003.eucerin
h004.eucerin
cs


* core-site.xml 파일 설정

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
 
<configuration>
    <property>
        <name>fs.default.name</name>
        <value>hdfs://h001.eucerin:9000</value>
        <description>HDFS의 기본 이름입니다. 데이터노드가 네임노드로 하트비트나 블록 리포트를 보낼 때 이 값을 참조해 네임노드를 호출합니다.</description>
    </property>
</configuration>
cs

* hdfs-site.xml 파일 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
 
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
        <description>HDFS에 저장될 복제본 개수 설정. 1로 설정하면 가상 분산 모드를 의미한다.</description>
    </property>
    <property>
        <name>dfs.http.address</name>
        <value>h001.eucerin:50070</value>
        <description>네임노드 웹서버 주소. 보조네임노드가 이 값을 참조하여 네임노드로 접속하므로 반드시 설정해야 한다.</description>
    </property>
    <property>
        <name>dfs.secondary.http.address</name>
        <value>h002.eucerin:50090</value>
        <description>보조네임노드 웹서버 주소</description>
    </property>
</configuration>
cs

* mapred-site.xml 파일 설정

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
 
<configuration>
    <property>
        <name>mapred.job.tracker</name>
        <value>h001.eucerin:9001</value>
        <description>잡트래커 데몬의 주소. 데이터노드에서 이 주소로 맵리듀스 작업을 요청한다.</description>
    </property>
</configuration>
cs


다른 서버로 하둡 폴더 전송

1
2
3
4
5
$ pwd
/home/hadoop/apps
$ scp -r hadoop hadoop@h002.eucerin:/home/hadoop/apps
$ scp -r hadoop hadoop@h003.eucerin:/home/hadoop/apps
$ scp -r hadoop hadoop@h004.eucerin:/home/hadoop/apps
cs


네임노드 초기화

네임노드 서버(h001.eucerin)을 초기화한다.

1
2
3
$ pwd
/home/hadoop/apps/hadoop
$ ./bin/hadoop namenode -format
cs


하둡 실행

네임노드 서버에서 하둡을 실행한다. 하둡이 정상적으로 실행되지 않았다면 하둡을 설치한 서버들에 하둡 파일이 잘 전송되었는지, 설정 값이 잘 적용되어 있는지 확인한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 하둡 실행 (네임노드 h001.eucerin)
$ ./bin/start-all.sh
...
 
# 하둡 실행 확인 (네임노드 h001.eucerin)
$ jps
30065 JobTracker
29879 NameNode
41625 Jps
 
# 하둡 실행 확인 (보조네임노드 h002.eucerin)
$ jps
39761 Jps
25758 DataNode
25870 SecondaryNameNode
25983 TaskTracker
 
# 하둡 실행 확인 (데이터노드 h003.eucerin, h004.eucerin)
$ jps
35105 TaskTracker
47382 Jps
34983 DataNode
cs


WordCount 예제 실행

hadoop-env.sh 파일에 사용된 단어 개수를 집계한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ pwd
/home/hadoop/apps/hadoop
 
# 하둡 클러스터에 hadoop-env.sh 파일 업로드
$ ./bin/hadoop fs -put ./conf/hadoop-env.sh ./conf/hadoop-env.sh
 
# WordCount 예제 파일 실행, 입력은 conf/hadoop-env 출력은 wordcount_output 폴더로 한다.
$ ./bin/hadoop jar hadoop-example-*.jar wordcount conf/hadoop-env.sh wordcount_output
...
 
# 결과 확인 (출력 결과는 다를 수 있습니다.)
$ ./bin/hadoop fs -cat wordcount_output/part-r-00000
#    36
a    3
...
cs