使用Docker搭建hadoop

105 阅读4分钟

由于本机windows上CPU、磁盘等硬件资源不足,无法使用VMware通过构建虚拟机来搭建hadoop集群,因此在实验室服务器(CentOS)上使用docker来解决该问题。

Docker 安装

# 安装docker 
sudo yml install -y docker-ce

# 检查docker服务状态
systemctl status docker

# 配置开机自启
sudo systemctl stop docker # 停止docker服务
sudo systemctl enable docker # 配置开机自启
sudo systemctl start docker # 重启docker服务

hadoop集群搭建

要求

  • 主机操作系统为centos
  • 所有主机在同一网段下,具有不同的ip
  • 主机上装有jdk8、hadoop、vim、ifconfig、ip、ping等相关服务
  • 每个容器内存限制为2G,CPU限制为2核

DockerFile编写

在/public/my/docker-hadoop 文件夹下编写Dockerfile,需要jdk8安装包与hadoop安装包也在该目录下

sudo vim Dockerfile

#Dockerfile中写入以下内容
FROM centos:7

MAINTAINER aoke

USER root

# 设置工作目录
ENV MYPATH /usr/local
WORKDIR $MYPATH

# 安装相关软件工具包
RUN yum update -y
RUN yum install -y vim openssh* net-tools lsof telnet passwd iproute iputils rsync

# 配置ssh服务
# 修改root用户密码
RUN echo "123456" | passwd --stdin root
#设置不使用ssh服务端的pam模块
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
#创建非对称秘钥
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
#关闭pam.d的ssh会话模块
RUN sed -i '/^session\s\+required\s\+pam_loginuid.so/s/^ /#/' /etc/pam.d/sshd
#创建ssh工作目录并设置权限
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh

# 安装jdk8以及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
# 将jdk8文件拷贝至/usr/local/java
ADD jdk-8u361-linux-x64.tar.gz /usr/local/java

# 安装hadoop
RUN mkdir /usr/local/hadoop
ADD hadoop-3.1.3.tar.gz /usr/local/hadoop

# 配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_361
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $PATH:$JAVA_HOME/bin

# 配置hadoop环境变量
ENV HADOOP_HOME /usr/local/hadoop/hadoop-3.1.3
ENV PATH $PATH:$HADOOP_HOME/bin
ENV PATH $PATH:$HADOOP_HOME/sbin

# 对外暴露80端口
EXPOSE 80
EXPOSE 22

#开启sshd服务
CMD ["/usr/sbin/sshd","-D"]

# :wq保存退出,然后构建镜像(末尾的 . 不能省略)
sudo docker build -t hadoop:1.0 .

docker-compose.yml文件编排

通过编写docker-compose.yml文件,对搭建集群所需要的容器的配置信息进行编写,包括容器数据卷挂载地址,网络配置信息,cpu, 内存限制信息等。

version: "3"

services:
    hadoop100:
        image: hadoop:1.0
        privileged: true
        container_name: h100
        hostname: h100
        volumes:
            - /public/usr1/docker-hadoop/h100-data:/data
        networks:
            hadoop:
                ipv4_address: 172.19.0.100
        deploy:
            resources:
                limits:
                    cpus: '2'
                    memory: 2G
        stdin_open: true
        tty: true

    hadoop101:
        image: hadoop:1.0
        privileged: true
        container_name: h101
        hostname: h101
        volumes:
            - /public/usr1/docker-hadoop/h101-data:/data
        networks:
            hadoop:
                ipv4_address: 172.19.0.101
        deploy:
            resources:
                limits:
                    cpus: '2'
                    memory: 2G
        stdin_open: true
        tty: true

    hadoop102:
        image: hadoop:1.0
        privileged: true
        container_name: h102
        hostname: h102
        volumes:
            - /public/usr1/docker-hadoop/h102-data:/data
        networks:
            hadoop:
                ipv4_address: 172.19.0.102
        deploy:
            resources:
                limits:
                    cpus: '2'
                    memory: 2G
        stdin_open: true
        tty: true

    hadoop103:
        image: hadoop:1.0
        privileged: true
        container_name: h103
        hostname: h103
        volumes:
            - /public/usr1/docker-hadoop/h103-data:/data
        networks:
            hadoop:
                ipv4_address: 172.19.0.103
        deploy:
            resources:
                limits:
                    cpus: '2'
                    memory: 2G
        stdin_open: true
        tty: true

networks:
    hadoop:
        ipam:
            config:
                - subnet: 172.19.0.0/24

docker-compose.yml配置信息详解

hadoop100, hadoop101, hadoop102, hadoop103 # 容器名称

iamge: hadoop:1.0 # 使用hadoop:1.0这个镜像

privileged: true # 允许容器中运行一些特权命令(使容器中root用户真正拥有root权限)

container_name: h100 # 容器名称

hostname: h100 # 主机名

# 挂载容器数据卷,主机中的/public/usr1/docker-hadoop/h103-data目录与容器中的/data共享数据
# 这样,容器即便被删除,数据依然存在。
volumes:
    - /public/usr1/docker-hadoop/h103-data:/data
    
# 配置网络以及ip信息
networks:
    hadoop:
        ipv4_address: 172.19.0.103

# cpu与内存使用上限
deploy:
    resources:
        limits:
            cpus: '2'
            memory: 2G

stdin_open: true # 打开标准输入,可接受外部输入

tty: true # 模拟一个伪终端

# 构建网络
networks:
    hadoop:
        ipam:
            config:
                - subnet: 172.19.0.0/24
  • sudo docker-compose config -q
    检查docker-compose.yml中编写是否有错误(无任何输出即没问题, 本人在执行的时候出现以下警告信息)
WARNING: Some services (hadoop100, hadoop101, hadoop102, hadoop103) use the 'deploy' key, which will be ignored. Compose does not support 'deploy' configuration - use `docker stack deploy` to deploy to a swarm.

网上搜索说是由于做了资源限制, 并且没有使用swarm, 所以要加上--compatibility参数, 不然会报错

即执行 docker-compose --compatibility up -d

但执行该命令直接报错,因此不采用网上的建议,直接忽视该警告信息,运行以下命令

sudo docker-compose up -d

容器运行成功

服务器hosts文件配置,使服务器可通过ping 主机名来ping通容器

sudo vim /etc/hosts

# 添加以下信息
172.19.0.100 h100
172.19.0.101 h101
172.19.0.102 h102
172.19.0.103 h103

测试网络与环境

  • 测试能否通过ping 主机名 来ping通,在服务器上ping,以及在容器间ping
  • 验证java以及hadoop是否安装成功
# 进入容器
sudo docker exec -it h100 /bin/bash

# 检查 java 
java -version
# 显示以下信息
java version "1.8.0_361"
Java(TM) SE Runtime Environment (build 1.8.0_361-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.361-b09, mixed mode)

# 检查 hadoop
hadoop version
# 显示以下信息
Hadoop 3.1.3
Source code repository https://gitbox.apache.org/repos/asf/hadoop.git -r ba631c436b806728f8ec2f54ab1e289526c90579
Compiled by ztang on 2019-09-12T02:47Z
Compiled with protoc 2.5.0
From source with checksum ec785077c385118ac91aadde5ec9799
This command was run using /usr/local/hadoop/hadoop-3.1.3/share/hadoop/common/hadoop-common-3.1.3.jar

一些可能会用到的命令


firewall-cmd --zone=public --add-port=5672/tcp --permanent   # 开放5672端口
 
firewall-cmd --zone=public --remove-port=5672/tcp --permanent  #关闭5672端口
 
firewall-cmd --reload   # 配置立即生效

firewall-cmd --zone=public --list-ports # 查看开放的端口