지구정복

[Hadoop] 서버 4대 완전분산모드 주키퍼, 하둡설치하기 본문

데이터 엔지니어링 정복/Hadoop Ecosystem

[Hadoop] 서버 4대 완전분산모드 주키퍼, 하둡설치하기

eeaarrtthh 2021. 5. 22. 01:49
728x90
반응형
SMALL

매 단계별로 버추얼박스에서 스냅샷을 잘 찍어놓자.
오류나면 되돌려야 하니깐!!

-JDK 8 설치하기

먼저 버추얼박스에 Hadoop1이란 리눅스 centos 7버전의 서버를 만든다.

그리고 해당 서버 설정-네트워크에 들어가서 아래처럼 설정한다.

어댑터 이름은 각자 어댑터 이름이 있을 것이다. 그걸로 설정해준다.

어댑터2부분도 아래처럼 해준다. 이따가 MAC주소는 쓰일 때가 있다.

 

이제 서버를 실행한다.

CentOS 7 을 설치했다고 가정하고 진행한다.

CentOS는 개발자용, 네트워크설정만하고 설치

그리고 X-Window를 켜놓은 상태이다.

 

Hadoop1서버를 실행하고 root 계정으로 로그인한다.

 

미리 yum도 업데이트 시켜준다. 한 5~10분 걸린다.

[root@hadoop01 local]# yum update -y

 

다음으로 자바 설치유무를 확인한다.

[root@hadoop01 local]# yum list installed java*

또는

[root@hadoop01 local]# rpm -qa | grep java

기존에 설치된 자바 패키지가 있다면 모두 삭제한다.

[root@hadoop01 local]# yum remove 삭제할패키지명

(예시)
[root@hadoop01 local]# yum remove java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64

자신의 리눅스가 몇 비트인지 확인한다.

[root@hadoop01 local]# getconf LONG_BIT
64

 

 

이제 자신의 리눅스 비트에 맞게 오라클 JDK를 설치한다.

https://www.oracle.com/kr/java/technologies/javase/javase-jdk8-downloads.html

아래 파일을 다운받는다.

명령어 입력귀찮으니 윈도우창에서 바로 풀자.

 

압축을 푼 디렉토리를 /usr/local 경로로 보내준다.

[root@hadoop01 local]# mv jdk1.8.0_291 /usr/local
[root@hadoop01 local]# cd /usr/local

 

 

 

심볼릭 링크를 설정해준다.

[root@hadoop01 local]# ln -s jdk1.8.0_291/ java

ll 명령어로 심볼릭링크가 잘 설정되었는지 확인한다.

[root@hadoop01 local]# ll

 

심볼릭 링크를 어느 디렉토리에서나 사용할 수 있도록 환경 변수에 등록한다.
환경변수 작업후에는 꼭!! source /etc/profile 명령어로 환경변수 설정을 적용하자!

[root@hadoop01 local]# vi /etc/profile

맨 아래 커서로 이동 shift + g

아래 내용을 적어준다.

 

export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH="."

다 적었으면 esc누르고

:wq

눌러서 저장하고 나간다.

 

환경변수 적용을 위해 source 명령어 실행

[root@hadoop01 local]# source /etc/profile

 

이제 자바 jdk 설치 및 설정이 잘 되었는지 확인한다.

[root@hadoop01 local]# java -version

아래처럼 버전이 잘 나오면 설치 및 설정이 잘 된 것이다.

 

 

 

-고정IP 설정 및 네트워크 설정

이제 이 서버가 hadoop의 master서버가 된다.

slave서버들과 통신을 위해 방화벽을 꺼놓는다.

[root@hadoop01 local]# systemctl stop firewalld
[root@hadoop01 local]# systemctl disable firewalld

방화벽 잘 꺼졌는 지 확인한다. 아래처럼 not running이 뜨면 된다.

[root@hadoop01 local]# firewall-cmd --state

 

 

이제 호스트 네임을 지정해준다.

[root@hadoop01 local]# vi /etc/hostname

:wq

 

이제 고정IP설정과 네트워크 설정을 해보자.
먼저 ifcfg-eth0 파일을 생성한다.

[root@hadoop01 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0

그리고 아래와 같이 적어주는데 이때 MAC주소는 버추얼박스 해당 서버 설정의 네트워크에 가면 볼 수 있다.
이거는 각 서버마다 고유값을 가진다.

MAC주소는 아래 처럼 두글자당 : 을 붙여서 적어준다.

그리고 나머지들도 아래처럼 모두 적어준다. 이때 IPADDR에서 나는 192.168.56.101~102를 사용하고 있어서 103으로 설정했다. 다른분들을 101부터 사용하면 될 듯 하다.

DEVICE=eth0
HWADDR=08:00:27:80:B7:64
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.56.106
NEWMASK=255.255.255.0
GATEWAY=192.168.56.1
NETWORK=192.168.56.0

 

이제 고정 IP인 '192.168.56.103'을 할당받기 위해서 hadoop1서버를 버추얼박스에서 전원을껐다가 다시 시작한다.

다시 시작한다음 네트워크 서비스에 고정 IP가 인식되도록 아래 명령어를 실행한다.

[root@hadoop01 ~]# service network restart

특별한 오류가 없으면 고정IP 설정이 성공적으로 된 것이다. 이제 아래의 명령어로 고정IP가 할당됐는지 확인한다.

[root@hadoop01 ~]# ifconfig

아래 사진 처럼 eth0에 IP가 설정된 것을 확인할 수 있다.

또한 putty를 통해 ssh원격접속이 가능한지 확인한다.

일단 sshd가 켜져있는지 확인한다.

[root@hadoop01 ~]# service sshd status

아래처럼 running상태이면 된다.

만약에 sshd가 없으면 아래 명령어로 ssh 패키지를 설치한다.

[root@hadoop01 ~]# yum install openssh* -y
[root@hadoop01 ~]# service sshd restart
[root@hadoop01 ~]# chkconfig sshd on	//sshd 켜져있는지 확인
[root@hadoop01 ~]# reboot

리부팅완료되면 다음 명령어로 네트워크 설정을 다시 한 번 재시작한다.
[root@hadoop01 ~]# service network restart
[root@hadoop01 ~]# service sshd status

이제 putty로 원격접속을 시도해본다.

처음에 경고창같은 거는 Yes를 눌러준다.

아래처럼 접속이 잘 되는 것을 확인할 수 있다.

 

다음으로 hosts파일을 아래처럼 수정한다.

[root@hadoop01 ~]# vi /etc/hosts

127.0.0.1 localhost hadoop01

192.168.56.103 hadoop01.com hadoop01
192.168.56.104 hadoop02.com hadoop02
192.168.56.105 hadoop03.com hadoop03

 

network파일에서 HOSTNAME에 도메인명을 적어준다.

[root@hadoop01 ~]# vi /etc/sysconfig/network

NETWORKING=yes
NETWORKING IPV6=no
HOSTNAME=hadoop01.com

 

서비스 명령으로 네트워크 설정을 재시작한다.

[root@hadoop01 ~]# service network restart

 

이제 방화벽 및 기타 커널 매개변수 등을 설정해준다.

[root@hadoop01 ~]# vi /etc/selinux/config 

아래처럼 수정

SELINUX=disabled

 

iptables를 중지시킨다. 이는 리눅스에서 방화벽을 설정하는 도구이다.

[root@hadoop01 ~]# service iptables stop
[root@hadoop01 ~]# chkconfig iptables off		//iptables 자동시작을 중지시킨다.
[root@hadoop01 ~]# chkconfig ip6tables off		//ip6tables 자동시작을 중지시킨다.

만약에 not loaded라고 뜨면 패스~

 

다음은 리눅스의 스왑 메모리를 조금 더 늘려준다. 기본값은 60이다.

스왑메모리는 메모리가 부족할 경우 자주 사용되지 않는 메모리 페이지를 디스크의 스왑 공간으로 이동시켜서 부족한 메모리를 확보해주는 기능을 한다.

[root@hadoop01 ~]# sysctl -w vm.swappiness=100
[root@hadoop01 ~]# vi /etc/sysctl.conf 

vm.swappiness=100

 

다음으로 rc.local 파일을 수정한다.

[root@hadoop01 ~]# vi /etc/rc.local

아래명령어를 추가해준다.

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

마지막으로 limits.conf 파일에서 아래처럼 파일 디스크럽터 설정을 추가한다.

[root@hadoop01 ~]# vi /etc/security/limits.conf 

맨 아래로 내려가서 shift + g

root soft nofile 65536
root hard nofile 65536
* soft nofile 65536
* hadr nofile 65536
root soft nproc 32768
root hard nproc 32768
* soft nproc 32768
* hard nproc 32768

이제 끝이다.

네트워크 재시작해준다.

[root@hadoop01 ~]# service network restart

그리고  서버를 끈다.

 

-서버 복제하기

이제 클러스터링할 slave서버들을 복제해보자. 총 2개만 복제한다. Hadoop2와 Hadoop3

Hadoop1서버 우클릭 -> 복제

이름은 각자 편한걸로 설정한다. 이때 꼭 모든 네트워크 카드의 MAC주소 초기화를 체크한다.

완전한복제

복제하면 아래와 같이 서버가 생긴다.

 

이때 컴퓨터 사양이 저사양이신 분들은 설정에서 RAM크기를 줄이도록한다.

필자 컴퓨터는 RAM이 16GB여서 나름 넉넉하지만 4GB이거나 8GB인 분들은 1.5~2로 설정하자.

사실 나중에 하둡설치하고 여러가지 시스템들 설치하려면 RAM이 커야된다. 

그때 늘리도록 하자.

 

이제 Hadoop2와 Hadoop3에도 ifcfg-eth0, hostname, hosts 등을 수정해서 고정 IP와 네트워크 설정을 해주어야 한다.

따라서 Hadoop2와 Hadoop3의 MAC주소도 미리 확인한다.

둘 다 켜준다. 이제 Hadoop2만 설명할건데 Hadoop3도 똑같이 진행해주면 된다.

[root@hadoop01 ~]$ vi /etc/sysconfig/network-scripts/ifcfg-eth0 

아래처럼 MAC주소와 고정 IP주소를 바꿔준다. Hadoop3도 마찬가지

새로운 네트워크 정보를 할당받기 위해 버추얼박스에서 Hadoop2, 3을 종료하고 다시 시작한다. 아래 그림에서 hadoop02를 닫기 한다.

그리고 이제 hostname을 변경한다.

[root@hadoop01 ~]# vi /etc/hostname

 

다음으로 hosts파일도 변경해준다.

[root@hadoop01 ~]# vi /etc/hosts

 

다음으로 network도 수정해준다.

[root@hadoop01 ~]# vi /etc/sysconfig/network

 

 

 

이제 네트워크를 재시작하고 고정IP가 제대로 할당되었는지 확인한다.

[root@hadoop01 ~]# service network restart
[root@hadoop01 ~]# ifconfig eth0

Hadoop2
Hadoopp3

 

이제 두 개 서버 모두 재부팅한다.

[root@hadoop01 ~]# reboot

 

 

*참고*

나는 추가로 서버 1대를 더 증설했다. 그래서 서버 4대가 됐다. 추가된 서버도 위 과정 진행한다.

 

 

 

 

SSH 키 생성 및 복제

이제 웬만해서는 root계정을 사용하지 않는다.

 

다음은 서버1, 2에 ssh 암호키를 만들고 각 서버에 보내준다. 이는 NameNode서버와 SecondaryNode서버가 각 서버에 비밀번호 입력없이 접근하기 위함이다.

 

먼저 서버1에서 서버 2, 3, 4에 다 복제해준다.

 

ssh-copy-id -i [복사할 공개키 경로] [대상 서버 계정]@[대상 서버]

[hadoop01@hadoop01 ~]$ ssh-keygen -t rsa
엔터
엔터
엔터
[hadoop01@hadoop01 ~]$ ssh-copy-id -i /home/hadoop01/.ssh/id_rsa.pub hadoop01@hadoop01
yes
비번입력

[hadoop01@hadoop01 ~]$ ssh-copy-id -i /home/hadoop01/.ssh/id_rsa.pub hadoop01@hadoop02
yes
비번입력

[hadoop01@hadoop01 ~]$ ssh-copy-id -i /home/hadoop01/.ssh/id_rsa.pub hadoop01@hadoop03
yes
비번입력

[hadoop01@hadoop01 ~]$ ssh-copy-id -i /home/hadoop01/.ssh/id_rsa.pub hadoop01@hadoop04
yes
비번입력

그리고 접속이 잘 되는지 서버1에서 2, 3, 4서버에 접속해본다.

[hadoop01@hadoop01 ~]$ ssh hadoop02
[hadoop02@hadoop01 ~]$ hostname
hadoop02
[hadoop02@hadoop01 ~]$ exit


[hadoop01@hadoop01 ~]$ ssh hadoop03
[hadoop03@hadoop01 ~]$ hostname
hadoop03
[hadoop03@hadoop01 ~]$ exit


[hadoop01@hadoop01 ~]$ ssh hadoop04
[hadoop04@hadoop01 ~]$ hostname
hadoop04
[hadoop04@hadoop01 ~]$ exit

 

 

다음으로 서버2도 마찬가지로 키를 만들고 1, 3, 4 서버에 키를 복제한다.

서버2로 로그인해서 위 과정 반복한다.

 

 

 

 

-protobuf(2.5.0)버전 설치하기

protobuf는 직렬화 라이브러리이다. 기종이 다른 서버 간의 데이터 통신 혹은 서로 다른 종류의 언어로 개발된 시스템 간의 통신이 많은데 이때 바이너리(Binary)데이터로 데이터를 전송해주는 것 protobuf 라이브러리이다.

 

이를 4개 서버에 모두 설치해준다.

 

root 계정으로 아래 명령어들 실행

su - root
cd /usr/local
wget https://github.com/google/protobuf/releases/download/v2.5.0/protobuf-2.5.0.tar.gz
tar xvfz protobuf-2.5.0.tar.gz
cd protobuf-2.5.0
./configure
make
make install

 

설치가 잘 되었는지 아래 명령어 실행. 아래처럼 나오면 설치 완료

[root@hadoop01 ~]$ protoc --version
libprotoc 2.5.0

 

4개 서버 모두 설치해준다.

 

 

 

 

-Zookeeper 설치하기

네임노드 HA를 구성하려면 먼저 분산 코디네이션인 주키퍼를 설치해야 한다.

 

우선 주키퍼를 전용으로 실행할 수 있는 사용자를 4개 서버에 모두 만든다.

아래 명령어 3개 서버 모두 실행( 주키퍼의 노드는 홀수로만 구성한다. 나는 1, 2, 3서버만 만들었다. )

adduser zookeeper
passwd zookeeper

각 계정의 패스워드는 편의상 zookeeper로 했다.

 

그리고 서버1 zookeeper 계정으로 로그인하고 ssh키를 만들어서 2, 3에 보내준다.

su - zookeeper
ssh-keygen -t rsa

ssh-copy-id -i /home/zookeeper/.ssh/id_rsa.pub zookeeper@hadoop02
ssh-copy-id -i /home/zookeeper/.ssh/id_rsa.pub zookeeper@hadoop03

ssh hadoop02
hostname
exit

ssh hadoop03
hostname
exit

 

그리고 서버1의 zookeeper 계정에서 /home/zookeeper 디렉토리에 주키퍼를 설치한다.

[zookeeper@hadoop01 ~]$ wget https://mirror.navercorp.com/apache/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
[zookeeper@hadoop01 ~]$ tar xvfz apache-zookeeper-3.6.3-bin.tar.gz 

 

그리고 주키퍼 설정을 수정한다.

cd home/zookeeper/apache-zookeeper-3.6.3-bin/conf
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg

아래처럼 수정한다.

# Th  number of milliseconds of each tick
f milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/home/zookeeper/apache-zookeeper-3.6.3-bin/data
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
maxClientCnxns=60
maxSessionTimeout=180000
server.1=192.168.56.120:2888:3888
server.2=192.168.56.121:2888:3888
server.3=192.168.56.122:2888:3888
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

 

이제 /home/zookeeper에 data란 디렉토리를 만든다.

[zookeeper@hadoop01 conf]$ cd /home/zookeeper/apache-zookeeper-3.6.3-bin/
[zookeeper@hadoop01 ~]$ mkdir data

그리고 그 안에 myid란 파일을 만들고 아래처럼 1을 작성한다.

[zookeeper@hadoop01 conf]$ cd /home/zookeeper/apache-zookeeper-3.6.3-bin/data
[zookeeper@hadoop01 ~]$ vi myid

1

 

 

이제 다른 서버에도 주키퍼를 설치해야되는데 scp 명령어를 이용해서 다른 서버에 주키퍼를 보내주도록 하자.

 

[zookeeper@hadoop01 ~]$ tar cvfz zookeeper.tar.gz apache-zookeeper-3.6.3-bin
[zookeeper@hadoop01 ~]$ scp zookeeper.tar.gz zookeeper@hadoop02:/home/zookeeper
zookeeper.tar.gz                                   100% 3091KB  79.8MB/s   00:00    
[zookeeper@hadoop01 ~]$ scp zookeeper.tar.gz zookeeper@hadoop03:/home/zookeeper
zookeeper.tar.gz                                   100% 3091KB  65.9MB/s   00:00 

 

이제 아래 명령어로 원격접속해서 명령어를 실행한다.

[zookeeper@hadoop01 ~]$ ssh hadoop02 "cd /home/zookeeper; tar xvfz zookeeper.tar.gz"
[zookeeper@hadoop01 ~]$ ssh hadoop03 "cd /home/zookeeper; tar xvfz zookeeper.tar.gz"

이때 서버2, 3에 data디렉토리 만들고 myid값은 서버2는 2, 서버3은 3으로 변경해줘야하므로 원격접속해서 수정해준다.

[zookeeper@hadoop01 ~]$ ssh hadoop02
[zookeeper@hadoop02 ~]$ cd apache-zookeeper-3.6.3-bin/data/
[zookeeper@hadoop02 data]$ vi myid
[zookeeper@hadoop02 data]$ exit

 

서버3도 동일하게 진행

[zookeeper@hadoop01 ~]$ ssh hadoop03
Last login: Fri May 21 23:10:25 2021 from hadoop01.com
[zookeeper@hadoop03 ~]$ cd apache-zookeeper-3.6.3-bin/data/
[zookeeper@hadoop03 data]$ vi myid
[zookeeper@hadoop02 data]$ exit

 

다음으로 각 서버마다 주키퍼 실행을 편하게 하기 위해 영구적으로 alias를 지정해준다.

먼저 서버1 . 맨마지막에 alias를 입력한다.

[zookeeper@hadoop01 ~]$ vi $HOME/.bashrc

alias zoo-start="/home/zookeeper/apache-zookeeper-3.6.3-bin/bin/zkServer.sh start"
alias zoo-status="/home/zookeeper/apache-zookeeper-3.6.3-bin/bin/zkServer.sh status"
alias zoo-stop="/home/zookeeper/apache-zookeeper-3.6.3-bin/bin/zkServer.sh stop"

그리고 source 명령어를 실행한다.

[zookeeper@hadoop01 ~]$ source $HOME/.bashrc

서버2와 3도 위와 같이 지정해준다.

 

그리고 환경변수도 설정한다. 서버3대 모두 동일하게 진행한다.

cd
vi .bash_profile

아래와 같이 입력한다.

export ZOOKEEPER_HOME=/home/zookeeper/apache-zookeeper-3.6.3-bin

PATH=$PATH:$HOME/.local/bin:$HOME/bin:$ZOOKEEPER_HOME/bin

export PATH

 

이제 위에서 설정한 alias로 각 서버마다 주키퍼를 실행시키고 status를 확인해본다.

주키퍼가 자동으로 leader 서버와 follower서버를 지정해준다.

 

 

 

이러면 주키퍼 설치는 완료된 것이다.

 

 

 

-하둡 설치하기

먼저 주키퍼는 켜진 상태로 hadoop01 계정으로 돌아간다.

su - hadoop01

그리고 하둡을 설치하고 심볼릭 링크 지정해준다.

[hadoop01@hadoop01 ~]$ wget http://apache.mirror.cdnetworks.com/hadoop/common/hadoop-3.3.0/hadoop-3.3.0.tar.gz
[hadoop01@hadoop01 ~]$ tar -xvzf hadoop-3.3.0.tar.gz
[hadoop01@hadoop01 ~]$ ln -s hadoop-3.3.0 hadoop

사용자계정에 하둡관련 환경변수를 설정한다.

[hadoop01@hadoop01 ~]$ vi ~/.bashrc

export JAVA_HOME=/usr/local/java
export HADOOP_HOME=/home/hadoop01/hadoop
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"

 

 

이제 하둡의 환경변수를 수정해준다.

hadoop-env.sh : 하둡을 실행하는 셸 스크립트 파일에서 필요한 환경변수를 설정

[hadoop01@hadoop01 ~]$ cd hadoop2/etc/hadoop/
[hadoop01@hadoop01 hadoop]$ vi hadoop-env.sh 

export JAVA_HOME=/usr/local/java

 

-싱글 노드 하둡 실행하기

아래 명령어로 홈 디렉토리에서 디렉토리를 생성한다.

mkdir -p ~/hadoopdata/hdfs/namenode 
mkdir -p ~/hadoopdata/hdfs/datanode

그리고 core-site.xml을 수정한다.

vi $HADOOP_HOME/etc/hadoop/core-site.xml

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

 

이번에는 hdfs-site.xml을 수정한다.

vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml

        <property>
                <name>dfs.replication</name>
                <value>1</value>
        </property>
        <property>
                <name>dfs.name.dir</name>
                <value>file:///home/hadoop01/hadoopdata/hdfs/namenode</value>
        </property>
        <property>
                <name>dfs.data.dir</name>
                <value>file:///home/hadoop01/hadoopdata/hdfs/datanode</value>
        </property>

 

다음으로 mapred-site.xml을 수정한다.

        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
        <property>
                <name>yarn.app.mapreduce.am.env</name>
                <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
        </property>
        <property>
                <name>mapreduce.map.env</name>
                <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
        </property>
        <property>
                <name>mapreduce.reduce.env</name>
                <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
        </property>

다음으로 yarn-site.xml을 수정한다.

vi $HADOOP_HOME/etc/hadoop/yarn-site.xml

        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
        <property>
                <name>yarn.nodemanager.vmem-check-enabled</name>
                <value>false</value>
        </property>

이제 수정은 다 되었고 네임노드를 포맷한다. 아래처럼 출력되면 성공이다.

/home/hadoop01/hadoop/bin/hdfs namenode -format



21/05/22 12:14:38 INFO namenode.FSImageFormatProtobuf: Image file /home/hadoop01/hadoopdata/hdfs/namenode/current/fsimage.ckpt_0000000000000000000 of size 327 bytes saved in 0 seconds .
21/05/22 12:14:38 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
21/05/22 12:14:38 INFO namenode.FSImage: FSImageSaver clean checkpoint: txid = 0 when meet shutdown.
21/05/22 12:14:38 INFO namenode.NameNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at hadoop01/192.168.56.120
************************************************************/

이제 dfs와 yarn을 실행한다. 비밀번호치라고나오면 비밀번호 입력한다.

[hadoop01@hadoop01 ~]$ /home/hadoop01/hadoop/sbin/start-dfs.sh 
[hadoop01@hadoop01 ~]$ /home/hadoop01/hadoop/sbin/start-yarn.sh 

아래 명령어로 제대로 실행되는지 확인한다.

jps

7009 NodeManager
5027 DataNode
7315 Jps
4884 NameNode
6886 ResourceManager
5213 SecondaryNameNode

 아래 명령어를 통해 yarn이 잘 실행되는지 확인해본다. 나는 거의 2분정도 걸렸다.

cd $HADOOP_HOME
yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar pi 16 1000


~
Job Finished in 124.483 seconds
Estimated value of Pi is 3.14250000000000000000

이제 hdfs도 테스트해본다.

hdfs dfs -mkdir /test1
hdfs dfs -mkdir /test2

아래 명령어로 디렉토리가 조회되는지 확인해본다.

hdfs dfs -ls /


Found 2 items 
drwxr-xr-x - hadoop supergroup 0 2020-02-05 03:25 /test1 
drwxr-xr-x - hadoop supergroup 0 2020-02-05 03:35 /test2

이제 워트카운트를 실행해본다.

hdfs dfs -mkdir /user
hdfs dfs -mkdir /user/root
hdfs dfs -mkdir /user/root/conf
hdfs dfs -mkdir /input
hdfs dfs -copyFromLocal $HADOOP_HOME/README.txt /input
hdfs dfs -ls /input

실행

hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar wordcount /input/README.txt ~/wordcount-output
hdfs dfs -ls ~/wordcount-output


Found 2 items
-rw-r--r--   1 hadoop supergroup          0 2020-09-03 03:43 /home/hadoop/wordcount-output/_SUCCESS
-rw-r--r--   1 hadoop supergroup        188 2020-09-03 03:43 /home/hadoop/wordcount-output/part-r-00000



hdfs dfs -cat ~/wordcount-output/part-r-00000


For	1
Hadoop,	1
about	1
and	1
at:	2
http://hadoop.apache.org/	1
https://cwiki.apache.org/confluence/display/HADOOP/	1
information	1
latest	1
our	2
please	1
the	1
visit	1
website	1
wiki,	1

이제 네임노드와 리소스매니저를 종료시킨다.

stop-yarn.sh
stop-dfs.sh

 

 

 

-완전 분산 모드 구축하기

서버1의 core-site.xml을 수정한다.

[hadoop01@hadoop01 ~]$ vi /home/hadoop01/hadoop/etc/hadoop/core-site.xml

<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://hadoop-cluster</value>
        </property>
        <property>
                <name>ha.zookeeper.quorum</name>
                <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
        </property>
</configuration>

 

서버1에서 hdfs-site.xml을 수정한다.

vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml
<configuration>
        <property>
                <name>dfs.namenode.name.dir</name>
                <value>/home/hadoop01/hadoopdata/hdfs/namenode</value>
        </property>
        <property>
                <name>dfs.datanode.data.dir</name>
                <value>/home/hadoop01/hadoopdata/hdfs/datanode</value>
        </property>
        <property>
                <name>dfs.journalnode.edits.dir</name>
                <value>/home/hadoop01/hadoopdata/hdfs/journalnode</value>
        </property>
        <property>
                <name>dfs.nameservices</name>
				<value>hadoop-cluster</value>
        </property>
        <property>
                <name>dfs.ha.namenodes.hadoop-cluster</name>
                <value>nn1,nn2</value>
        </property>
        <property>
                <name>dfs.namenode.rpc-address.hadoop-cluster.nn1</name>
                <value>hadoop01:8020</value>
        </property>
        <property>
                <name>dfs.namenode.rpc-address.hadoop-cluster.nn2</name>
                <value>hadoop02:8020</value>
        </property>
        <property>
                <name>dfs.namenode.http-address.hadoop-cluster.nn1</name>
                <value>hadoop01:50070</value>
        </property>
        <property>
                <name>dfs.namenode.http-address.hadoop-cluster.nn2</name>
                <value>hadoop02:50070</value>
        </property>
        <property>
                <name>dfs.namenode.shared.edits.dir</name>
                <value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/hadoop-cluster</value>
        </property>
        <property>
                <name>dfs.client.failover.proxy.provider.hadoop-cluster</name>
                <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        </property>
        <property>
                <name>dfs.ha.fencing.methods</name>
                <value>shell(/bin/true)</value>
        </property>
        <!-- Automatic failover configuration -->
        <property>
                <name>dfs.ha.automatic-failover.enabled</name>
                <value>true</value>
        </property>
</configuration>

 

다음으로 yarn-env.sh를 수정한다.

[hadoop01@hadoop01 ~]$ vi /home/hadoop01/hadoop/etc/hadoop/yarn-env.sh

JAVA_HEAP_MAX=Xmx1000m

 

다음으로 yarn-site.xml을 수정한다.

vi $HADOOP_HOME/etc/hadoop/yarn-site.xml

<configuration>
        <!-- Site specific YARN configuration properties -->
        <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.nodemanager.local-dirs</name>
                <value>/home/hadoop01/hadoopdata/yarn/nm-local-dir</value>
        </property>
        <property>
                <name>yarn.resourcemanager.fs.state-store.uri</name>
                <value>/home/hadoop01/hadoopdata/yarn/system/rmstore</value>
        </property>
        </property>
        <property>
                <name>yarn.resourcemanager.hostname</name>
                <value>hadoop01</value>
        </property>
        <property>
                <name>yarn.web-proxy.address</name>
                <value>0.0.0.0:8089</value>
        </property>

        <!-- for Resource Manager HA configuration -->
        <property>
                <name>yarn.resourcemanager.ha.enabled</name>
                <value>true</value>
        </property>
        <property>
                <name>yarn.resourcemanager.cluster-id</name>
                <value>cluster1</value>
        </property>
        <property>
                <name>yarn.resourcemanager.ha.rm-ids</name>
                <value>rm1,rm2</value>
        </property>
        <property>
                <name>yarn.resourcemanager.hostname.rm1</name>
                <value>hadoop01</value>
        </property>
        <property>
                <name>yarn.resourcemanager.hostname.rm2</name>
                <value>hadoop02</value>
        </property>
        <property>
                <name>yarn.resourcemanager.webapp.address.rm1</name>
                <value>hadoop01:8088</value>
        </property>
        <property>
                <name>yarn.resourcemanager.webapp.address.rm2</name>
                <value>hadoop02:8088</value>
        </property>
        <property>
                <name>hadoop.zk.address</name>
                <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
        </property>
</configuration>

 

 

다음으로 workers를 수정한다.

vi $HADOOP_HOME/etc/hadoop/workers

hadoop02
hadoop03
hadoop04

 

이제 마스터 노드의 설정파일을 모두 슬레이브 노드에 배포시킨다.

cd
scp -rp /home/hadoop01/hadoop-3.3.0 hadoop01@hadoop02:/home/hadoop01
scp -rp /home/hadoop01/hadoop-3.3.0 hadoop01@hadoop03:/home/hadoop01
scp -rp /home/hadoop01/hadoop-3.3.0 hadoop01@hadoop04:/home/hadoop01

 

이제 각각 서버2,3,4도 ~/.bashrc에 내용을 추가하고 source명령어로 설정시킨다.

vi ~/.bashrc

아래 내용을 추가

export JAVA_HOME=/usr/local/java
export HADOOP_HOME=/home/hadoop01/hadoop
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"

source명령어로 적용

source ~/.bashrc

 

그리고 심볼릭 링크를 설정한다.

ln -s hadoop-3.3.0/ hadoop

 

 

이제 각 서버마다 hadoopdata/hdfs를 비워준다. 아래 명령어를 모두 실행한다.

서버 3, 4에 hadoopdata/hdfs 디렉토리가 없을 경우 만들어준다.

rm -rf hadoopdata/*/*

 

 

이제 3개 서버에서 주키퍼를 켜놓은 상태로 서버1 하둡 마스터 노드에서만 아래 명령어를 통해 주키퍼를 초기화시킨다. 

[hadoop01@hadoop01 ~]$ $HADOOP_HOME/bin/hdfs zkfc -formatZK

아래와 같이 출력되면 초기화된것이다.

~~
2021-05-24 09:34:37,056 INFO zookeeper.ClientCnxn: Socket connection established, initiating session, client: /192.168.56.120:52226, server: hadoop02/192.168.56.121:2181
2021-05-24 09:34:37,073 INFO zookeeper.ClientCnxn: Session establishment complete on server hadoop02/192.168.56.121:2181, sessionid = 0x200001585ed0000, negotiated timeout = 10000
2021-05-24 09:34:37,124 INFO ha.ActiveStandbyElector: Successfully created /hadoop-ha/hadoop-cluster in ZK.
2021-05-24 09:34:37,233 INFO zookeeper.ZooKeeper: Session: 0x200001585ed0000 closed
2021-05-24 09:34:37,234 WARN ha.ActiveStandbyElector: Ignoring stale result from old client with sessionId 0x200001585ed0000
2021-05-24 09:34:37,234 WARN ha.ActiveStandbyElector: Ignoring stale result from old client with sessionId 0x200001585ed0000
2021-05-24 09:34:37,234 INFO zookeeper.ClientCnxn: EventThread shut down for session: 0x200001585ed0000
2021-05-24 09:34:37,236 INFO tools.DFSZKFailoverController: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down DFSZKFailoverController at hadoop01/192.168.56.120
************************************************************/

 

 

다음으로 서버1, 2, 3에서 하둡 저널노드를 실행시킨다.

[hadoop01@hadoop01 ~]$ $HADOOP_HOME/bin/hdfs --daemon start journalnode

 

아무것도 출력안되면 성공

 

이제 서버1에서만 액티브 노를 실행시킨다.

그 전에 먼저 hdfs를 포맷시킨다.

[hadoop01@hadoop01 ~]$ hdfs namenode -format

~~
2021-05-24 09:38:57,622 INFO namenode.FSNamesystem: Retry cache will use 0.03 of total heap and retry cache entry expiry time is 600000 millis
2021-05-24 09:38:57,644 INFO util.GSet: Computing capacity for map NameNodeRetryCache
2021-05-24 09:38:57,644 INFO util.GSet: VM type       = 64-bit
2021-05-24 09:38:57,644 INFO util.GSet: 0.029999999329447746% max memory 433.1 MB = 133.1 KB
2021-05-24 09:38:57,644 INFO util.GSet: capacity      = 2^14 = 16384 entries
2021-05-24 09:38:58,924 INFO namenode.FSImage: Allocated new BlockPoolId: BP-1970564106-192.168.56.120-1621816738924
2021-05-24 09:38:58,984 INFO common.Storage: Storage directory /home/hadoop01/hadoopdata/hdfs/namenode has been successfully formatted.
2021-05-24 09:38:59,147 INFO namenode.FSImageFormatProtobuf: Saving image file /home/hadoop01/hadoopdata/hdfs/namenode/current/fsimage.ckpt_0000000000000000000 using no compression
2021-05-24 09:38:59,263 INFO namenode.FSImageFormatProtobuf: Image file /home/hadoop01/hadoopdata/hdfs/namenode/current/fsimage.ckpt_0000000000000000000 of size 400 bytes saved in 0 seconds .
2021-05-24 09:38:59,274 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
2021-05-24 09:38:59,334 INFO namenode.FSImage: FSImageSaver clean checkpoint: txid=0 when meet shutdown.
2021-05-24 09:38:59,334 INFO namenode.NameNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at hadoop01/192.168.56.120
************************************************************/

 

이제 Active Namenode를 실행한다.

[hadoop01@hadoop01 ~]$ $HADOOP_HOME/bin/hdfs --daemon start namenode

아무것도 안뜨면 성공

 

 

이제 서버2에서 대기중인 stanby 네임노드를 실행한다.

그 전에 서버1에서 메타데이터를 복사해와야한다.

[hadoop01@hadoop02 ~]$ hdfs namenode -bootstrapStandby

~~
=====================================================
About to bootstrap Standby ID nn2 from:
           Nameservice ID: hadoop-cluster
        Other Namenode ID: nn1
  Other NN's HTTP address: http://hadoop01:50070
  Other NN's IPC  address: hadoop01/192.168.56.120:8020
             Namespace ID: 55955308
            Block pool ID: BP-1970564106-192.168.56.120-1621816738924
               Cluster ID: CID-67d8bfa9-ea3d-49d3-b73e-3c59b99a4180
           Layout version: -65
       isUpgradeFinalized: true
=====================================================
2021-05-24 09:41:36,640 INFO common.Storage: Storage directory /home/hadoop01/hadoopdata/hdfs/namenode has been successfully formatted.
2021-05-24 09:41:36,661 INFO common.Util: Assuming 'file' scheme for path /home/hadoop01/hadoopdata/hdfs/namenode in configuration.
2021-05-24 09:41:36,661 INFO common.Util: Assuming 'file' scheme for path /home/hadoop01/hadoopdata/hdfs/namenode in configuration.
2021-05-24 09:41:36,714 INFO namenode.FSEditLog: Edit logging is async:true
2021-05-24 09:41:36,838 INFO namenode.TransferFsImage: Opening connection to http://hadoop01:50070/imagetransfer?getimage=1&txid=0&storageInfo=-65:55955308:1621816738924:CID-67d8bfa9-ea3d-49d3-b73e-3c59b99a4180&bootstrapstandby=true
2021-05-24 09:41:36,942 INFO common.Util: Combined time for file download and fsync to all disks took 0.00s. The file download took 0.00s at 0.00 KB/s. Synchronous (fsync) write to disk of /home/hadoop01/hadoopdata/hdfs/namenode/current/fsimage.ckpt_0000000000000000000 took 0.00s.
2021-05-24 09:41:36,942 INFO namenode.TransferFsImage: Downloaded file fsimage.ckpt_0000000000000000000 size 400 bytes.
2021-05-24 09:41:36,980 INFO ha.BootstrapStandby: Skipping InMemoryAliasMap bootstrap as it was not configured
2021-05-24 09:41:37,000 INFO namenode.NameNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at hadoop02/192.168.56.121
************************************************************/

메타데이터가 복사가 됐으면 스탠바이 네임노드를 실행한다.

[hadoop01@hadoop02 ~]$ $HADOOP_HOME/bin/hdfs --daemon start namenode

아무것도 안뜨면 성공이다.

 

 

다음으로 주키퍼 장애 컨트롤러를 실행한다. 이는 서버1, 2에서만 실행한다.

만약 마스터서버가 장애가 나면 주키퍼 장애 컨트롤러가 서버2의 스탠바이 노드를 액티브 노드로 바꿔준다.

[hadoop01@hadoop01 ~]$ $HADOOP_HOME/bin/hdfs --daemon start zkfc
[hadoop01@hadoop02 ~]$ $HADOOP_HOME/bin/hdfs --daemon start zkfc

아무것도 안뜨면 성공

 

 

이제 데이터 노드들을 실행시킨다. 서버2, 3, 4를 아래 명령어로 실행시킨다.

[hadoop01@hadoop02 ~]$ $HADOOP_HOME/bin/hdfs --daemon start datanode
[hadoop01@hadoop03 ~]$ $HADOOP_HOME/bin/hdfs --daemon start datanode
[hadoop01@hadoop04 ~]$ $HADOOP_HOME/bin/hdfs --daemon start datanode

아무것도 안뜨면 성공

 

다음으로 서버1에서만 yarn을 실행시킨다.

[hadoop01@hadoop01 ~]$ start-yarn.sh

 

그리고 서버 1, 2에서 히스토리서버를 실행시킨다.

[hadoop01@hadoop01 ~]$ $HADOOP_HOME/bin/mapred --daemon start historyserver
[hadoop01@hadoop02 ~]$ $HADOOP_HOME/bin/mapred --daemon start historyserver

 

 

이제 jps명령으로 서버들이 잘 구동되는지 확인한다.

[hadoop01@hadoop01 ~]$ jps
4832 DFSZKFailoverController
5154 ResourceManager
4982 JobHistoryServer
5367 WebAppProxyServer
4648 NameNode
5643 Jps
4446 JournalNode


[hadoop01@hadoop02 ~]$ jps
9939 DFSZKFailoverController
10051 ResourceManager
10467 Jps
10378 JobHistoryServer
9581 NameNode
10142 NodeManager
9679 DataNode
9791 JournalNode


[hadoop01@hadoop03 ~]$ jps
7123 DataNode
7235 JournalNode
7354 NodeManager
7549 Jps


[hadoop01@hadoop04 hadoopdata]$ jps
6721 NodeManager
6945 DataNode
6991 Jps

 

또한 아래 명령어로 리소스 매니저의 상태를 확인한다.

[hadoop01@hadoop01 ~]$ yarn rmadmin -getServiceState rm1
active
[hadoop01@hadoop01 ~]$ yarn rmadmin -getServiceState rm2
standby

 

 

웹브라우저에서 http://hadoop01:50070 과 http://hadoop02:50070 으로 확인합니다.

active와 standby가 표시되어야 잘 실행이 된 것이다.

 

 

 

 

하둡은  http://192.168.56.120:8088/

 

 

 

이제 서버1에서 기본 명령어부터 실행되는지 확인한다.

hdfs dfs -mkdir /test1
hdfs dfs -ls /
Found 1 items
drwxr-xr-x   - hadoop01 supergroup          0 2021-05-22 15:07 /test1

 

 

워드카운트를 다시 실행해보자.

hdfs dfs -mkdir -p /user/root/conf
hdfs dfs -mkdir /input
hdfs dfs -copyFromLocal $HADOOP_HOME/README.txt /input
hdfs dfs -ls /input

hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar wordcount /input/README.txt ~/wordcount-output

 

결과를 확인해본다.

hdfs dfs -ls ~/wordcount-output
hdfs dfs -cat ~/wordcount-output/part-r-00000

잘 실행된 것을 확인할 수 있다.

 

 

 

 

이제 리소스 매니저에 대한 Fail-Over 테스트를 해보자.

서버1에서 강제로 리소스 매니저를 종료시킨다.

[hadoop01@hadoop01 ~]$ jps
16227 ResourceManager
15429 NameNode
16565 WebAppProxyServer
16757 JobHistoryServer
15686 JournalNode
15879 DFSZKFailoverController
17135 Jps

[hadoop01@hadoop01 ~]$ kill -9 16227

[hadoop01@hadoop01 ~]$ jps
17171 Jps
15429 NameNode
16565 WebAppProxyServer
16757 JobHistoryServer
15686 JournalNode
15879 DFSZKFailoverController

그리고 리소스 매니저의 상태를 다시 출력해본다. 서버1은 에러가 나오고 서버2가 standby에서 active로 바뀐 것을 알 수 있다.

[hadoop01@hadoop01 ~]$ yarn rmadmin -getServiceState rm1
2021-05-24 10:53:23,505 INFO ipc.Client: Retrying connect to server: hadoop01/192.168.56.120:8033. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=1, sleepTime=1000 MILLISECONDS)
Operation failed: Call From hadoop01/192.168.56.120 to hadoop01:8033 failed on connection exception: java.net.ConnectException: 연결이 거부됨; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused

[hadoop01@hadoop01 ~]$ yarn rmadmin -getServiceState rm2
active

 

다음 명령으로 sample job을 실행해서 잘 실행되는 지 확인한다.

[hadoop01@hadoop01 ~]$ yarn jar  $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar pi 16 1000

 

 

잘 실행되니 이제 종료시킨다.

[hadoop01@hadoop01 ~]$ stop-all.sh
[hadoop01@hadoop01 ~]$ $HADOOP_HOME/bin/mapred --daemon stop historyserver
[hadoop01@hadoop02 ~]$ $HADOOP_HOME/bin/mapred --daemon stop historyserver

 

 

 

 

 

728x90
반응형
LIST
Comments