데이터 엔지니어링/빅데이터

Hadoop Fully-distributed with Docker

Malachai Lee 2022. 5. 17. 00:03

존 pseudo-distribute를 변형하여 세팅할 수 있지만, 새로 이미지를 생성해볼것이다.

참고: 도커(Docker)에 하둡(Hadoop) 클러스터 띄우기

 

도커(Docker)에 하둡(Hadoop) 클러스터 띄우기

하둡 HDFS 코드리뷰를 진행하면서 테스트용 클러스터를 구축할 필요가 있었습니다. 실제 개발 장비에 설치되어 있는 하둡 클러스터를 이용해 볼 수 있었지만 도커에 하둡을 띄워보면 어떨까 생

soft.plusblog.co.kr

 

CentOS 컨테이너 생성 후, 기본적인 설정을 한다.

> docker run -it --name hadoop-base centos

> mkdir -p /opt/jdk        추후 javac 심볼릭 링크 및 홈, PATH 설정을 위해 생성
> mkdir -p /opt/hadoop        하둡 홈 디렉토리
> mkdir -p /data/tmp        추후 하둡 환경에서 발생하는 로그 등의 파일 저장

> yum update -y
> yum install -y net-tools
> yum install -y vim-enhanced
> yum install -y wget
> yum install -y openssh-server openssh-clients openssh-askpass

Java를 설치하고 jdk 심볼릭 링크를 생성한다.

> yum install java-1.8.0-openjdk-devel.x86_64 -y
> which javac
/usr/bin/javac
> readlink -f /usr/bin/javac
> ln -s /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.332.b09-1.el7_9.x86_64 /opt/jdk/current

Java 환경변수를 정의한다.

> vim /etc/profile
...
export JAVA_HOME=/opt/jdk/current
export PATH=$PATH:$JAVA_HOME/bin

 

Hadoop을 설치하고, 심볼릭 링크를 생성한다.

> cd /opt/hadoop
> wget <https://mirrors.sonic.net/apache/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz>
> tar xvzf hadoop-3.3.1.tar.gz
> ln -s /opt/hadoop/hadoop-3.3.1 /opt/hadoop/current

Hadoop 환경변수를 정의한다.

> vim /etc/profile
...
export HADOOP_HOME=/opt/hadoop/current
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

 

sshd를 설정하고, 컨테이너 시작 시 자동 실행 설정한다.

> ssh-keygen -f /etc/ssh/ssh_host_rsa_key -t rsa -N ""
> ssh-keygen -f /etc/ssh/ssh_host_ecdsa_key -t ecdsa -N ""
> ssh-keygen -f /etc/ssh/ssh_host_ed25519_key -t ed25519 -N ""

> vim /etc/profile
...
/bin/sbin/sshd

> source /etc/profile

ssh 통신을 위한 key를 생성한다.

> ssh-keygen -t rsa -P ""
> cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

> ssh localhost // 테스트

 

Hadoop을 설정한다.

> cd $HADOOP_HOME/etc/hadoop
> vim hadoop-env.sh
...
export HADOOP_PID_DIR=/opt/hadoop/current/pids
export JAVA_HOME=/opt/jdk/current
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"
# vim core-site.xml
...
<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://master01:9000</value>
        </property>
</configuration>

> vim hdfs-site.xml
...
<configuration>
        <property>
                <name>dfs.replication</name>
                <value>3</value>
        </property>
        <property>
                <name>dfs.permissions</name>
                <value>false</value>
        </property>
        <property>
                <name>dfs.datanode.data.dir</name>
                <value>file:/opt/hadoop/current/data/datanode</value>
        </property>
</configuration>

> vim yarn-site.xml
...
<configuration>
<!-- Site specific YARN configuration properties -->
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
        <property>
                <name>yarn.resourcemanager.hostname</name>
                <value>master01</value>
        </property>
        <property>
                <name>yarn.nodemanager.resource.memory-mb</name>
                <value>2048</value>
        </property>
        <property>
                <name>yarn.nodemanager.resource.cpu-vcores</name>
                <value>1</value>
        </property>
        <property>
                <name>yarn.nodemanager.env-whitelist</name>
                <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
        </property>
</configuration>

> vim mapred-site.xml
...
<configuration>
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
</configuration>

컨테이너를 commit하여 이미지 생성을 마친다.

> ctrl+d
> sudo docker commit hadoop-base centos:hadoop

 

클러스터를 구성하기 위해 master 2개, slave 3개로 총 5개의 컨테이너를 실행하고, 각 노드들에 대해 /etc/profile을 실행시킨다. 참고로 Ctrl+p,q는 컨테이너를 종료시키지 않고 빠져나올 수 있도록 해준다.

> sudo docker run -it --privileged=True -h master01 --name master01 -p 9870:9870 centos:hadoop
> source /etc/profile
> sudo docker run -it --privileged=True -h master02 --name master02 centos:hadoop
> source /etc/profile
> sudo docker run -it --privileged=True -h slave01 --name slave01 centos:hadoop
> source /etc/profile
> sudo docker run -it --privileged=True -h slave02 --name slave02 centos:hadoop
> source /etc/profile
> sudo docker run -it --privileged=True -h slave03 --name slave03 centos:hadoop
> source /etc/profile

각 노드들의 IP주소를 알아내고, 각 노드들의 etc/hosts를 수정한다.

> sudo docker inspect master01 | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",
> sudo docker inspect master02 | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.3",
                    "IPAddress": "172.17.0.3",
> sudo docker inspect slave01 | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.4",
                    "IPAddress": "172.17.0.4",
> sudo docker inspect slave02 | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.5",
                    "IPAddress": "172.17.0.5",
> sudo docker inspect slave03 | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.6",
                    "IPAddress": "172.17.0.6",

#모든 컨테이너에 반복한다.
> vim /etc/hosts
...
172.17.0.2	master01
172.17.0.3	master02
172.17.0.4	slave01
172.17.0.5	slave02
172.17.0.6	slave03

 

2개의 마스터 노드에 한해 다음을 수행한다.

> cd $HADOOP_HOME/etc/hadoop
> vim hdfs-site.xml
...
<configuration>
        <property>
                <name>dfs.replication</name>
                <value>3</value>
        </property>
        <property>
                <name>dfs.permissions</name>
                <value>false</value>
        </property>
        <property>
                <name>dfs.namenode.http.address</name>
                <value>master01:9870</value>
        </property>
        <property>
                <name>dfs.secondary.http.address</name>
                <value>master02:9868</value>
        </property>
        <property>
                <name>dfs.namenode.name.dir</name>
                <value>file:/opt/hadoop/current/data/namenode</value>
        </property>
</configuration>

master01 노드에서 다음을 수정해준다. workers 파일은 worker가 수행할 노드를 적어 놓는 파일이다.

> vim workers

slave01
slave02
slave03

 

master01 컨테이너의 Namenode를 포맷한 후 start-all.sh를 실행하면 클러스터가 동작한다. 각 노드에서 jps를 이용해 각 실행되는 기능을 볼 수 있다.

> hdfs namenode -format
> start-all.sh

#jps 확인

[root@master01 /]# jps
1160 Jps
314 NameNode
767 ResourceManager

[root@master02 /]# jps
81 SecondaryNameNode
133 Jps

[root@slave01 /]# jps
81 DataNode
326 Jps
188 NodeManager

[root@slave02 /]# jps
82 DataNode
327 Jps
189 NodeManager

[root@slave03 /]# jps
81 DataNode
326 Jps
188 NodeManager

 

MapReduce 작업을 통해 클러스터를 테스트 한다.

> cd $HADOOP_HOME
> hdfs dfs -mkdir -p /test //hdfs 내 test 디렉토리 생성

> hdfs dfs -ls / //test 디렉토리 확인
Found 1 items
drwxr-xr-x   - root supergroup          0 2022-05-16 14:33 /test

> hdfs dfs -put LICENSE.txt /test //test 디렉토리에 라이선스 텍스트 파일 복사

> hdfs dfs -ls /test //파일 확인
Found 1 items
-rw-r--r--   3 root supergroup      15217 2022-05-16 14:33 /test/LICENSE.txt

//MapReduce 테스트
> yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar wordcount /test /test_out

> hdfs dfs -ls /test_out //출력파일 확인
Found 2 items
-rw-r--r--   3 root supergroup          0 2022-05-16 14:37 /test_out/_SUCCESS
-rw-r--r--   3 root supergroup       9894 2022-05-16 14:37 /test_out/part-r-00000

>hdfs dfs -cat /test_out/part-r-00000
"AS     2
"Contribution"  1
"Contributor"   1
...
written 1
you     2
your    4

'데이터 엔지니어링 > 빅데이터' 카테고리의 다른 글

Hive  (0) 2022.05.21
Hadoop High-Availability Fully distributed with Docker  (0) 2022.05.21
Hadoop Pseudo-distributed with Docker  (0) 2022.05.16
Hadoop Standalone with Docker  (0) 2022.05.16
HDFS  (0) 2022.05.16