由于本机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 # 查看开放的端口