基于Docker部署单机Hadoop:从零开始的完整指南

一、为何选择Docker部署单机Hadoop?

1.1 开发环境隔离性需求

传统Hadoop部署需配置Java环境、SSH免密登录、修改多份配置文件,而Docker通过容器化技术将Hadoop及其依赖(如Java 8、OpenSSH)封装为独立镜像,避免与宿主机环境冲突。例如,开发者可在同一台机器上同时运行Hadoop 2.x和3.x的容器进行兼容性测试。

1.2 资源利用效率提升

Docker容器共享宿主机内核,相比虚拟机减少30%以上的资源占用。对于仅需验证MapReduce程序或HDFS文件操作的场景,单机版Hadoop容器仅需2GB内存即可运行,显著降低硬件成本。

1.3 快速迭代与版本控制

通过Dockerfile定义Hadoop环境,可实现”一键部署”:修改配置后重新构建镜像仅需数秒,配合Git进行版本管理,团队成员可同步获取完全一致的开发环境。

二、Docker部署前准备

2.1 镜像选择策略

  • 官方镜像sequenceiq/hadoop-docker(基于CentOS 6,包含Hadoop 2.7.0)适合快速验证,但版本较旧
  • 定制镜像:推荐基于ubuntu:20.04centos:7构建,可自由控制Hadoop版本(如3.3.4)
  • 轻量级方案:使用alpine基础镜像(仅5MB)需手动安装依赖,适合高级用户

2.2 资源分配建议

组件 最小配置 推荐配置
容器内存 1.5GB 4GB
虚拟CPU核数 1 2
磁盘空间 10GB(数据卷) 50GB(数据卷)

通过docker run -m 4g参数限制容器内存,防止OOM导致HDFS NameNode崩溃。

三、详细部署步骤

3.1 基础镜像构建

创建Dockerfile文件:

  1. FROM ubuntu:20.04
  2. LABEL maintainer="dev@example.com"
  3. # 安装依赖
  4. RUN apt-get update && \
  5. apt-get install -y openjdk-8-jdk wget ssh pdsh && \
  6. rm -rf /var/lib/apt/lists/*
  7. # 下载Hadoop 3.3.4
  8. RUN wget https://archive.apache.org/dist/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gz && \
  9. tar -xzvf hadoop-3.3.4.tar.gz -C /usr/local/ && \
  10. rm hadoop-3.3.4.tar.gz
  11. ENV HADOOP_HOME=/usr/local/hadoop-3.3.4
  12. ENV PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
  13. # 配置SSH免密登录
  14. RUN ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa && \
  15. cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys && \
  16. chmod 0600 ~/.ssh/authorized_keys
  17. COPY core-site.xml hdfs-site.xml mapred-site.xml yarn-site.xml $HADOOP_HOME/etc/hadoop/

3.2 核心配置文件详解

core-site.xml

  1. <configuration>
  2. <property>
  3. <name>fs.defaultFS</name>
  4. <value>hdfs://localhost:9000</value>
  5. </property>
  6. <property>
  7. <name>hadoop.tmp.dir</name>
  8. <value>/tmp/hadoop</value>
  9. </property>
  10. </configuration>

hdfs-site.xml

  1. <configuration>
  2. <property>
  3. <name>dfs.replication</name>
  4. <value>1</value> <!-- 单机模式设为1 -->
  5. </property>
  6. <property>
  7. <name>dfs.namenode.name.dir</name>
  8. <value>/var/lib/hadoop/hdfs/namenode</value>
  9. </property>
  10. </configuration>

3.3 容器启动与初始化

  1. # 创建数据卷持久化目录
  2. mkdir -p ~/hadoop_data/{namenode,datanode}
  3. # 启动容器
  4. docker run -itd \
  5. --name hadoop-single \
  6. -p 9870:9870 -p 8088:8088 \
  7. -v ~/hadoop_data/namenode:/var/lib/hadoop/hdfs/namenode \
  8. -v ~/hadoop_data/datanode:/var/lib/hadoop/hdfs/datanode \
  9. hadoop-custom:3.3.4
  10. # 格式化HDFS
  11. docker exec hadoop-single $HADOOP_HOME/bin/hdfs namenode -format
  12. # 启动HDFS和YARN
  13. docker exec hadoop-single $HADOOP_HOME/sbin/start-dfs.sh
  14. docker exec hadoop-single $HADOOP_HOME/sbin/start-yarn.sh

四、验证与使用

4.1 Web界面访问

  • HDFS管理界面:http://localhost:9870
  • YARN资源管理:http://localhost:8088

4.2 运行示例程序

  1. # 创建HDFS目录
  2. docker exec hadoop-single hdfs dfs -mkdir /input
  3. # 上传本地文件
  4. docker exec hadoop-single hdfs dfs -put $HADOOP_HOME/etc/hadoop/*.xml /input
  5. # 运行WordCount
  6. docker exec hadoop-single hadoop jar \
  7. $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar \
  8. wordcount /input /output
  9. # 查看结果
  10. docker exec hadoop-single hdfs dfs -cat /output/part-r-00000

五、常见问题解决方案

5.1 容器启动失败排查

  1. SSH服务未启动:检查/var/log/auth.log,确保sshd服务已运行
  2. 权限问题:使用docker exec -u root以root用户执行初始化命令
  3. 端口冲突:通过docker ps确认9870/8088端口未被占用

5.2 数据持久化最佳实践

  • 推荐使用-v参数挂载宿主机目录,避免容器删除导致数据丢失
  • 对于生产环境,可配置HDFS的dfs.datanode.data.dir使用多磁盘挂载点

5.3 性能优化建议

  • 调整JVM堆大小:修改hadoop-env.sh中的HADOOP_HEAPSIZE参数
  • 启用压缩:在mapred-site.xml中设置mapreduce.map.output.compress=true
  • 调整并行度:根据CPU核心数设置mapreduce.job.maps参数

六、进阶使用场景

6.1 多容器集群模拟

通过docker-compose定义多个服务节点:

  1. version: '3'
  2. services:
  3. namenode:
  4. image: hadoop-custom:3.3.4
  5. command: /usr/local/hadoop-3.3.4/sbin/start-dfs.sh
  6. ports:
  7. - "9870:9870"
  8. datanode1:
  9. image: hadoop-custom:3.3.4
  10. depends_on:
  11. - namenode
  12. command: sleep infinity
  13. # 可扩展多个datanode

6.2 与Spark集成

在Dockerfile中添加Spark安装步骤:

  1. RUN wget https://archive.apache.org/dist/spark/spark-3.3.0/spark-3.3.0-bin-hadoop3.tgz && \
  2. tar -xzvf spark-3.3.0-bin-hadoop3.tgz -C /usr/local/ && \
  3. rm spark-3.3.0-bin-hadoop3.tgz
  4. ENV SPARK_HOME=/usr/local/spark-3.3.0-bin-hadoop3
  5. ENV PATH=$PATH:$SPARK_HOME/bin

通过这种部署方式,开发者可在5分钟内完成从环境搭建到分布式计算的全流程验证,显著提升大数据开发效率。建议定期更新基础镜像以获取安全补丁,并通过CI/CD管道自动化构建流程。