본문 바로가기

Cloud, Bigdata, AI/Big Data Analysis

[Hadoop] 하둡 설치 삽질기

반응형

며칠간의 삽질 끝에 드디어 하둡 설치를 완료하였다.

하둡 설치에 어려움을 겪는 주된 이유는 먼저 최신 버전이 반영된 정확한 매뉴얼이 없다는 것이고, 또한 한국어로 된 매뉴얼이 적기 때문인 것 같다.

그래서 이번 삽질기를 공유함으로써 하둡 설치에 어려움을 겪고 있는 분들에게 조금이나마 도움을 드리고자 한다.

하지만 이것도 정확하다고 보장할 수는 없어 오류 발견시 지속적으로 수정하려고 한다.

질문 및 수정 제안 환영!

 

 

0. 기본 설정

 

0.1 설치 환경

 

필자는 다음과 같은 환경에서 설치를 진행하였다.

 

 

master node : PC, Ubuntu 16.04 desktop

slave nodes : VM, Ubuntu 16.04 server (desktop으로 설치하여도 무방함)

 

 

0.2 vi 설정 (편의상 진행한 것으로 건너뛰어도 무방함)

$ sudo apt-get install vim
$ sudo vi ~/.vimrc

적당히 세팅하기

set hlsearch " 검색어 하이라이팅
set nu " 줄번호
set autoindent " 자동 들여쓰기
set scrolloff=2
set wildmode=longest,list
set ts=4 "tag select
set sts=4 "st select
set sw=1 " 스크롤바 너비
set autowrite " 다른 파일로 넘어갈 때 자동 저장
set autoread " 작업 중인 파일 외부에서 변경됬을 경우 자동으로 불러옴
set cindent " C언어 자동 들여쓰기
set bs=eol,start,indent
set history=256
set laststatus=2 " 상태바 표시 항상
"set paste " 붙여넣기 계단현상 없애기
set shiftwidth=4 " 자동 들여쓰기 너비 설정
set showmatch " 일치하는 괄호 하이라이팅
set smartcase " 검색시 대소문자 구별
set smarttab
set smartindent
set softtabstop=4
set tabstop=4
set ruler " 현재 커서 위치 표시
set incsearch
set statusline=\ %<%l:%v\ [%P]%=%a\ %h%m%r\ %F\
" 마지막으로 수정된 곳에 커서를 위치함
au BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "norm g`\"" |
\ endif
" 파일 인코딩을 한국어로
if $LANG[0]=='k' && $LANG[1]=='o'
set fileencoding=korea
endif
" 구문 강조 사용
if has("syntax")
 syntax on
endif

 

 

 

1. 가상머신 설치

 

slave node로 사용할 pc를 마련하지 않고 가상머신을 사용한다.

본 포스팅에서는 VMware Player 를 사용한다.

 

1.1 VMware 설치

 

먼저 마스터노드용 pc에 VMware를 설치해준다.여기서는 wget 명령을 이용한다. .bundle 파일만 받으면 되기 때문에 VMware 공식 홈페이지에서 찾아서 받아줘도 상관없다.

 

$ wget https://download3.vmware.com/software/player/file/VMware-Player-12.5.7-5813279.x86_64.bundle

위 명령이 정상적으로 수행되고 나면 VMware-Player-12.5.7-5813279.x86_64.bundle 파일이 현재 쉘이 위치한 디렉토리에 다운로드된다.

 

$ sudo sh VMware-Player-12.5.7-5813279.x86_64.bundle

위 명령으로 bundle파일을 쉘로 실행하고 나면 아래와 같은 창이 뜬다.

 

 

 

accept - next 를 두 번 해준다

 

statistics 묻는 창에서는 yes/no 상관없고, license묻는 창에서는 next누른다.

 

설치가 완료되었다.

 

ubuntu 좌측 바 상단에 vmware를 검색하여 vmware를 실행해주면 인증 창이 뜬다. 여기서 'Use VMware Workstation 12 Player for free for non-commercial use'를 선택해주고 텍스트 입력창에 이메일주소를 입력한다.

 

 

 

위와 같이 메인 화면을 볼 수 있다. Create a New Virtual Machine 을 클릭하자.

ubuntu server 설치 iso파일을 가지고 설치할 것이므로 'Use ISO image' 를 선택하여 진행한다.

iso파일을 얻는 방법은 여러 가지가 있는데 필자가 해본 결과 국내에서는 카카오 ftp서버에서 받는 속도가 다른 서버보다 압도적으로 빠르다.

 

링크는 여기 있다.

 

또는 wget을 이용하는 방법도 있다.

$ wget http://ftp.daumkakao.com/ubuntu-releases/xenial/ubuntu-16.04.3-server-amd64.iso

이렇게 얻은 iso 파일을 vmware창에서 browse 버튼을 눌러 찾아주면 똑똑한 vmware가 알아서 os를 인식해준다.

 

 

 

 

next를 누르면 사용자 설정을 할 수 있는데 비밀번호를 설정해주자. 어차피 ssh로 접속할 때 공개키를 이용하기 때문에 큰 의미는 없지만.

가상머신 이름 설정은 next.

disk size 설정도 왠만하면 그대로 두고 next. 그다음 finish를 눌러 가상머신을 시작하면 자동으로 설치가 진행된다.

 

원래 ubuntu server를 설치하려면 많은 설정들을 해줘야 하는데 자동으로 os를 인식해서 자동설치가 진행되었으므로 가만히 두면 어느새 설치 완료된 모습을 볼 수 있다.

 


2. Java설치 및 환경변수 설정

2.1 OpenJDK 제거

$ sudo apt-get purge openjdk*


2.2 Java 설치
2.2.1 curl 설치

java를 X-Window없이 설치하려면 curl을 이용해야 한다. master는 ubuntu desktop이므로 오라클 홈페이지 내 공식 다운로드 링크에서 클릭한번으로 받으면 되지만 가상머신은 ubuntu server이므로 curl을 이용해야한다.

아래 명령을 통해 curl을 설치할 수 있다.

$ sudo apt install curl


2.2.2 Oracle Java 설치 #1

$ curl -O -v -j -k -L -H "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u144-b01/090f390dda5b47b9b721c7dfaa008135/jdk-8u144-linux-x64.tar.gz

※http 경로는 버전마다 바뀔 수 있으니 공식 다운로드 링크 에서 Accept 클릭후, pc환경에 맞는 Linux용 download link(.tar.gz)를 마우스 우클릭하여 경로를 복사하고 위 curl명령줄에 붙여넣고 실행하여야한다.
압축을 해제하고 홈 디렉토리로 옮긴다.

$ tar xvzf ./jdk-8u144-linux-x64.tar.gz
$ mv jdk1.8.0_144 ~/jdk1.8.0_144

2.2.3 Oracle Java 설치 #2 (다른 방법)

curl 명령이 잘 먹지 않는다면 ubuntu의 apt-get 명령을 이용한다. 다만 이렇게 설치할 경우 java 디렉토리를 직접 관리하기 어려울 수 있고 아래 환경변수 설정이 조금 바뀐다.

$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer

만약 add-apt-repository 명령에서,

Cannot add PPA: 'ppa:~webupd8team/ubuntu/java'

위와 같은 에러가 뜬다면 프록시 문제일 가능성이 있다고 한다.
webupd8team의 공식 답변에 나온 해결책인 아래 명령을 수행하고 다시 해보자.

$ sudo apt-get install --reinstall ca-certificates

#1의 방법이든 #2의 방법이든 master와 같은 방법으로 가상머신에도 java를 설치해주어야한다.

 

 

 

== 2019-07-01

JDK 패키지 다운로드 방식이 기존 Accept만 누르면 받아올 수 있던 방식에서 홈페이지 로그인을 해서 다운받는 방식으로 변경되었다. 따라서 새로운 방법을 소개한다.

먼저 공식 다운로드 링크 페이지는 동일하다. 8버전을 받는 것도 동일하다.

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

 

Java SE Development Kit 8 - Downloads

Java SE Development Kit 8 Downloads Thank you for downloading this release of the Java™ Platform, Standard Edition Development Kit (JDK™). The JDK is a development environment for building applications, applets, and components using the Java programming la

www.oracle.com

위 페이지에 들어가면 아래 사진처럼 나오는 항목이 있는데 Accept License Agreement 클릭 후 사용하는 플랫폼에 맞게 다운로드하는 부분까진 기존과 동일하다.

그런데 여기서 해당 tar.gz를 클릭하면 로그인 페이지가 등장한다. 

계정이 없으면 계정 생성 후 로그인을 진행한다. 로그인을 하면 자동으로 다운로드가 시작된다.

datanode용 가상머신들의 경우 이전에는 curl을 통해 oracle 서버의 jdk 파일을 가져왔는데, 로그인 인증을 통하는 방법으로 변경된 이후에는 그렇게 할 수가 없다. 따라서 scp를 통해 로컬에 위치한 jdk 파일을 가상머신이 가져오는 방법을 사용한다.

가상머신을 켜고 ubuntu server에 로그인 한 후 로컬 ubuntu의 vmnet ip를 확인한다. vmnet은 하나의 가상의 내부망으로 볼 수 있으므로 vmnet에 물려있는 각각의 가상 또는 물리 pc들은 하나의 네트워크 안에 있다. 따라서 서로간에 ssh 프로토콜을 사용할 수 있다. 현재 jdk 파일은 로컬의 사용자 홈디렉토리에 위치해 있다고 하자. 그렇다면 로컬의 ubuntu desktop에서 ubuntu server로 파일을 전송하는 명령은 다음과 같다.

$ scp ~/jdk-8u211-linux-x64.tar.gz user@x.x.x.x:/home/user

 

 

2.3 가상머신 복사하기

 

위의 내용을 동일하게 적용한 가상머신을 3개 만들어야하는데 하나하나 만들기는 번거로우므로 가상머신 파일을 복사한다.

먼저 현재 켜져있는 가상머신에 다음 명령을 수행하여 종료한다.

$ sudo shutdown -h now

 

VMware 가상머신 복사하는 방법은 여기 클릭

 

username을 변경해주는 것을 잊지 말자. 이 포스팅에서는 username을 모두 'user'로 동일하게 설정하였다.
아래부터 Master와 Slave에 각기 다르게 적용되는 내용이 나오는데 username을 하나하나 바꿔주지 않으면 에러가 난다.

 



3. 네트워크 설정

3.1 호스트명 변경 (*master, slave)

$ sudo vi /etc/hostname

*master : master로 변경후 저장
*slave : 각각의 slave마다 slave01, slave02, slave03으로 변경후 저장

3.2 IP 할당 (*slave)

 

slave node의 IP를 각각 수동으로 설정해준다.


※그런데... master가 이미 고정IP를 가지고 있고, slave 가 vm위에서 돌아간다면 slave는 고정IP를 가진 것은 아니지만 vm간의 네트워크 변경이 없는 한 한시적으로는 고정적인 IP를 부여받으므로 각 노드의 '내부IP'만 적어두고 이 단계를 건너뛰어도 됨


3.3 호스트 설정 (*master, slave)

$ sudo vi /etc/hosts

각 노드의 ip를 확인한 후에 해당하는 ip를 적어주면 된다.

 

192.168.xxx.1 master
192.168.xxx.129 slave01
192.168.xxx.128 slave02
192.168.xxx.130 slave03

 

== 추가: /etc/hosts의 내용중 아래 행은 지워준다.

127.0.1.1 localhost

 

slave 모두 종료하고, master 재부팅을 한다.

(*slave)

$ sudo shutdown -h now

(*master)

$ sudo reboot

 

 

4. SSH 설정
4.1 SSH 설치 (*master, slave)

$ sudo apt-get install openssh-server openssh-client


4.2 SSH 키 생성 (*master)

$ ssh-keygen -t rsa

위 명령을 치면 뭔가 자꾸만 물어본다. 그냥 다 엔터 치자.

 


4.3 SSH 키 배포
(*slave)

$ mkdir /home/user/.ssh

(*master)

$ cd .ssh
$ scp id_rsa.pub /home/user/.ssh/authorized_keys
$ scp id_rsa.pub user@slave01:/home/user/.ssh/authorized_keys
$ scp id_rsa.pub user@slave02:/home/user/.ssh/authorized_keys
$ scp id_rsa.pub user@slave03:/home/user/.ssh/authorized_keys


5. Hadoop 설치

아래부터는 master만 진행하는데 그 이유는 master에서 scp를 가지고 하둡파일을 통째로 slave에 배포해서 적용할 것이기 때문이다.

물론 slave 노드 하나하나 아래와 똑같은 방법으로 설치해줘도 상관은 없다.

 

5.1 Hadoop 다운로드 (*master)

$ wget http://mirror.apache-kr.org/hadoop/common/hadoop-2.8.1/hadoop-2.8.1.tar.gz
$ tar xvzf hadoop-2.8.1.tar.gz
$ mv hadoop-2.8.1 /home/user/hadoop-2.8.1


5.2 환경변수 설정 (*master)

$ sudo vi ~/.bashrc

다음 내용 입력 후 저장

(#1)

export JAVA_HOME=/home/user/jdk1.8.0_144
export HADOOP_HOME=/home/user/hadoop-2.8.1
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export CLASS_PATH=$JAVA_HOME/lib:$CLASS_PATH

(#2)

export JAVA_HOME=/usr/lib/jvm/java-8-oracle/
export HADOOP_HOME=/home/user/hadoop-2.8.1
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export CLASS_PATH=$JAVA_HOME/lib:$CLASS_PATH

즉시 적용을 위해 source 명령을 사용한다.

$ source ~/.bashrc


5.3 Hadoop 설정(*master)

 

먼저 하둡 설정파일이 담겨있는 디렉토리로 이동한다.

$ cd $HADOOP_HOME/etc/hadoop/

 

 

(※각 파일 하단에 다음 내용을 추가한 후 저장, 없으면 생성한다.)

== 추가: 파일명은 master가 아니라 master"s" 이다!

$ vi masters
master
$ vi slaves
slave01
slave02
slave03

(#1)

$ vi hadoop-env.sh
export JAVA_HOME=/home/user/jdk1.8.0_144
export HADOOP_HOME=/home/user/hadoop-2.8.1
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop

(#2)

$ vi hadoop-env.sh
export JAVA_HOME=/usr/lib/jvm/java-8-oracle/
export HADOOP_HOME=/home/user/hadoop-2.8.1
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
$ vi yarn-env.sh 
(hadoop-env.sh 내용과 동일하게 수정하면 됨)
$ vi core-site.xml

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://master:9000</value>
    </property>
</configuration>

 

여기서 잠시 디렉토리 하나 만들고

$ mkdir /home/user/hadoop-2.8.1/hdfs
$ mkdir /home/user/hadoop-2.8.1/hdfs/name
$ mkdir /home/user/hadoop-2.8.1/hdfs/data
$ chmod 755 /home/user/hadoop-2.8.1/hdfs/name
$ chmod 755 /home/user/hadoop-2.8.1/hdfs/data

다시 계속해서 파일수정을 한다.

 

$vi hdfs-site.xml

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/home/user/hadoop-2.8.1/hdfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/home/user/hadoop-2.8.1/hdfs/data</value>
    </property>
    <property>
        <name>dfs.permissions</name>
        <value>false</value>
    </property>
    <property>
        <name>dfs.namenode.http-address</name>
        <value>master:50070</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>slave01:50090</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.https-address</name>
        <value>slave01:50091</value>
    </property>
</configuration>
$ vi mapred-site.xml
    <configuration>
       <property>
          <name>mapreduce.framework.name</name>
          <value>yarn</value>
       </property>
    </configuration>

== 추가: yarn.resourcemanager.hostname 속성을 추가해야한다. 그렇지 않으면 슬레이브노드의 nodemanager가 제대로 동작하지 않을 수 있다.

$ vi yarn-site.xml
    <configuration>
       <property>
          <name>yarn.resourcemanager.hostname</name>
          <value>master</value>
       </property>
       <property>
          <name>yarn.nodemanager.aux-services</name>
          <value>mapreduce_shuffle</value>
       </property>
       <property>
          <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
          <value>org.apache.hadoop.mapred.ShuffleHandler</value>
       </property>
       <property>
          <name>yarn.resourcemanager.resource-tracker.address</name>
          <value>master:8025</value>
       </property>
       <property>
          <name>yarn.resourcemanager.scheduler.address</name>
          <value>master:8030</value>
       </property>
       <property>
          <name>yarn.resourcemanager.address</name>
          <value>master:8040</value>
       </property>
       <property>
          <name>yarn.resourcemanager.webapp.address</name>
          <value>master:8088</value>
       </property>
    </configuration>
 

 

5.4 Hadoop 배포 (*master)
5.4.1 Hadoop 디렉토리 배포

$ scp -r /home/user/hadoop-2.8.1 user@slave01:~
$ scp -r /home/user/hadoop-2.8.1 user@slave02:~
$ scp -r /home/user/hadoop-2.8.1 user@slave03:~

그리고 master에서 만들어준 master, slave 파일은 master 노드에만 필요하므로 slave노드에서는 다 지워준다.

 

 


5.4.2 환경변수 배포

$ scp ~/.bashrc user@slave01:~
$ scp ~/.bashrc user@slave02:~
$ scp ~/.bashrc user@slave03:~


6. Hadoop 실행 (*master)
6.1 하둡 시작

$ hadoop namenode -format
$ start-all.sh

jps명령을 이용하여 정상작동하는지 확인해보자.

(*master)

$ jps
17395 Jps
16631 NameNode
16935 ResourceManager

(*slave01)

$ jps
1712 DataNode
1826 SecondaryNameNode
1911 NodeManager
2075 Jps

(*slave02)

$ jps
1522 DataNode
1642 NodeManager
1787 Jps

(*slave03)

$ jps
1495 DataNode
1772 Jps
1614 NodeManager

위와같이 뜬다면 정상적으로 설치된 것이다. (포트번호는 바뀔 수 있다.)

하둡 파일시스템 확인을 해보자. 다음 명령을 치면 된다.

(*master)

$ hadoop fs -df -h
Filesystem            Size  Used  Available  Use%
hdfs://master:9000  55.7 G  72 K     40.7 G    0%

 

현재 실행중인 data 노드들의 정보를 조회해보자.

(*master)

$ hadoop dfsadmin -report
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.

Configured Capacity: 59837042688 (55.73 GB)
Present Capacity: 43691765760 (40.69 GB)
DFS Remaining: 43691692032 (40.69 GB)
DFS Used: 73728 (72 KB)
DFS Used%: 0.00%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0
Pending deletion blocks: 0

-------------------------------------------------
Live datanodes (3):

Name: 192.168.110.128:50010 (slave01)
Hostname: slave01
Decommission Status : Normal
Configured Capacity: 19945680896 (18.58 GB)
DFS Used: 24576 (24 KB)
Non DFS Used: 4346068992 (4.05 GB)
DFS Remaining: 14562807808 (13.56 GB)
DFS Used%: 0.00%
DFS Remaining%: 73.01%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Thu Sep 28 15:31:45 KST 2017


Name: 192.168.110.129:50010 (slave03)
Hostname: slave03
Decommission Status : Normal
Configured Capacity: 19945680896 (18.58 GB)
DFS Used: 24576 (24 KB)
Non DFS Used: 4344258560 (4.05 GB)
DFS Remaining: 14564618240 (13.56 GB)
DFS Used%: 0.00%
DFS Remaining%: 73.02%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Thu Sep 28 15:31:46 KST 2017


Name: 192.168.110.130:50010 (slave02)
Hostname: slave02
Decommission Status : Normal
Configured Capacity: 19945680896 (18.58 GB)
DFS Used: 24576 (24 KB)
Non DFS Used: 4344610816 (4.05 GB)
DFS Remaining: 14564265984 (13.56 GB)
DFS Used%: 0.00%
DFS Remaining%: 73.02%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Thu Sep 28 15:31:45 KST 2017

 

참고링크 : https://m.blog.naver.com/PostView.nhn?blogId=8x8x8x8x8x8&logNo=220685439665&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F

https://www.joinc.co.kr/w/man/12/hadoop/install

 

반응형