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 |
다음과 같은 에러가 발생해서 해결한 내용
"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
'Hadoop' 카테고리의 다른 글
[YARN] memory 기본 지식 및 세팅 방법 (0) | 2020.01.16 |
---|---|
[HDFS] 연결된 node 보는 명령어 (0) | 2019.12.20 |
[HDFS] master:9000 failed on connection exception 에러 (0) | 2019.11.20 |
[YARN] 자원 Container 개수 조정하는 방법 (0) | 2019.11.19 |
[YARN] 어떤 노드가 동작중인지 보고싶을 때 사용하는 명령어 (0) | 2019.11.16 |