别再折腾虚拟机了!用Docker Compose 5分钟搞定Hadoop 3.1.3伪分布式集群
记得第一次接触Hadoop时,花了两天时间在虚拟机上反复折腾网络配置、SSH免密登录和环境变量。直到某天发现同事用Docker Compose三下五除二就搭好了集群,才意识到自己走了多少弯路。今天我们就用容器化方案,彻底告别繁琐的虚拟机配置。
1. 为什么选择Docker部署Hadoop?
传统虚拟机部署需要:
- 手动配置3台以上虚拟机
- 每台机器单独安装JDK、Hadoop
- 反复调试网络和SSH连接
- 消耗大量系统资源
而Docker方案优势明显:
- 资源占用少:单机即可模拟集群
- 环境隔离:不影响宿主机配置
- 快速重置:秒级重建整个集群
- 配置即代码:docker-compose.yml可版本控制
实测对比:传统方案需要2小时完成的部署,Docker方案只需5分钟
2. 环境准备与Docker配置
2.1 基础环境要求
- 任何支持Docker的Linux/macOS/Windows系统
- Docker Engine ≥ 20.10.14
- Docker Compose ≥ 2.5.1
- 建议分配4GB以上内存
# 验证Docker环境 docker --version docker-compose --version2.2 准备自定义镜像
新建Dockerfile构建包含Hadoop的基础镜像:
FROM ubuntu:20.04 # 安装基础工具 RUN apt-get update && \ apt-get install -y openssh-server openjdk-8-jdk vim # 配置SSH RUN mkdir /var/run/sshd RUN echo 'root:root' | chpasswd RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config # 下载Hadoop ENV HADOOP_VERSION 3.1.3 RUN wget https://archive.apache.org/dist/hadoop/common/hadoop-$HADOOP_VERSION/hadoop-$HADOOP_VERSION.tar.gz && \ tar -xzf hadoop-$HADOOP_VERSION.tar.gz -C /opt/ && \ mv /opt/hadoop-$HADOOP_VERSION /opt/hadoop && \ rm hadoop-$HADOOP_VERSION.tar.gz # 设置环境变量 ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 ENV HADOOP_HOME=/opt/hadoop ENV PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin EXPOSE 22 9870 8088 CMD ["/usr/sbin/sshd", "-D"]构建镜像:
docker build -t hadoop-base .3. 编写docker-compose.yml
创建完整的集群编排文件:
version: '3' services: namenode: image: hadoop-base hostname: namenode ports: - "9870:9870" # HDFS Web UI - "9000:9000" # HDFS服务端口 volumes: - ./data/namenode:/opt/hadoop/data/dfs/name environment: - CLUSTER_NAME=hadoop-cluster command: > bash -c " $HADOOP_HOME/bin/hdfs namenode -format $$CLUSTER_NAME && $HADOOP_HOME/sbin/hadoop-daemon.sh start namenode && tail -f /dev/null" datanode1: image: hadoop-base hostname: datanode1 depends_on: - namenode volumes: - ./data/datanode1:/opt/hadoop/data/dfs/data command: > bash -c " echo 'namenode' >> $HADOOP_HOME/etc/hadoop/workers && $HADOOP_HOME/sbin/hadoop-daemon.sh start datanode && tail -f /dev/null" resourcemanager: image: hadoop-base hostname: resourcemanager ports: - "8088:8088" # YARN Web UI depends_on: - namenode command: > bash -c " $HADOOP_HOME/sbin/yarn-daemon.sh start resourcemanager && tail -f /dev/null" nodemanager1: image: hadoop-base hostname: nodemanager1 depends_on: - resourcemanager command: > bash -c " $HADOOP_HOME/sbin/yarn-daemon.sh start nodemanager && tail -f /dev/null" networks: default: driver: bridge ipam: config: - subnet: 172.20.0.0/16关键配置说明:
| 组件 | 功能 | 暴露端口 |
|---|---|---|
| namenode | HDFS主节点 | 9870 |
| datanode1 | HDFS数据节点 | - |
| resourcemanager | YARN资源调度器 | 8088 |
| nodemanager1 | YARN计算节点 | - |
4. 启动与验证集群
4.1 一键启动服务
docker-compose up -d4.2 检查容器状态
docker-compose ps正常应显示4个容器的状态为"Up"
4.3 访问Web界面
- HDFS管理界面:http://localhost:9870
- YARN管理界面:http://localhost:8088
4.4 执行测试任务
进入容器提交MapReduce作业:
docker exec -it namenode bash # 创建测试目录 hdfs dfs -mkdir /input hdfs dfs -put $HADOOP_HOME/etc/hadoop/*.xml /input # 运行wordcount示例 hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output # 查看结果 hdfs dfs -cat /output/*5. 高级配置技巧
5.1 数据持久化方案
通过volumes实现数据持久化:
volumes: - ./data/namenode:/opt/hadoop/data/dfs/name - ./data/datanode1:/opt/hadoop/data/dfs/data目录结构建议:
. ├── docker-compose.yml ├── Dockerfile └── data ├── namenode # NameNode元数据 └── datanode1 # DataNode块数据5.2 资源限制配置
为容器分配固定资源:
services: namenode: deploy: resources: limits: cpus: '1' memory: 2G5.3 多节点扩展
要增加DataNode,只需在compose文件中添加:
datanode2: image: hadoop-base hostname: datanode2 depends_on: - namenode volumes: - ./data/datanode2:/opt/hadoop/data/dfs/data command: > bash -c " echo 'namenode' >> $HADOOP_HOME/etc/hadoop/workers && $HADOOP_HOME/sbin/hadoop-daemon.sh start datanode && tail -f /dev/null"6. 常见问题排查
Q1:Web界面无法访问
- 检查端口是否冲突
- 查看容器日志:
docker-compose logs namenode
Q2:DataNode未注册
- 检查workers文件配置
- 验证网络连通性:
docker exec datanode1 ping namenode
Q3:资源不足错误
# 调整YARN配置 vim $HADOOP_HOME/etc/hadoop/yarn-site.xml # 增加以下参数 <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>2048</value> </property>最近在帮团队搭建测试环境时,这个方案成功让新人快速上手Hadoop。有个小技巧:把docker-compose.yml推送到Git仓库,团队成员只需git clone加docker-compose up就能获得完全一致的开发环境。