기존 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