Docker 20 + Hadoop 3.2 集群部署:3节点网络配置与SSH免密登录全解析

1. 容器化Hadoop集群的核心挑战

在传统物理机或虚拟机环境中部署Hadoop集群时,网络配置和节点间通信是相对直观的。但当我们将Hadoop迁移到Docker容器环境时,会遇到几个特有的技术挑战:

网络隔离问题 :Docker默认的bridge网络虽然提供了容器间的通信能力,但存在两个主要限制:

  • 容器重启后IP地址可能变化,而Hadoop配置需要固定的主机名映射
  • 默认bridge网络缺乏DNS解析能力,需手动维护hosts文件

SSH互信难题 :Hadoop的运维管理重度依赖SSH协议,包括:

  • 主节点启动/停止从节点服务
  • 日志收集和监控
  • 分布式shell命令执行

在容器环境中实现SSH免密登录需要解决:

  • 容器间用户身份一致性(root权限问题)
  • 密钥分发和管理的自动化
  • 服务启动顺序依赖(SSH服务需先于Hadoop启动)

2. 定制化Docker网络架构

2.1 创建专用桥接网络

我们首先创建一个隔离的Docker网络,解决基础通信问题:

docker network create \
  --driver=bridge \
  --subnet=172.18.0.0/16 \
  --gateway=172.18.0.1 \
  --attachable \
  hadoop-net

关键参数解析:

  • --subnet :指定私有IP段,避免与宿主机网络冲突
  • --attachable :允许其他容器动态加入网络
  • --gateway :设置网络网关地址

验证网络创建:

docker network inspect hadoop-net

2.2 固定IP与主机名绑定

在启动容器时固定IP和主机名:

# 主节点
docker run -itd \
  --name hadoop-master \
  --network hadoop-net \
  --ip 172.18.0.2 \
  --hostname hadoop-master \
  -p 9870:9870 -p 8088:8088 \
  hadoop-image

# 从节点1
docker run -itd \
  --name hadoop-slave1 \
  --network hadoop-net \
  --ip 172.18.0.3 \
  --hostname hadoop-slave1 \
  hadoop-image

# 从节点2 
docker run -itd \
  --name hadoop-slave2 \
  --network hadoop-net \
  --ip 172.18.0.4 \
  --hostname hadoop-slave2 \
  hadoop-image

提示:端口映射只需在主节点暴露Web UI端口(9870/8088),从节点无需端口映射

3. 容器SSH服务深度配置

3.1 基础镜像构建

创建包含SSH服务的Dockerfile:

FROM centos:7

# 安装必要工具
RUN yum install -y openssh-server openssh-clients sudo vim

# 配置SSH
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config \
    && ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key \
    && ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key

# 设置root密码
RUN echo "root:123456" | chpasswd

# 启动脚本
COPY start-ssh.sh /usr/sbin/
RUN chmod +x /usr/sbin/start-ssh.sh

EXPOSE 22
CMD ["/usr/sbin/start-ssh.sh"]

配套启动脚本 start-ssh.sh

#!/bin/bash
mkdir -p /var/run/sshd
/usr/sbin/sshd -D

3.2 跨容器SSH互信实现

在容器启动后执行以下自动化脚本:

#!/bin/bash

# 生成密钥对
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa

# 配置known_hosts
ssh-keyscan hadoop-master,hadoop-slave1,hadoop-slave2 >> ~/.ssh/known_hosts

# 分发公钥
for node in hadoop-master hadoop-slave1 hadoop-slave2; do
  sshpass -p "123456" ssh-copy-id -i ~/.ssh/id_rsa.pub root@$node
done

密钥分发过程优化:

  1. 使用 ssh-keyscan 提前收集主机指纹,避免交互确认
  2. 通过 sshpass 实现非交互式密码输入
  3. 循环处理所有节点,实现全集群互信

4. Hadoop容器化配置精要

4.1 核心配置文件调整

core-site.xml 关键配置:

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://hadoop-master:9000</value>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/opt/hadoop/data/tmp</value>
  </property>
</configuration>

hdfs-site.xml 数据节点配置:

<property>
  <name>dfs.datanode.data.dir</name>
  <value>/opt/hadoop/data/hdfs/datanode</value>
</property>

4.2 容器环境变量管理

通过环境变量注入集群配置:

ENV HADOOP_HOME=/opt/hadoop
ENV PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
ENV HDFS_NAMENODE_USER="root"
ENV HDFS_DATANODE_USER="root"
ENV HDFS_SECONDARYNAMENODE_USER="root"
ENV YARN_RESOURCEMANAGER_USER="root"
ENV YARN_NODEMANAGER_USER="root"

5. 集群验证与排错指南

5.1 基础连通性测试

# 测试节点间通信
docker exec hadoop-master ping hadoop-slave1
docker exec hadoop-slave2 ssh hadoop-master hostname

# 检查SSH配置
docker exec hadoop-master cat /root/.ssh/authorized_keys

5.2 常见问题解决方案

问题1:SSH连接超时

  • 检查容器SSH服务状态: netstat -tulnp | grep 22
  • 验证防火墙规则: iptables -L -n

问题2:DataNode无法注册

  • 检查NameNode日志: docker logs hadoop-master
  • 验证网络连通性: telnet hadoop-master 9000

问题3:资源管理器无法启动

  • 检查环境变量: env | grep YARN
  • 验证端口冲突: netstat -tulnp | grep 8088

6. 生产级优化建议

6.1 网络性能调优

docker network create 时添加QoS参数:

--opt "com.docker.network.bridge.enable_icc=true" \
--opt "com.docker.network.bridge.host_binding_ipv4=0.0.0.0" \
--opt "com.docker.network.driver.mtu=1500"

6.2 持久化存储方案

使用Docker卷保存关键数据:

docker volume create hadoop-data
docker run -v hadoop-data:/opt/hadoop/data ...

6.3 容器资源限制

为每个容器设置资源配额:

--cpus 2 \
--memory 4g \
--memory-swap 4g \
--blkio-weight 500

更多推荐