1、创建自己的centos镜像

FROM centos

MAINTAINER summer

COPY jdk1.8.0_121 /usr/local/jdk1.8

RUN yum install -y openssh-server
RUN yum install -y which.x86_64
RUN yum install -y openssh-clients


RUN echo "root:root" | chpasswd
RUN echo "root	All=(All)	All" >> /etc/sudoers


RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
RUN ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key


RUN mkdir /var/run/sshd
ENV JAVA_HOME /usr/local/jdk1.8
ENV PATH $JAVA_HOME/bin:$PATH 


EXPOSE 22
CMD ["/usr/sbin/sshd","-D"]

使用docker官方提供的centos为基础镜像,安装openssh-server和openssh-clients,which.x86_64

docker build -t "summer/centos" ./

构建镜像,命名为summer/centos


2、基于summer/centos创建namenode和datanode镜像,hive需要hadoop的存在,所以把hive部署到namenode里,因此,需要构建两个镜像,一个是带hive的namenode,一个是不带hive的datanode

FROM summer/centos

COPY hadoop-2.7.3 /usr/local/hadoop
COPY hive-2.1.1 /usr/local/hive
COPY start.sh /root/start-all.sh

RUN chmod 744 /root/start-all.sh

ENV HADOOP_HOME /usr/local/hadoop
ENV HADOOP_PREFIX /usr/local/hadoop
ENV HADOOP_COMMON_HOME /usr/local/hadoop
ENV HADOOP_MARPED_HOME /usr/local/hadoop
ENV HIVE_HOME=/usr/local/hive
ENV PATH $HBASE_HOME/bin:$HIVE_HOME/bin:$HADOOP_HOME/bin:$PATH

docker build -t "summer/master" ./


start.sh用来启动hadoop集群和hive

#!/bin/sh
/usr/local/hadoop/sbin/start-all.sh
这里没有加入hive的启动命令,可以自行添加

FROM summer/centos-jdk

COPY hadoop-2.7.3 /usr/local/hadoop

ENV HADOOP_HOME /usr/local/hadoop
ENV HADOOP_PREFIX /usr/local/hadoop
ENV HADOOP_COMMON_HOME /usr/local/hadoop
ENV HADOOP_MARPED_HOME /usr/local/hadoop
这是构建datanode的dockerfile

其中,namenode使用的hadoop和datanode使用的hadoop是同一个,需要提前修改好相关配置文件

3、然后创建docker-compose.yml文件

version: '3'
services:
    master:
        image: summer/master
        container_name: master
        hostname: master
        links: 
            - datanode1:master1
            - datanode2:master2
            - mysql:mysql
        depends_on: 
            - mysql

    datanode1:
        image: summer/datanode
        hostname: datanode1
        container_name: datanode1

    datanode2:
        image: summer/datanode
        hostname: datanode2
        container_name: datanode2

    mysql:
        image: mysql:latest
        ports:
            - 3307:3306
        environment:
                - MYSQL_ROOT_PASSWORD=123456

    hue:
       image: gethue/hue
       container_name: hue
       ports: 
           - 8888:8888


我这里配置的Hive使用mysql存放元数据,所以使用到mysql镜像。同时,使用gethue/hue镜像提供Hue来管理hadoop集群。

4、执行docker-compose up 命令,会依次创建、拉取相关镜像后启动容器。

5、对于hadoop集群内的主机,需要提供免密登录,所以需要单独进入namenode,datanode节点,进行ssh-keygen 操作,使得部署了hadoop的主机之间能够免密登录。

因为在docker-compose.yml文件里,已经为hadoop主机之间建立了link(网络内连接),所以生成ssh公钥后,可以直接通过ssh-copy-id 在主机内拷贝公钥文件。

6、访问mysql容器,创建hive需要用到的数据库

7、编写集群启动脚本

#!/bin/bash
docoker-compose start
docoker-compose exec -d master /root/start-all.sh
start-all.sh

通过docker-compose管理hadoop集群就完成了



Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐