Centos에서 docker기반 Hadoop cluster 구축하기

March 21st, 2020

개요

centos 운영체제 위에 Hadoop cluster를 올리는 실습이다. 1개 PC에 여러 노드를 올려서 각 노드간 통신이 원활하게 이루어지는지 파악해보려고 한다.

궁극적으로는 아래 저장소의 하둡 클러스터를 가상 centos 운영체제에 올리는 것이 목표이다

centos 설치

아래 링크를 참조하여 VirtualBox에 Centos 이미지를 설치하자

centos에 docker 설치

설치를 완료했으면 운영체제로 접근하여 docker를 설치 해보자. 아래 링크를 참고하여 진행하였다

일단 가상 OS 내에서 도커를 설치한다.

centos7 은 다음처럼 설치한다.

# yum 업데이트
yum -y update
# 도커 및 도커 레지스트리 설치
yum -y install docker docker-registry
# docker service 부팅시 시작하도록 등록
systemctl enable docker.service 
# docker service 시작
systemctl start docker.service

centos8 인 경우는 다음처럼 설치한다.

dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
dnf install docker-ce --nobest -y
# docker service 부팅시 시작하도록 등록
systemctl enable docker
# docker service 시작
systemctl start docker

docker 명령어를 입력해서 정상 설치되었는지 확인해보자

[root@localhost ~]# docker --version
Docker version 19.03.8, build afacb8b

centos에 하둡 클러스터 설치

아래 저장소를 이용하였고 저장소의 README문서를 참조하였다.

근데 centos 이미지에 git이 없다.. 설치하자-_-;;

# centos7
yum -y install git
# centos8
dnf -y install git

이제 저장소를 클론받자. 필자는 /home 폴더에 받았다.

cd /home
git clone https://github.com/kiwenlau/hadoop-cluster-docker

하둡 이미지를 받아주자

docker pull kiwenlau/hadoop:1.0

하둡 끼리 통신이 가능하도록 브리지 네트워크를 생성하자

docker network create --driver=bridge hadoop

클러스터 컨테이너를 시작해보자

cd hadoop-cluster-docker
./start-container.sh
------------------------------
start hadoop-master container...
start hadoop-slave1 container...
start hadoop-slave2 container...
root@hadoop-master:~# 

1개의 마스터와 2개의 슬레이브가 올라오고 나서 hadoop-master 노드로 진입한 것을 확인할 수 있다. 예제를 실행해보자.

# 하둡 실행
./start-hadoop.sh
----------------------------

Starting namenodes on [hadoop-master]
hadoop-master: Warning: Permanently added 'hadoop-master,172.18.0.2' (ECDSA) to the list of known hosts.
hadoop-master: namenode running as process 177. Stop it first.
hadoop-slave2: Warning: Permanently added 'hadoop-slave2,172.18.0.4' (ECDSA) to the list of known hosts.
hadoop-slave1: Warning: Permanently added 'hadoop-slave1,172.18.0.3' (ECDSA) to the list of known hosts.
hadoop-slave1: starting datanode, logging to /usr/local/hadoop/logs/hadoop-root-datanode-hadoop-slave1.out
hadoop-slave2: starting datanode, logging to /usr/local/hadoop/logs/hadoop-root-datanode-hadoop-slave2.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: Warning: Permanently added '0.0.0.0' (ECDSA) to the list of known hosts.
0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop/logs/hadoop-root-secondarynamenode-hadoop-master.out


starting yarn daemons
starting resourcemanager, logging to /usr/local/hadoop/logs/yarn--resourcemanager-hadoop-master.out
hadoop-slave2: Warning: Permanently added 'hadoop-slave2,172.18.0.4' (ECDSA) to the list of known hosts.
hadoop-slave1: Warning: Permanently added 'hadoop-slave1,172.18.0.3' (ECDSA) to the list of known hosts.
hadoop-slave2: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-root-nodemanager-hadoop-slave2.out
hadoop-slave1: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-root-nodemanager-hadoop-slave1.out

혹시 slave와 연결시 no route to host 22 에러가 뜬다면 centos의 방화벽이 docker의 필터리스트를 제대로 처리해주지 못해서이다. 필자는 그냥 방화벽을 꺼버렸다. 링크 참조

예제를 이어서 실행해보자

./run-wordcount.sh
--------------------------------
....

input file1.txt:
Hello Hadoop

input file2.txt:
Hello Docker

wordcount output:
Docker  1
Hadoop  1
Hello   2

일단 이렇게 하둡 마스터/슬레이브 노드 연결까지 성공했다. 깃허브 예제에는 resize 예제로 slave 노드 개수를 조절할 수 있으니 이것도 해볼 사람은 해보자.