docker로 spark-hadoop-cluster 만들기
1. 작업 디렉토리 생성 2.Dockerfile 작성 3.도커이미지 빌드
4.Dockerhub에 도커이미지 업로드 (1) 도커허브에 Repository 만들기 (2) 도커이미지 이름 변경 (3) 도커이미지 업로드 5.spark-hadoop-cluster 구동
(1) 컨테이너 구동 (2) 클러스터 구동 (3) 클러스터 구동 테스트 6.github와 연동
(1) 작업디렉토리 github와 연동 (2) Dockerhub autobuild 적용 개선할 사항
1. 작업 디렉토리 생성
docker-spark-yarn-cluster Dockerfile
LICENSE README.md config
core-site.xml hadoop-env.sh hdfs-site.xml mapred-site.xml slaves
spark
log4j.properties spark-defaults.conf spark-env.sh ssh_config yarn-site.xml scripts
spark-services.sh startHadoopCluster.sh
2.Dockerfile 작성
vim Dockerfile
FROM centos:7 USER root
# os & JAVA RUN yum -y update \
&& yum install -y openssh-server openssh-clients \ && yum -y install vim net-tools zip wget \
&& yum clean all
#
RUN wget -O /hadoop.tar.gz http://apache.mirror.cdnetworks.com/hadoop/common/hadoop-2.7.7/hadoop-2.7.7.tar.gz \ && tar xfz hadoop.tar.gz \
&& mv /hadoop-2.7.7 /usr/local/hadoop \ && rm /hadoop.tar.gz
#
RUN wget -O /spark.tar.gz http://apache.mirror.cdnetworks.com/spark/spark-2.4.5/spark-2.4.5-bin-hadoop2.7.tgz \ && tar xfz spark.tar.gz \
&& mv /spark-2.4.5-bin-hadoop2.7 /usr/local/spark \ && rm /spark.tar.gz
#scala
RUN wget http://downloads.lightbend.com/scala/2.11.8/scala-2.11.8.rpm \ && yum install -y scala-2.11.8.rpm \
&& yum clean all \ && rm scala-2.11.8.rpm
# java
RUN yum install -y java-1.8.0-openjdk-devel ENV JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
# ssh
RUN ssh-keygen -t rsa -f $HOME/.ssh/id_rsa -P "" \
&& cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
RUN sed -i 's/HostKey/\#HostKey/g' /etc/ssh/sshd_config \
&& echo "HostKey ~/.ssh/id_rsa" >> /etc/ssh/sshd_config
# /
ENV HADOOP_HOME=/usr/local/hadoop ENV SPARK_HOME=/usr/local/spark
ENV PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$SPARK_HOME/bin:$SPARK_HOME:sbin
RUN mkdir -p $HADOOP_HOME/hdfs/namenode \ && mkdir -p $HADOOP_HOME/hdfs/datanode
# /
COPY config/ /tmp/
RUN mv /tmp/ssh_config $HOME/.ssh/config \
&& mv /tmp/hadoop-env.sh $HADOOP_HOME/etc/hadoop/hadoop-env.sh \ && mv /tmp/core-site.xml $HADOOP_HOME/etc/hadoop/core-site.xml \ && mv /tmp/hdfs-site.xml $HADOOP_HOME/etc/hadoop/hdfs-site.xml \
&& mv /tmp/mapred-site.xml $HADOOP_HOME/etc/hadoop/mapred-site.xml.template \
&& cp $HADOOP_HOME/etc/hadoop/mapred-site.xml.template $HADOOP_HOME/etc/hadoop/mapred-site.xml \ && mv /tmp/yarn-site.xml $HADOOP_HOME/etc/hadoop/yarn-site.xml \
&& cp /tmp/slaves $HADOOP_HOME/etc/hadoop/slaves \ && mv /tmp/slaves $SPARK_HOME/conf/slaves \
&& mv /tmp/spark/spark-env.sh $SPARK_HOME/conf/spark-env.sh \
&& mv /tmp/spark/log4j.properties $SPARK_HOME/conf/log4j.properties \ && mv /tmp/spark/spark-defaults.conf $SPARK_HOME/conf/spark-defaults.conf
# &
ADD scripts/spark-services.sh $HADOOP_HOME/spark-services.sh
RUN chmod 744 -R $HADOOP_HOME
RUN $HADOOP_HOME/bin/hdfs namenode -format
EXPOSE 50010 50020 50070 50075 50090 8020 9000 EXPOSE 10020 19888
EXPOSE 8030 8031 8032 8033 8040 8042 8088
EXPOSE 49707 2122 7001 7002 7003 7004 7005 7006 7007 8888 9000 ENTRYPOINT /usr/sbin/sshd; cd $SPARK_HOME; bash
도커파일 다이어트 시키기
3.도커이미지 빌드
docker build -t sunny-spark-hadoop-cluster:1.0 .
4.Dockerhub에 도커이미지 업로드
(1) 도커허브에 Repository 만들기
https://hub.docker.com/
(2) 도커이미지 이름 변경
docker tag -t sunny-spark-hadoop-cluster:1.0 <Dockerhub-id>/sunny-spark-hadoop-cluster:1.0
(3) 도커이미지 업로드
docker login
docker push <Dockerhub-id>/sunny-spark-hadoop-cluster:1.0
5.spark-hadoop-cluster 구동
(1) 컨테이너 구동
./startHadoopCluster.sh <the number of slave nodes>
startHadoopCluster.sh
#!/bin/bash
# VARIABLES
IMG_NAME="sunnydockerhub/sunny-spark-hadoop-cluster:latest"
HOST_PREFIX="mycluster"
NETWORK_NAME=$HOST_PREFIX
N=$1
NET_QUERY=$(docker network ls | grep -i $NETWORK_NAME) if [ -z "$NET_QUERY" ]; then
docker network create --driver=bridge $NETWORK_NAME fi
# START HADOOP SLAVES i=1
while [ $i -le $N ] do
HADOOP_SLAVE="$HOST_PREFIX"-slave-$i
docker run --name $HADOOP_SLAVE -h $HADOOP_SLAVE --net=$NETWORK_NAME -itd "$IMG_NAME"
i=$(( $i + 1 )) done
# START HADOOP MASTER
HADOOP_MASTER="$HOST_PREFIX"-master
docker run --name $HADOOP_MASTER -h $HADOOP_MASTER --net=$NETWORK_NAME \ -p 8088:8088 -p 50070:50070 -p 50090:50090 \
-p 18080:18080 \ -itd "$IMG_NAME"
(2) 클러스터 구동
#
docker attach mycluster-master
# slave ( slave )
vim $HADOOP_HOME/etc/hadoop/slaves
#
./$HADOOP_HOME/spark-services.sh
(3) 클러스터 구동 테스트
클러스터 UI 확인
리소스매니저 : http://<Host IP>:8088 HDFS : http://<Host IP>:50070
스파크 프로그램 실행
spark-submit --master yarn --deploy-mode client --num-executors 2 --executor-memory 4G --executor-cores 4 -- class org.apache.spark.examples.SparkPi $SPARK_HOME/examples/jars/spark-examples_2.11-2.4.5.jar
스파크 모니터링
스파크 히스토리 서버 : http://<Host IP>:18080
또는 리소스매니저 http://<Host IP>:8088 에서 yarn application 모니터링
6.github와 연동
도커허브에 이미지를 올려봤다. Dockerfile을 수정하면 이미지가 자동으로 빌드되도록 github와 연동해본다.
(1) 작업디렉토리 github와 연동
cd ~/docker-spark-yarn-cluster git init
#
git remote add origin <your-github-address>
# push git add .
git commit -m "First Commit!"
git push origin master
(2) Dockerhub autobuild 적용
Dockerhub에서 github 계정 연결 https://hub.docker.com/
Dockerhub Repository autobuild 설정 github 연결
build 설정
github의 브랜치와 Dockerfile 경로를 설정한다. 해당 브랜치에서 Dockerfile이 변경되면 Dockerhub에서 이를 감지하여 자동으로 이미지를 빌드한다.
auto build 확인
github master 브랜치에 commit하면 Dockerhub에서 이미지 빌드가 자동으로 시작된다.
개선할 사항
이미지 크기가 너무 크다. 빌드하거나 다운로드 받을 때 오래 걸린다.
이미지를 분리?해본다.
dockerhub autobuild(github) 설정을 했다. github에서 Dockerfile을 수정하면 자동 빌드된다. 근데 항상 Dockerfile 처음부분부터 빌드된다.
변경부분부터 빌드하는 방법은 없나?
도커 이미지에 하둡/스파크 설정이 박혀있다. 변경하고 싶으면 컨테이너 만든 후 사용자가 직접 수정해야 된다.
설정을 변수화?해서 컨테이너 만들 때 설정이 적용되도록 할 수 있나?
클러스터 HA 구성이 아니다.
컨테이너 붙여서 HA 구성으로 클러스터를 만들어본다?