美文网首页python机器学习爬虫
Docker搭建Hadoop分布式集群

Docker搭建Hadoop分布式集群

作者: 眼君 | 来源:发表于2020-08-25 07:20 被阅读0次

    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
    

    相关文章

      网友评论

        本文标题:Docker搭建Hadoop分布式集群

        本文链接:https://www.haomeiwen.com/subject/jjwnjktx.html