docker是一个轻量化部署工具,相比虚拟机,Docker构建部署包更小,启动更快速,占用资源更少。
接下来,我们考虑在单机上创建5个Docker容器,包括一个master容器和四个slave容器,容器之间相互隔离,通过加入创建的Docker虚拟网络hadoop_network实现网络互联。
下载与安装
地址:https://hub.docker.com/editions/community/docker-ce-desktop-mac
构建JDK镜像
我们考虑直接下载Docker hub上的Ubuntu系统来编写镜像。
我们创建一个镜像目录image_jdk,下载的jdk文件放到该目录下,然后在目录中编写两个文件build.sh和Dockerfile:
#build.sh
Docker image build -t ubuntu_jdk:1.0 .
#Dockerfile
#初始镜像继承ubuntu
FROM ubuntu:16.04
MAINTAINER wenhuan "xxx@qq.com"
#将JDK文件放到镜像/opt目录下,ADD命令会自动解压。
ADD ./jdk-8u181-linux-x64.tar.gz /opt/
#重命名解压后的JDK文件目录
RUN mv /opt/jdk1.8.0_181 /opt/java
#创建环境变量
ENV JAVA_HOME /opt/java
ENV JRE_HOME ${JAVA_HOME}/jre
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH $PATH:$JAVA_HOME/bin
之后执行以下命令即构建了ubuntu_jdk1.0,至此JDK镜像构建成功:
sh build.sh
构建Hadoop镜像
先创建一个镜像目录image_hadoop, 下载hadoop压缩包和解压后的安装包放到image_hadoop目录下,编写构建命令,保存到build.sh:
Docker image build -t cluster_hadoop:1.0 .
编辑core-site.xml文件如下:
<configuration>
<property>
<!--hadoop临时目录-->
<name>hadoop.tmp.dir</name>
<value>file:/data/hadoop/tmp</value>
<description>默认存在/tmp目录</description>
</property>
<property>
<!--HDFS NameNode地址-->
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
<description>指定hdfs的主节点</description>
</property>
</configuration>
编辑hdfs-site.xml文件如下:
<configuration>
<property>
<!--HDFS副本数-->
<name>dfs.replication</name>
<value>2</value>
<description>指定hdfs的副本数</description>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/hadoop/tmp/dfs/name</value>
<description>指定namenode数据的目录</description>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/hadoop/tmp/dfs/data</value>
<description>指定datanode数据的目录</description>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:9001</value>
<description>指定secondarynamenode的节点</description>
</property>
</configuration>
编辑mapred-site.xml文件如下:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<description>指定MapReduce运行在yarn上</description>
</property>
</configuration>
编辑yarn-site.xml文件如下:
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
<description>指定yarn的主节点</description>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<description>允许MapReduce运行在yarn上</description>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
</configuration>
编辑slaves文件,填写从属节点的主机名:
slave1
slave2
slave3
slave4
编写Dockerfile文件:
#继承之前构建的镜像
FROM ubuntu_jdk:1.0
RUN apt-get update
#安装必要的软件包
RUN apt-get install -y openssh-server supervisor vim host
#生成密钥对
RUN ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' && cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys && chmod 0600 ~/.ssh/authorized_keys
#ssh_config新增两样配置
RUN echo "StrictHostKeyChecking no">>/etc/ssh/ssh_config && echo "UserKnownHostsFile /dev/null" >> /etc/ssh/ssh_config
#将Hadoop包复制到镜像中
ADD hadoop-2.7.7.tar.gz /opt/
RUN mv /opt/hadoop-2.7.7 /opt/hadoop
#将本地的配置文件复制到镜像中并覆盖对应的文件
COPY hadoop/etc/hadoop/core-site.xml /opt/hadoop/etc/hadoop
COPY hadoop/etc/hadoop/hdfs-site.xml /opt/hadoop/etc/hadoop
COPY hadoop/etc/hadoop/mapred-site.xml /opt/hadoop/etc/hadoop
COPY hadoop/etc/hadoop/yarn-site.xml /opt/hadoop/etc/hadoop
COPY hadoop/etc/hadoop/slaves /opt/hadoop/etc/slaves
#替换镜像hadoop-env.sh文件中的java_home目录
RUN sed -i "s?JAVA_HOME=\${JAVA_HOME}?JAVA_HOME=/opt/java?g" /opt/hadoop/etc/hadoop/hadoop-env.sh
ENV HADOOP_HOME /opt/hadoop
ENV HADOOP_INSTALL=$HADOOP_HOME
ENV HADOOP_MAPRED_HOME=$HADOOP_HOME
ENV HADOOP_COMMON_HOME=$HADOOP_HOME
ENV HADOOP_HDFS_HOME=$HADOOP_HOME
ENV YARN_HOME=$HADOOP_HOME
ENV PATH ${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH
EXPOSE 22
ENV HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
执行build.sh构建镜像。
构建Hive镜像
先创建一个镜像目录image_hive, 下载Hive压缩包和解压后的安装包放到image_hive目录下,编写构建命令,保存到build.sh:
Docker image build -t cluster_hive:1.0 .
编写Docker文件:
#继承之前的镜像
FROM cluster_hadoop:1.0
#复制hive文件到镜像/opt目录下
ADD apache-hive-1.2.2-bin.tar.gz /opt
#修改镜像hive目录名称,创建/opt/data及以下目录
RUN mv /opt/apache-hive-1.2.2-bin/ /opt/hive/ && mkdir -p /opt/data/hive_resources /opt/data/hive && chmod 666 /opt/data/hive
#声明环境变量
ENV HIVE_HOME /opt/hive
ENV PATH ${HIVE_HOME}/bin:$PATH
#目录切换到/opt/hive/conf
WORKDIR /opt/hive/conf
RUN mv hive-default.xml.template hive-site.xml && mv hive-log4j.properties.template hive-log4j.properties
#sed替换hive-site.xml的配置项
RUN sed -i "s?\${system:java.io.tmpdir}?/opt/data?g" hive-site.xml &&
sed -i "s?\${system:user.name}?hive?g" hive-site.xml
RUN cp -r /opt/hive/lib/jline-2.12.jar /opt/hadoop/share/hadoop/yarn/lib
执行build.sh构建镜像。
构建Spark镜像
先创建一个镜像目录image_spark, 下载Spark压缩包和解压后的安装包放到image_spark目录下,编写构建命令,保存到build.sh:
Docker image build -t cluster_spark:1.0 .
spark解压包更名为spark, 在spark/conf/目录下找到文件spark-env.sh.template改名为spark-env.sh,并打开文件,在末尾追加一行:
export SPARK_DIST_CLASSPATH=$(${HADOOP_HOME}/bin/hadoop classpath)
这样,spark才能共享hadoop的hdfs等组件。
在spark/conf/目录下找到文件slaves.template改名为slaves,并编辑:
slave1
slave2
slave3
slave4
接下来编写Docker文件:
#继承之前的镜像
FROM cluster_hive:1.0
#复制spark文件到镜像/opt目录下
ADD spark-2.4.6-bin-hadoop2.7.tgz /opt
#修改镜像spark目录名称
RUN mv /opt/spark-2.4.6-bin-hadoop2.7/ /opt/spark/
#将本地的配置文件复制到镜像中并覆盖对应的文件
COPY spark/conf/spark-env.sh /opt/spark/conf/spark-env.sh
#声明环境变量
ENV SPARK_HOME /opt/spark
ENV PATH ${SPARK_HOME}/bin:$PATH
WORKDIR /opt
#运行容器,启动SSH服务
CMD ["sh","-c","service ssh start; bash"]
执行build.sh构建镜像。
启动集群
接下来编写一个启动集群的脚本start.sh:
#!/usr/bin/env bash
#创建虚拟网络
Docker network rm -f hadoop_network &> /dev/null
Docker network create --driver=bridge hadoop_network
#启动4个从属节点
i=1
while [ $i -lt 5 ]
do
sudo Docker rm -f slave$i &> /dev/null
echo "start slave$i container..."
sudo Docker run -itd --network=hadoop_network --name slave$i --hostname slave$i cluster_spark:1.0 &> /dev/null
i=$(($i + 1))
done
#启动主节点
sudo Docker rm -f master &> /dev/null
echo "start master container..."
sudo Docker run -itd --network=hadoop_network -p 50070:50070 -p 8088:8088 --name master --hostname master cluster_spark:1.0 &> /dev/null
#进入master节点
sudo Docker exec -it master bash
网友评论