먹수의 개발일지

[Docker] Ubuntu에 Hadoop 클러스터 구성하기 본문

데이터 엔지니어링/Hadoop

[Docker] Ubuntu에 Hadoop 클러스터 구성하기

icandle 2023. 8. 7. 00:03

클러스터 구축 방향 및 환경

일반적으로 다수의 컴퓨터로 하둡 클러스터를 구성하지만 다수의 컴퓨터를 보유하여 진행하기 어렵기 때문에, 하나의 컴퓨터에서 docker를 활용하여 클러스터를 구성하려고 한다.

  • 로컬 환경 : Mac OS
  • Docker OS : Ubutu 22.04
  • Hadoop 3.3.6
  • NameNode  1개,  DataNode  3개

Ubuntu에 Hadoop 설치를 위한 환경 세팅

Docker를 통한 Ubuntu 이미지 다운로드 및 container 생성

사용할 Ubuntu 버전의 이미지를 다운로드 및 실행한다.

$ docker run ubuntu:22.04

만약 다운받은 이미지를 원하는 이름으로 다시 만들고 싶거나 새로운 container를 만들고 싶다면 아래와 같이 이름(ubuntu)로 지정하여 실행해주면 된다. 

$ docker run --restart always --name ubuntu -dt ubuntu:22.04

실행중인 ubuntu 컨테이너에 접속한다.

$ docker exec -it ubuntu /bin/bash

 

기본 프로그램 설치 및 환경설정

ubuntu라는 이름의 container에  hadoop과 기타 프로그램들을 설치한 뒤 이미지화시켜 다수의 container를 생성해보자.

→ 하둡 클러스터는 여러개의 서버가 필요한데, 각 서버마다 세팅을 하기는 번거롭기 때문이다.

ref) Hadoop - Supported Java Versions 확인

 

기본 프로그램(wget, vim, ssh, java)을 설치한다.

$ apt-get update
$ apt install wget -y
$ apt install vim -y
$ apt install openssh-server openssh-client -y
$ apt install openjdk-8-jdk -y

공개키를 생성한다. 

$ ssh-keygen -t rsa -b 4096 -P '' -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

$ sudo ssh-keygen -A

java 환경변수 설정을 위해 java가 설치된 경로를 확인하고, bashrc 파일에 JAVA_HOME과 HADOOP_CLASSPATH를 추가한다.

readlink의 결과에서 전체가 아닌 jre 이전까지 경로를 JAVA_HOME에 넣어주자.

$ readlink -f /usr/bin/java
# /usr/lib/jvm/java-8-openjdk-arm64/jre/bin/java 
$ vim ~/.bashrc
#bashrc 
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar

 

Hadoop 설치하기 

hadoop  3.3.6 버전을 사용했다. 설치할 hadoop을 확인한 후 설치 및 압축을 해제해준다.

ref) 설치 가능한 hadoop 버전 확인

$ mkdir hadoop_home
$ cd hadoop_home

$ wget <https://archive.apache.org/dist/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz>
$ tar -xvzf hadoop-3.3.6.tar.gz

hadoop이 설치 되었다면 bashrc 파일에 환경변수를 설정한다. hadoop을 설치한 경로에서 pwd로 위치를 확인한 후 해당 경로를 입력해 준다. 

$ pwd  
# /home/hadoop_home 
$ vim ~/.bashrc
#bashrc
.
.
export HADOOP_HOME=/home/hadoop_home/hadoop-3.3.6
export HADOOP_CONFIG_HOME=$HADOOP_HOME/etc/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
.
.
$ source ~/.bashrc

 

Hadoop 설정 파일 세팅

아래 경로로 이동하여 3개의  hadoop  설정 파일들을 수정한다.

$ cd $HADOOP_CONFIG_HOME

fs.default.name의 value는 추후에 세팅할 NameNode의 hostname을 적어주면 된다. 여기서는 참고한 블로그와 동일하게 nn으로 지정하였다.

 

1) core-site.xml

<!-- core-site.xml -->
<configuration>
	<!-- 하둡에서 발생하는 임시 데이터를 저장하기 위한 공간 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/hadoop_home/temp</value>
    </property>
	 <!-- 모든 데이터 노드들이 nameNode에 9000번 포트로 통신을 한다 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://nn:9000</value>
        <final>true</final>
    </property>
</configuration>

2) hdfs-site.xml

<!-- hdfs-site.xml -->
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
        <final>true</final>
    </property>
	 <!-- 네임노드의 HDFS 파일시스템 메타데이터를 저장하는 경로의 목록 --> 
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/hadoop_home/namenode_dir</value>
        <final>true</final>
    </property>
	 <!-- 데이터노드의 HDFS 블록을 저장하는 경로의 목록 --> 
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/hadoop_home/datanode_dir</value>
        <final>true</final>
    </property>
</configuration>

 

hadoop.tmp.dir, dfs.namenode.name.dir, dfs.datanode.data.dir의 value에는 각 데이터를 저장할 경로를 적어주고, 해당 폴더들을 생성한다.

$ mkdir /hadoop_home/temp
$ mkdir /hadoop_home/namenode_dir
$ mkdir /hadoop_home/datanode_dir

 

3) mapred-site.xml

  • Hadoop YARN을 위한 실행 프레임워크 classic, local, yarn 을 선택할 수 있다.
  • yarn을 선택했을 경우 yarn-site.xml을 경우 내용을 추가해줘야 한다.
<!-- mapred-site.xml -->
<configuration>
    <property>
        <name>mapred.job.tracker</name>
        <value>nn:9001</value>
    </property>
</configuration>

+) hadoop-env.sh

  • 추후에 hadoop을 root로 실행할 경우 아래 설정을 추가해줘야한다. 하지만 별도의 hadoop user로 실행하도록 권장한다. 
export HDFS_NAMENODE_USER="root"
export HDFS_DATANODE_USER="root"
export HDFS_SECONDARYNAMENODE_USER="root"
export YARN_RESOURCEMANAGER_USER="root"
export YARN_NODEMANAGER_USER="root"

마지막으로 NameNode를 포맷해주고 docker container 접속을 종료한다.

$ hdfs namenode -format
$ exit

 

Hadoop 클러스터 구성 및 실행

작업한 컨테이너를 commit하여 하둡 base이미지를 생성한다.

# docker commit [작업한 컨테이너명] [원하는 이미지명:태그] 
$ docker commit ubuntu hadoop:v1

hadoop 클러스터는  NameNode  1개,  DataNode  3개로 구성하겠다.

 

NameNode container를 실행한다.

  • --network hadoop-net : 미리 생성해둔 docker network에 연결해준다. 기존에 사용되던 link옵션은 legacy로 삭제될 예정이기 때문에 docker network를 사용했다. 같은 호스트내에서 container들이 연결될 수 있도록 해주기 위한 작업이다.  
  • -h nn : 컨테이너의 호스트 이름을 nn으로 설정한 것이다.
  • hadoop 3버전부터는 default 포트가 9870으로 변경되었다.
$ docker run -d --network hadoop-net -it -h nn --name nn -p 9870:9870 hadoop:v1 /sbin/init

 

DataNode container 3개를 각각 실행한다.

#DataNode1
$ docker run -d --network hadoop-net -it -h dn1 --name dn1 hadoop:v1 /sbin/init
#DataNode2
$ docker run -d --network hadoop-net -it -h dn2 --name dn2 hadoop:v1 /sbin/init
#DataNode3
$ docker run -d --network hadoop-net -it -h dn3 --name dn3 hadoop:v1 /sbin/init

 

NameNode와 DataNode 연결하기

hadoop 구성을 위해선  NameNode 가  DataNode 의 ip를 알아야한다.

docker inspect 명령어를 통해 확인할 수 있다.

$ docker inspect nn | grep IPAddress
$ docker inspect dn1 | grep IPAddress
$ docker inspect dn2 | grep IPAddress
$ docker inspect dn3 | grep IPAddress

NameNode 컨테이너에 접속하여 서 DataNode에 해당하는 hosts 정보를 아래처럼 입력한다.

$ vim /etc/hosts
#hosts
....
172.18.0.2      nn
172.18.0.3      dn1
172.18.0.4      dn2
172.18.0.5      dn3

→ container를 stop 시키고 재실행했을 때 hosts 파일은 초기화된다. 그래서 매번 conatiner를 다시 시작할 때마다 hosts 파일을 작성하고 싶지 않다면 shell script를 만들어 놓으면 좋을 것 같다.

 

DataNode들의 서버를 지정해줘야 한다.

/* NameNode Terminal */
$ cd $HADOOP_CONFIG_HOME
$ vim workers
#workers

dn1
dn2
dn3

 

Hadoop 실행하기

start-all.sh
# 모든 프로세스 종료하기
#stop-all.sh   

아래 명령어로 하둡 프로세스가 잘 작동하는지 확인할 수 있다.

jps

마지막으로 localhost:9870으로 접속하면 하둡 UI페이지를 확인할 수 있다. 

 

References

https://bernardosr1.medium.com/setting-up-hadoop-with-2-workers-linux-aa5870a63af

https://taaewoo.tistory.com/19?category=862614.

Comments