Docker 20 + Hadoop 3.2 集群部署:3节点网络配置与SSH免密登录全解析
·
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
密钥分发过程优化:
- 使用
ssh-keyscan提前收集主机指纹,避免交互确认 - 通过
sshpass实现非交互式密码输入 - 循环处理所有节点,实现全集群互信
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
更多推荐
所有评论(0)