Search

Hadoop Fully-distributed with Docker

기존 pseudo-distribute를 변형하여 세팅할 수 있지만, 새로 이미지를 생성해볼것이다.
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
Plain Text
복사
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
Plain Text
복사
Java 환경변수를 정의한다.
> vim /etc/profile ... export JAVA_HOME=/opt/jdk/current export PATH=$PATH:$JAVA_HOME/bin
Shell
복사
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
Plain Text
복사
Hadoop 환경변수를 정의한다.
> vim /etc/profile ... export HADOOP_HOME=/opt/hadoop/current export PATH=$PATH:$HADOOP_HOME/bin export PATH=$PATH:$HADOOP_HOME/sbin
Shell
복사
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
Plain Text
복사
ssh 통신을 위한 key를 생성한다.
> ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa > cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys > ssh localhost // 테스트
Plain Text
복사
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"
Shell
복사
# 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>
XML
복사
컨테이너를 commit하여 이미지 생성을 마친다.
> ctrl+d > sudo docker commit hadoop-base centos:hadoop
Plain Text
복사
클러스터를 구성하기 위해 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
Plain Text
복사
각 노드들의 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
Plain Text
복사
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>
XML
복사
master01 노드에서 다음을 수정해준다. workers 파일은 worker가 수행할 노드를 적어 놓는 파일이다.
> vim workers slave01 slave02 slave03
Plain Text
복사
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
Plain Text
복사
localhost:9870
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
Plain Text
복사
Web UI file system browser