找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2152

积分

0

好友

308

主题
发表于 6 天前 | 查看: 17| 回复: 0

在大数据时代,Hadoop已经成为分布式计算和存储的事实标准。然而,传统的多物理服务器部署方式对学习和测试而言成本高昂。本文将详细介绍如何利用Docker容器化技术,在单台Ubuntu机器上快速构建一个功能完备的Hadoop分布式集群。这种方法能以极低的硬件成本,模拟出真实的多节点环境,是学习大数据技术和搭建测试环境的理想选择。

一、环境准备

系统要求

  • 操作系统:Ubuntu 22.04/24.04 LTS(推荐LTS版本,稳定性更好)
  • 内存:至少4GB RAM(8GB最佳,运行多容器时更流畅)
  • 存储:20GB可用磁盘空间以上(Hadoop镜像、数据和日志需要充足空间)
  • 处理器:2核以上CPU(支持多任务并行处理)

安装必要软件

首先,我们需要在Ubuntu系统上安装Docker,这是实现容器化部署的基石。

# 更新系统软件包列表(确保安装最新版本)
sudo apt update && sudo apt upgrade -y

# 安装Docker(容器化核心工具)
sudo apt install docker.io -y

# 启动Docker服务
sudo systemctl start docker

# 设置Docker开机自启动(避免每次开机手动启动)
sudo systemctl enable docker

# 验证Docker安装是否成功
docker --version

# 创建Hadoop专用工作目录(保持文件结构清晰)
mkdir hadoop-docker && cd hadoop-docker

💡 实用提示

  • 国内用户优化:安装Docker前建议先更换国内镜像源,可将下载速度提升10倍以上!
    # 更换Ubuntu软件源为阿里云
    sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
    sudo sed -i ‘s/archive.ubuntu.com/mirrors.aliyun.com/g’ /etc/apt/sources.list
    sudo apt update
  • 免sudo使用Docker:执行以下命令后重新登录,即可避免每次使用Docker都输入sudo
    sudo usermod -aG docker $USER
  • Docker镜像加速:配置Docker镜像加速器,提升Hadoop镜像下载速度
    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-‘EOF’
    {
      “registry-mirrors“: [“https://registry.docker-cn.com“, “https://docker.mirrors.ustc.edu.cn“]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker

二、创建Docker网络

Hadoop集群节点间需要稳定、低延迟的通信。为此,我们创建一个专用的Docker桥接网络,让所有节点处于同一网络环境,便于互相识别。

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

网络配置详解

  • --driver bridge:使用桥接网络模式,这是Docker最常用的网络模式,允许容器之间互相通信。
  • --subnet=172.18.0.0/16:为Hadoop集群指定专用子网,预留了充足的IP地址。
  • hadoop-net:为网络命名,便于后续启动容器时引用。

验证网络创建

docker network inspect hadoop-net

执行后,确认网络已成功创建。

📌 注意事项

  • 如果172.18.0.0/16网段已被占用,可修改为其他未使用的网段(如172.19.0.0/16)。
  • 该网络只需创建一次,后续所有Hadoop容器都会连接到这个网络。

三、构建基础镜像

我们需要构建一个包含Hadoop完整运行环境的Docker基础镜像,作为所有集群节点(Master和Worker)的统一基础,确保环境一致性。

1. 创建Dockerfile

# 使用vim创建Dockerfile
vi Dockerfile

2. Dockerfile内容与详细说明

# 基于Ubuntu 22.04 LTS镜像构建(选择稳定版本)
FROM ubuntu:22.04

# 设置环境变量避免安装过程中的交互提示
ENV DEBIAN_FRONTEND=noninteractive

# 安装必要的基础工具包
RUN apt update && apt install -y \
    openssh-server \
    openjdk-21-jdk \
    wget \
    vim \
    net-tools \
    iputils-ping \
    dnsutils

# 配置SSH服务(Hadoop集群通信的核心方式)
RUN mkdir -p /var/run/sshd
RUN echo ‘root:root’ | chpasswd  # 设置root密码,用于首次登录
RUN sed -i ‘s/#PermitRootLogin prohibit-password/PermitRootLogin yes/’ /etc/ssh/sshd_config
RUN sed -i ‘s/#PasswordAuthentication yes/PasswordAuthentication yes/’ /etc/ssh/sshd_config

# 安装Hadoop 3.4.1(最新稳定版)
ENV HADOOP_VERSION=3.4.1
ENV HADOOP_URL=https://downloads.apache.org/hadoop/common/hadoop-$HADOOP_VERSION/hadoop-$HADOOP_VERSION.tar.gz

RUN wget $HADOOP_URL -O hadoop.tar.gz && \
    tar -xzvf hadoop.tar.gz -C /usr/local/ && \
    rm hadoop.tar.gz && \
    mv /usr/local/hadoop-$HADOOP_VERSION /usr/local/hadoop

# 设置Hadoop所需的环境变量
ENV JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64
ENV HADOOP_HOME=/usr/local/hadoop
ENV PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

# 创建Hadoop数据存储目录
RUN mkdir -p /usr/local/hadoop/namenode_dir  # NameNode元数据存储目录
RUN mkdir -p /usr/local/hadoop/datanode_dir  # DataNode实际数据存储目录
RUN mkdir -p /usr/local/hadoop/tmp          # Hadoop临时文件目录

# 暴露Hadoop相关端口
EXPOSE 22    # SSH端口,用于节点间通信
EXPOSE 9870  # HDFS NameNode Web UI端口
EXPOSE 8088  # YARN ResourceManager Web UI端口
EXPOSE 9000  # HDFS RPC端口,用于客户端通信
EXPOSE 50070 # HDFS旧版Web UI端口(兼容旧版本)
EXPOSE 50010 # DataNode传输端口

# 复制并设置启动脚本
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT [“/entrypoint.sh“]

3. 创建容器启动脚本

# 创建entrypoint.sh启动脚本
vi entrypoint.sh

4. 启动脚本内容与作用

#!/bin/bash

# 启动SSH服务(Hadoop集群通信必需)
service ssh start

# 生成SSH密钥对(如果不存在)
if [ ! -f ~/.ssh/id_rsa ]; then
    ssh-keygen -t rsa -P ‘’ -f ~/.ssh/id_rsa
    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    chmod 600 ~/.ssh/authorized_keys
fi

# 保持容器持续运行(Docker容器需要一个前台进程来维持运行状态)
tail -f /dev/null

5. 构建Docker镜像

# 使用当前目录的Dockerfile构建名为hadoop-base的镜像
docker build -t hadoop-base .

⏱️ 构建时间预估:通常需要10-20分钟(取决于网络速度)。

💡 国内加速技巧

  • 方法1:在Dockerfile中将HADOOP_URL替换为国内镜像源地址,如清华源。
  • 方法2:提前从国内镜像站下载Hadoop安装包到本地,使用COPY命令直接复制到镜像中。

6. 验证镜像构建成功

# 查看本地镜像列表,确认hadoop-base已存在
docker images | grep hadoop-base

如果看到hadoop-base相关的输出,说明镜像构建成功。

四、启动Hadoop集群

现在开始启动Hadoop集群的各个节点。我们将创建1个Master节点2个Worker节点,形成一个功能完整的最小化分布式计算集群。

1. 启动Master节点

Master节点是集群的大脑,负责管理HDFS元数据(NameNode)和调度集群资源(ResourceManager)。

docker run -itd \
  --name master \
  --hostname master \
  --net hadoop-net \
  --ip 172.18.0.2 \
  -p 9870:9870 \
  -p 8088:8088 \
  -p 9000:9000 \
  hadoop-base

2. 启动Worker节点

Worker节点是集群的执行者,负责存储实际数据块(DataNode)和执行计算任务(NodeManager)。

# 启动第一个Worker节点
docker run -itd \
  --name worker01 \
  --hostname worker01 \
  --net hadoop-net \
  --ip 172.18.0.3 \
  hadoop-base

# 启动第二个Worker节点
docker run -itd \
  --name worker02 \
  --hostname worker02 \
  --net hadoop-net \
  --ip 172.18.0.4 \
  hadoop-base

3. 验证节点启动

# 查看正在运行的Docker容器
docker ps

执行后,应能看到master、worker01、worker02三个容器都在运行。

4. 集群节点规划

节点名称 节点角色 IP地址 主要职责
master 主节点 172.18.0.2 管理集群资源和元数据
worker01 工作节点 172.18.0.3 存储数据和执行计算
worker02 工作节点 172.18.0.4 存储数据和执行计算

5. 端口映射说明

  • 9870:HDFS NameNode Web UI端口(用于查看HDFS状态)
  • 8088:YARN ResourceManager Web UI端口(用于监控集群资源)
  • 9000:HDFS RPC通信端口(用于客户端与HDFS交互)

这些端口被映射到宿主机,方便我们通过浏览器直接访问Hadoop的Web界面。

五、配置主机解析

为了让集群节点能够通过主机名互相通信,需要在每个节点的/etc/hosts文件中添加映射关系。Hadoop配置文件使用主机名而非IP,这提升了可读性和维护性。

配置所有节点的hosts文件

# 配置Master节点的hosts文件
docker exec master bash -c “echo ‘172.18.0.2 master’ >> /etc/hosts“
docker exec master bash -c “echo ‘172.18.0.3 worker01’ >> /etc/hosts“
docker exec master bash -c “echo ‘172.18.0.4 worker02’ >> /etc/hosts“

# 配置Worker01节点的hosts文件
docker exec worker01 bash -c “echo ‘172.18.0.2 master’ >> /etc/hosts“
docker exec worker01 bash -c “echo ‘172.18.0.3 worker01’ >> /etc/hosts“
docker exec worker01 bash -c “echo ‘172.18.0.4 worker02’ >> /etc/hosts“

# 配置Worker02节点的hosts文件
docker exec worker02 bash -c “echo ‘172.18.0.2 master’ >> /etc/hosts“
docker exec worker02 bash -c “echo ‘172.18.0.3 worker01’ >> /etc/hosts“
docker exec worker02 bash -c “echo ‘172.18.0.4 worker02’ >> /etc/hosts“

验证主机解析配置

# 在Master节点上测试与Worker节点的通信(使用主机名)
docker exec master ping -c 2 worker01
docker exec master ping -c 2 worker02

如果所有ping命令都能正常响应,说明主机解析配置成功。

六、配置SSH免密登录

Hadoop节点间需要频繁、自动地进行通信。配置SSH免密登录是实现自动化操作(如启动脚本、运行MapReduce任务)的关键。

配置步骤

1. 进入Master容器

docker exec -it master bash

2. 生成SSH密钥对

在Master节点上生成RSA密钥对:

ssh-keygen -t rsa -P ‘’ -f ~/.ssh/id_rsa

执行后,会在~/.ssh/目录下生成私钥id_rsa和公钥id_rsa.pub

3. 配置免密登录

将Master节点的公钥复制到所有节点(包括Master自身):

# 将公钥复制到所有节点(包括Master自己)
ssh-copy-id master
ssh-copy-id worker01
ssh-copy-id worker02

第一次执行时,系统会提示确认连接(输入yes)并输入目标节点密码(输入root)。

4. 验证免密登录

测试从Master节点到所有节点的免密登录:

# 测试与Master自身的免密登录
ssh master hostname  # 应返回 master

# 测试与worker01的免密登录
ssh worker01 hostname  # 应返回 worker01

# 测试与worker02的免密登录
ssh worker02 hostname  # 应返回 worker02

如果所有命令都能直接返回节点主机名,无需输入密码,说明SSH免密登录配置成功。

常见问题与解决方案

  • 问题1ssh-copy-id命令不可用。
    解决方案:手动复制公钥。
    cat ~/.ssh/id_rsa.pub | ssh worker01 “mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys“
  • 问题2:免密登录失败。
    解决方案:检查并设置正确的文件权限。
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/id_rsa
    chmod 644 ~/.ssh/id_rsa.pub
    chmod 600 ~/.ssh/authorized_keys

七、配置Hadoop集群

这是搭建过程中最关键的部分,需要创建和配置多个核心文件来定义集群行为,包括HDFS和YARN的配置。合理的配置管理是集群稳定运行的基础。

1. 创建配置文件目录

mkdir -p /usr/local/hadoop/etc/hadoop/config
cd /usr/local/hadoop/etc/hadoop/config

2. 配置core-site.xml

core-site.xml是Hadoop的核心配置文件,定义了HDFS的默认文件系统和临时目录。

<configuration>
<!-- 定义HDFS的默认文件系统 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
<!-- master:9000 表示HDFS的NameNode运行在master节点的9000端口 -->
</property>

<!-- 定义Hadoop的临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
<!-- 所有Hadoop组件都会使用这个临时目录 -->
</property>
</configuration>

3. 配置hdfs-site.xml

hdfs-site.xml定义了HDFS的存储策略和数据复制方式。

<configuration>
<!-- 定义数据块的复制因子 -->
<property>
<name>dfs.replication</name>
<value>2</value>
<!-- 每个数据块将被复制2份,存储在不同的节点上 -->
</property>

<!-- 定义NameNode存储元数据的目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/usr/local/hadoop/namenode_dir</value>
</property>

<!-- 定义DataNode存储实际数据的目录 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/usr/local/hadoop/datanode_dir</value>
</property>

<!-- 禁用HDFS权限检查(仅用于测试环境) -->
<property>
<name>dfs.permissions</name>
<value>false</value>
<!-- 生产环境建议设置为true,启用权限控制 -->
</property>
</configuration>

4. 配置mapred-site.xml

mapred-site.xml定义了MapReduce的运行框架和环境变量。

<configuration>
<!-- 定义MapReduce的运行框架 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<!-- 使用YARN作为MapReduce的资源管理器 -->
</property>

<!-- 设置MapReduce应用程序的环境变量 -->
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
</property>

<!-- 设置Map任务的环境变量 -->
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
</property>

<!-- 设置Reduce任务的环境变量 -->
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
</property>
</configuration>

5. 配置yarn-site.xml

yarn-site.xml定义了YARN资源管理器的配置。

<configuration>
<!-- 定义NodeManager的辅助服务 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<!-- 启用MapReduce的shuffle服务 -->
</property>

<!-- 定义ResourceManager的主机名 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
<!-- ResourceManager运行在master节点上 -->
</property>

<!-- 定义NodeManager的环境变量白名单 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
<!-- 这些环境变量将被传递给YARN的子进程 -->
</property>
</configuration>

6. 配置workers文件

workers文件定义了Hadoop集群中的Worker节点列表。

worker01
worker02

7. 配置环境变量

编辑hadoop-env.sh文件,设置必要的环境变量:

# 设置Java环境变量
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64
# 设置Hadoop安装目录
export HADOOP_HOME=/usr/local/hadoop
# 设置Hadoop配置文件目录
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
# 设置HDFS相关进程的用户
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
# 设置YARN相关进程的用户
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

8. 分发配置到Worker节点

将Master节点上的配置文件复制到所有Worker节点:

# 在Master容器中执行
for worker in worker01 worker02; do
  scp -r $HADOOP_HOME/etc/hadoop/config/* $worker:$HADOOP_HOME/etc/hadoop/
  scp $HADOOP_HOME/etc/hadoop/hadoop-env.sh $worker:$HADOOP_HOME/etc/hadoop/
done

八、启动Hadoop集群

完成所有配置后,现在可以启动Hadoop集群了。

1. 格式化NameNode

在启动HDFS之前,需要先格式化NameNode。此操作会初始化HDFS的元数据存储目录

hdfs namenode -format

成功标志:看到”Storage directory has been successfully formatted”的信息。
注意事项:格式化会清除所有HDFS上的数据,仅首次启动时需要执行。

2. 启动HDFS

HDFS是Hadoop的分布式文件系统,负责存储数据。

start-dfs.sh

3. 验证HDFS启动

jps

在Master节点上,应能看到NameNodeDataNodeSecondaryNameNode进程。

4. 启动YARN

YARN是Hadoop的资源管理器,负责管理集群的计算资源和任务调度。

start-yarn.sh

5. 验证YARN启动

jps

在Master节点上,应能看到新增的ResourceManagerNodeManager进程。

6. 在Worker节点验证

# 验证worker01节点的进程
docker exec worker01 jps
# 应看到:DataNode, NodeManager

# 验证worker02节点的进程
docker exec worker02 jps
# 应看到:DataNode, NodeManager

如果所有节点都能看到相应的进程,说明Hadoop集群已经成功启动!

💡 启动技巧

  • 可使用start-all.sh一次性启动HDFS和YARN。
  • 关闭集群使用stop-dfs.shstop-yarn.shstop-all.sh
  • 如果启动失败,查看/usr/local/hadoop/logs/目录下的日志文件排查错误。

九、验证集群功能

启动集群后,需要验证其各项功能是否正常工作。

1. 创建测试目录并上传文件

hdfs dfs -mkdir -p /user/root/input
echo “Hello Hadoop World“ > test.txt
hdfs dfs -put test.txt /user/root/input
hdfs dfs -ls /user/root/input

2. 运行WordCount示例

WordCount是Hadoop的经典示例程序,用于统计文本中单词的出现次数。

hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.4.1.jar \
  wordcount /user/root/input /user/root/output

3. 查看结果

hdfs dfs -cat /user/root/output/part-r-00000

应看到类似输出:

Hello    1
Hadoop   1
World    1

4. 访问Web UI

Hadoop提供了直观的Web界面用于监控和管理集群:

  • HDFS NameNode UIhttp://localhost:9870
    • 查看HDFS文件系统结构
    • 监控DataNode状态
    • 查看集群存储使用情况
  • YARN ResourceManager UIhttp://localhost:8088
    • 监控集群资源使用情况
    • 查看正在运行的任务
    • 管理应用程序

十、常见问题解决方案

问题1:SSH连接被拒绝

可能原因:SSH服务未启动、配置错误或权限问题。
解决方案

# 确保SSH服务运行
service ssh status
# 如果未运行,启动SSH服务
service ssh start
# 检查SSH配置文件,确保PermitRootLogin和PasswordAuthentication设置为yes

问题2:JAVA_HOME不存在或配置错误

可能原因:Java路径配置错误或Java未正确安装。
解决方案

# 检查实际Java路径
readlink -f $(which java)
# 更新hadoop-env.sh中的JAVA_HOME为实际路径

问题3:DataNode无法启动

可能原因:DataNode与NameNode的集群ID不匹配、数据目录损坏。
解决方案

# 常见解决方法:清理旧数据并重新格式化
rm -rf /usr/local/hadoop/namenode_dir/*
rm -rf /usr/local/hadoop/datanode_dir/*
rm -rf /usr/local/hadoop/tmp/*
hdfs namenode -format
# 重新启动HDFS
stop-dfs.sh
start-dfs.sh

十一、集群维护与使用建议

1. 日常维护

  • 定期备份:定期备份NameNode的元数据目录。
  • 监控集群状态:通过Web UI或hdfs dfsadmin -reportyarn node -list命令监控。
  • 清理临时文件:定期清理HDFS中的临时文件。

2. 集群扩展

如何添加新的Worker节点(例如worker03):

  1. 启动新容器并加入hadoop-net网络。
  2. 在所有节点的hosts文件中添加新节点映射。
  3. 将Master节点的SSH公钥复制到新节点。
  4. 将配置文件分发到新节点。
  5. 更新Master节点上的workers文件,添加worker03
  6. 在新节点上启动HDFS和YARN服务。

3. 应用场景

此Docker化Hadoop集群适用于:

  • 大数据分析学习:运行MapReduce或Spark任务。
  • 功能验证:测试Hadoop生态组件(如Hive、HBase)的集成。
  • 原型开发:快速搭建开发测试环境。

十二、总结

通过本教程,我们成功地使用Docker在Ubuntu上搭建了一个功能完备的Hadoop集群。相比传统方式,这种容器化部署具有资源高效、快速部署、环境隔离、可重复和易于维护的显著优势。

后续学习建议

  1. 扩展集群:尝试添加更多Worker节点,体验大规模分布式计算。
  2. 集成生态组件:在现有集群上部署Hive、HBase等,构建更完整的数据处理平台。
  3. 探索高可用(HA):研究并配置NameNode高可用方案,提升集群可靠性。
  4. 学习新一代框架:了解并尝试在集群上运行Spark、Flink等计算框架。

希望本教程能帮助你顺利开启大数据实践之旅。如果你在搭建过程中遇到问题,欢迎在云栈社区与更多开发者交流讨论。




上一篇:消息队列架构设计与工程实践:从技术选型到系统思维演进
下一篇:Linux文件时间戳详解:atime, mtime, ctime作用与常见操作指南
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-10 09:16 , Processed in 0.294760 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表