Docker 를 사용할 줄 안다는 전제 하에 아래 설명을 이어간다.

 

전체적인 그림 :

 Ubuntu Docker Image 를 이용하여 Ubuntu Container 를 3 대 만들고

 모두 Hadoop 을 설치한 다음 Docker Swarm 을 이용하여 네트워크로 연결하고 (swarm 참고 : 링크)

 MapReduce, YARN 이 구동될 수 있도록 클러스터를 구축한다.

 

 

 

 

먼저 Official Ubuntu Docker Image 를 받는다.

 

sudo docker pull ubuntu:latest

 

 

 

 

 

Docker Swarm 을 이용하여 네트워크를 구축한다.

내가 사용할 ip 주소는 33.33.33.0/24 이고 이름은 cw-hadoop 이다.

 

sudo docker network create -d=overlay --subnet 33.33.33.0/24 --attachable cw-hadoop

 

subnet 을 사용하는 이유는 내가 ip 를 알아보기 편하게 하기 위해서지만,

딱히 쓰지 않아도 상관 없다. ip 는 Docker가 자동으로 할당 해주기 때문에.

 

 

 

Docker Container 를 3대 만든다. 이름은 cw-hd-master, cw-hd-slave1, cw-hd-slave2 이다.

9870,8088,19888 port 를 뚫어두었다.

 

sudo docker run -itd --network cw-hadoop --name cw-hd-master --ip 33.33.33.3 -p 29870:9870 -p 28088:8088 -p 29888:19888 ubuntu:latest /bin/bash

 

sudo docker run -itd --network cw-hadoop --name cw-hd-slave1 --ip 33.33.33.4 ubuntu:latest /bin/bash

 

sudo docker run -itd --network cw-hadoop --name cw-hd-slave2 --ip 33.33.33.5 ubuntu:latest /bin/bash

web interface port number 참고 : https://eyeballs.tistory.com/250

 

 

 

계속되는 내용은 master 노드에서만 실행하는 것이 있고,

workers 노드에서만 실행하는 것이 있고,

모든 노드에서 실행하는 것이 있다.

 

어디서 실행해야 할 지는 명령어 위에 적어두겠음.

 

 

ssh, jdk 등 필요한 것들을 설치한다.

참고 https://eyeballs.tistory.com/54

모든 노드
apt-get update ; apt-get upgrade -y ; apt-get install -y curl openssh-server rsync wget vim iputils-ping htop openjdk-8-jdk

 

 

모든 노드
vi /etc/hosts

아래 내용을 덧붙인다
33.33.33.3    master
33.33.33.4    worker1
33.33.33.5    worker2

 

모든 노드
다음 링크를 참고하여 ssh 통신이 가능하게 한다
https://eyeballs.tistory.com/145

 

 

원하는 버전의 binary 를 받는다. 참고 https://hadoop.apache.org/releases.html

모든 노드
wget http://mirror.navercorp.com/apache/hadoop/common/hadoop-3.2.1/hadoop-3.2.1.tar.gz
tar zxvf hadoop-3.2.1.tar.gz
rm hadoop-3.2.1.tar.gz
mv ./hadoop-3.2.1 /usr/local/hadoop/

 

 

 

master 노드에서만
cd /usr/local/hadoop
mkdir -p hadoop_tmp/hdfs/namenode
mkdir -p hadoop_tmp/hdfs/datanode
chmod 777 hadoop_tmp/

 

workers 노드에서만
cd /usr/local/hadoop
mkdir -p hadoop_tmp/hdfs/datanode
chmod 777 hadoop_tmp/

 

 

 

모든 노드
vi ~/.bashrc

아래 내용을 덧붙인다.

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
export PATH=$PATH:$JAVA_HOME/bin
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"

exit

source ~/.bashrc

 

master 노드에서만
vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh

export JAVA_HOME='/usr/lib/jvm/java-8-openjdk-amd64'

export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_NODEMANAGER_USER=root
export YARN_RESOURCEMANAGER_USER=root

 

workers 노드에서만
vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh

export JAVA_HOME='/usr/lib/jvm/java-8-openjdk-amd64'

 

 

모든 노드
vi $HADOOP_HOME/etc/hadoop/core-site.xml

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://master:9000</value>
    </property>
</configuration>

 

 

master 노드에서만
vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.permissions</name>
        <value>false</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/usr/local/hadoop_tmp/hdfs/namenode</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/usr/local/hadoop_tmp/hdfs/datanode</value>
    </property>
</configuration>

 

 

 

workers 노드에서만
vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.permissions</name>
        <value>false</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/usr/local/hadoop_tmp/hdfs/datanode</value>
    </property>
</configuration>

 

 

 

모든 노드
vi $HADOOP_HOME/etc/hadoop/yarn-site.xml

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
</configuration>

 

 

 

모든 노드
vi $HADOOP_HOME/etc/hadoop/mapred-site.xml

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
<property>
 <name>yarn.app.mapreduce.am.env</name>
 <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
</property>
<property>
 <name>mapreduce.map.env</name>
 <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
</property>
<property>
 <name>mapreduce.reduce.env</name>
 <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
</property>
</configuration>

 

 

 

모든 노드
vi $HADOOP_HOME/etc/hadoop/masters

master

 

 

모든 노드
vi $HADOOP_HOME/etc/hadoop/workers

master
worker1
worker2

 

 

master 노드에서만
hdfs namenode -format
start-all.sh


 

 

각 노드에서 jps 명령어를 이용한다.

master 에서는 ResourceManager, NodeManager, DataNode, SecondaryNameNode,NameNode 가 동작하는지 확인

worker 에서는 NodeManager, DataNode 가 동작하는지 확인

 

 

아래 명령어를 이용하여 간단하게 wordcount 가 동작하는지 확인해보자.



hdfs dfs -mkdir /input
hdfs dfs -copyFromLocal /usr/local/hadoop/README.txt /input
hdfs dfs -ls /input
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar wordcount /input/README.txt ~/wordcount-output

 

 

 

 

 

 

다음과 같은 에러가 발생해서 해결한 내용

 

"WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable"
https://weejw.tistory.com/202

"Error file: prelaunch.err."
https://stackoverflow.com/questions/50719585/unable-to-run-mapreduce-wordcount

 

"ERROR: Attempting to operate on hdfs namenode as root"

https://imdandyu.tistory.com/27

 

 

 

 

+ Recent posts