前言

Apache Hadoop 是大数据生态的基石框架,提供了分布式存储(HDFS)和分布式计算(YARN + MapReduce)两大核心能力。尽管当前 Spark、Flink 等新一代计算引擎已成为主流,但 Hadoop 仍然是绝大多数大数据平台的底层基础设施——HDFS 提供可靠的海量数据存储,YARN 提供统一的资源调度管理。

本文以 Hadoop 3.3.6 版本为例,手把手讲解在 3 台 CentOS 7 虚拟机上搭建集群的全过程,涵盖环境准备、JDK 安装、Hadoop 配置、集群启动与验证。适合大数据初学者和需要快速搭建测试环境的工程师参考。

1. 基础设施

  • 3 台 CentOS 7 最小化安装的主机或虚拟机
  • 能够正常上网,并且 3 台机器都处于同一个局域网
  • 每台机器建议配置:4C4G 以上

2. 环境准备

2.1 创建 hadoop 用户并配置 sudo 权限(每台机器执行)

使用 root 账户操作:

useradd hadoop          # 创建用户
passwd hadoop           # 设置密码

修改 /etc/sudoers 文件:

vim /etc/sudoers

%wheel 那行下面添加一行:

%wheel  ALL=(ALL)       ALL
hadoop  ALL=(ALL)       NOPASSWD:ALL

💡 使用 NOPASSWD:ALL 可以免密码执行 sudo 命令,方便集群管理。生产环境建议根据安全策略调整。

2.2 关闭防火墙、创建目录(每台机器执行)

退出 root,使用 hadoop 用户登录:

# 关闭防火墙
sudo systemctl stop firewalld
sudo systemctl disable firewalld

# 创建目录
sudo mkdir /opt/module
sudo mkdir /opt/software

# 修改目录所属主和所属组
sudo chown hadoop:hadoop /opt/module
sudo chown hadoop:hadoop /opt/software

2.3 设置静态 IP(每台机器执行)

修改网络配置文件:

sudo vim /etc/sysconfig/network-scripts/ifcfg-ens33

文件内容修改如下(注意每台机器 IPADDR 不同):

ONBOOT="yes"
BOOTPROTO=static
IPADDR=192.168.1.101      # hadoop2 改为 192.168.1.102,hadoop3 改为 192.168.1.103
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=114.114.114.114
DNS2=8.8.8.8

重启网络服务并验证:

sudo systemctl restart network
ip addr                   # 查看 IP
ping www.baidu.com        # 验证网络连通性

2.4 修改主机名和 hosts 文件(每台机器执行)

设置主机名:

sudo vim /etc/hostname

分别设置为 hadoop1hadoop2hadoop3

配置 hosts 映射:

sudo vim /etc/hosts

在末行添加:

192.168.1.101 hadoop1
192.168.1.102 hadoop2
192.168.1.103 hadoop3

2.5 重启所有机器

sudo reboot

2.6 实用脚本

2.6.1 集群分发脚本 xsync

在 hadoop1 上操作(hadoop 用户登录,工作目录 /home/hadoop):

mkdir ~/bin
vim ~/bin/xsync

输入以下内容:

#!/bin/bash

#1. 判断参数个数
if [ $# -lt 1 ]
then
  echo Not Enough Arguement!
  exit;
fi

#2. 遍历集群所有机器,in 后面的是集群配置的3台机器的映射主机名
#   可根据实际情况增改
for host in hadoop1 hadoop2 hadoop3
do
  echo ====================  $host  ====================
  #3. 遍历所有目录,挨个发送
  for file in $@
  do
    #4 判断文件是否存在
    if [ -e $file ]
    then
      #5. 获取父目录
      pdir=$(cd -P $(dirname $file); pwd)
      #6. 获取当前文件的名称
      fname=$(basename $file)
      ssh $host "mkdir -p $pdir"
      rsync -av $pdir/$fname $host:$pdir
    else
      echo $file does not exists!
    fi
  done
done

添加执行权限并测试:

chmod +x ~/bin/xsync

# 将脚本自身分发到其他节点
xsync ~/bin/xsync
2.6.2 集群命令执行脚本 xcall
vim ~/bin/xcall

输入以下内容:

#!/bin/bash

for i in hadoop1 hadoop2 hadoop3
do
    echo --------- $i ----------
    ssh $i "$*"
done

添加执行权限:

chmod +x ~/bin/xcall

2.7 配置 SSH 免密登录(每台机器执行)

生成公钥和密钥:

ssh-keygen -t rsa    # 连按三次回车,使用默认配置

将公钥分发到所有节点:

ssh-copy-id hadoop1
ssh-copy-id hadoop2
ssh-copy-id hadoop3

验证免密登录:

ssh hadoop2 hostname    # 应直接返回主机名,无需输入密码

2.8 JDK 安装

下载地址:Java SE 8 Archive Downloads(需登录 Oracle 账户)

在这里插入图片描述

下载完成后上传到 hadoop1 的 /opt/software 目录,执行解压:

tar -zxvf /opt/software/jdk-8u202-linux-x64.tar.gz -C /opt/module/

配置环境变量:

sudo vim /etc/profile.d/my_env.sh

输入如下内容:

#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_202
export PATH=$PATH:$JAVA_HOME/bin

使环境变量生效并验证:

source /etc/profile.d/my_env.sh
java -version

输出类似如下即表示安装成功:

openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)

分发 JDK 到集群所有节点:

xsync /opt/module/jdk1.8.0_202
sudo /home/hadoop/bin/xsync /etc/profile.d/my_env.sh

在其它机器上执行 source /etc/profile.d/my_env.sh,然后验证:

xcall java -version

3. Hadoop 安装部署

3.1 集群规划

组件 hadoop1 hadoop2 hadoop3
IP 192.168.1.101 192.168.1.102 192.168.1.103
HDFS NameNode, DataNode DataNode SecondaryNameNode, DataNode
YARN NodeManager ResourceManager, NodeManager NodeManager
其他 HistoryServer

💡 角色分配说明

  • NameNode 放在 hadoop1:NameNode 是 HDFS 的核心,需要较高内存
  • ResourceManager 放在 hadoop2:RM 是 YARN 的核心,与 NN 分离可以避免单点资源争抢
  • SecondaryNameNode 放在 hadoop3:2NN 辅助 NN 合并 FsImage 和 EditLog,不与其他主节点同机

3.2 下载安装

下载地址:Hadoop 3.3.6 发行版

在这里插入图片描述

下载完成后上传到hadoop1的 /opt/software 目录,上传完成后使用hadoop账户登录hadoop1执行下面的命令解压到 /opt/module 目录:

tar -zxvf /opt/software/hadoop-3.3.6.tar.gz -C /opt/module

创建软链接并配置环境变量:

cd /opt/module
ln -s hadoop-3.3.6 hadoop

sudo vim /etc/profile.d/my_env.sh

在文件末尾添加:

#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

分发环境变量文件

sudo /home/hadoop/bin/xsync /etc/profile.d/my_env.sh

在每台机器上执行 source

source /etc/profile.d/my_env.sh

验证 Hadoop 安装:

hadoop version

3.3 配置集群

以下配置均在 hadoop1 上执行,配置目录为 $HADOOP_HOME/etc/hadoop

3.3.1 核心配置文件:core-site.xml
cd $HADOOP_HOME/etc/hadoop
vim core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <!-- 指定NameNode的地址 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop1:8020</value>
</property>
<!-- 指定hadoop数据的存储目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop/data</value>
</property>

<!-- 配置HDFS网页登录使用的静态用户为hadoop -->
    <property>
        <name>hadoop.http.staticuser.user</name>
        <value>hadoop</value>
</property>

<!-- 配置该hadoop用户允许通过代理访问的主机节点 -->
    <property>
        <name>hadoop.proxyuser.hadoop.hosts</name>
        <value>*</value>
</property>
<!-- 配置该hadoop用户允许通过代理用户所属组 -->
    <property>
        <name>hadoop.proxyuser.hadoop.groups</name>
        <value>*</value>
</property>
<!-- 配置该hadoop用户允许通过代理的用户-->
    <property>
        <name>hadoop.proxyuser.hadoop.users</name>
        <value>*</value>
</property>
</configuration>

关键配置说明

配置项 说明
fs.defaultFS HDFS 的 NameNode 地址,客户端通过此地址访问 HDFS
hadoop.tmp.dir Hadoop 运行时数据的本地存储目录,格式化 NameNode 时会初始化此目录
hadoop.http.staticuser.user 访问 HDFS Web UI 时使用的默认用户
hadoop.proxyuser.* 代理用户配置,允许 hadoop 用户代理其他用户访问 HDFS
3.3.2 HDFS 配置文件:hdfs-site.xml
vim hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <!-- nn web端访问地址-->
    <property>
        <name>dfs.namenode.http-address</name>
        <value>hadoop1:9870</value>
    </property>

    <!-- 2nn web端访问地址-->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop3:9868</value>
    </property>

    <!-- 测试环境指定HDFS副本的数量1 -->
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>

关键配置说明

配置项 说明
dfs.namenode.http-address NameNode Web UI 端口(Hadoop 3.x 为 9870,2.x 为 50070)
dfs.namenode.secondary.http-address SecondaryNameNode Web UI 端口
dfs.replication HDFS 数据块副本数,测试环境设为 1 节省空间,生产环境建议 3
3.3.3 YARN 配置文件:yarn-site.xml
vim yarn-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <!-- 指定MR走shuffle -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>

    <!-- 指定ResourceManager的地址-->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop2</value>
    </property>

    <!-- 环境变量的继承 -->
    <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>
    </property>

    <!--yarn单个容器允许分配的最大最小内存 -->
    <property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>512</value>
    </property>
    <property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>4096</value>
    </property>

    <!-- yarn容器允许管理的物理内存大小 -->
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>4096</value>
    </property>

    <!-- 关闭yarn对物理内存和虚拟内存的限制检查 -->
    <property>
        <name>yarn.nodemanager.pmem-check-enabled</name>
        <value>true</value>
    </property>
    <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
    </property>

    <!-- 开启日志聚集功能 -->
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>

    <!-- 设置日志聚集服务器地址 -->
    <property>  
            <name>yarn.log.server.url</name>  
        <value>http://hadoop1:19888/jobhistory/logs</value>
    </property>

    <!-- 设置日志保留时间为7天 -->
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>604800</value>
    </property>
</configuration>

关键配置说明

配置项 说明
yarn.resourcemanager.hostname ResourceManager 所在节点,本例为 hadoop2
yarn.nodemanager.resource.memory-mb NodeManager 可管理的总内存,需根据实际机器配置调整
yarn.nodemanager.vmem-check-enabled 设为 false 可避免容器因虚拟内存超限被 kill
yarn.log-aggregation-enable 开启后任务日志自动收集到 HDFS,便于排查问题
3.3.4 MapReduce 配置文件:mapred-site.xml
vim mapred-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <!-- 指定MapReduce程序运行在Yarn上 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <!-- 历史服务器端地址 -->
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>hadoop1:10020</value>
    </property>

    <!-- 历史服务器web端地址 -->
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hadoop1:19888</value>
    </property>
</configuration>
3.3.5 Worker 配置文件
vim workers

⚠️ Hadoop 3.x 中该文件名为 workers(Hadoop 2.x 为 slaves)。

删除默认的 localhost,添加如下内容:

hadoop1
hadoop2
hadoop3

3.4 分发 Hadoop 到所有节点

xsync /opt/module/hadoop /opt/module/hadoop-3.3.6

3.5 启动集群

3.5.1 格式化 NameNode(首次启动必须执行)
cd $HADOOP_HOME
bin/hdfs namenode -format

在这里插入图片描述

出现 successfully formatted 表示格式化成功。

在这里插入图片描述

⚠️ 重要提醒:格式化 NameNode 是首次部署时的操作。如果集群已经运行过,需要重新格式化时,必须先停止所有服务,再删除所有节点的 data 目录,最后再格式化。反复格式化会导致 NameNode 和 DataNode 的 clusterID 不一致,DataNode 无法启动。

3.5.2 启动 HDFS 和 YARN

在 hadoop1 上启动 HDFS、YARN:

sbin/start-dfs.sh
sbin/start-yarn.sh

在这里插入图片描述

3.5.3 验证进程

使用 xcall 检查各节点进程:

xcall jps

预期输出:

节点 进程
hadoop1 NameNode, DataNode, Jps
hadoop2 DataNode, ResourceManager, NodeManager, Jps
hadoop3 DataNode, SecondaryNameNode, NodeManager, Jps
3.5.4 Web UI 访问
服务 地址 说明
HDFS NameNode http://hadoop1:9870 HDFS 管理界面
YARN ResourceManager http://hadoop2:8088 YARN 资源管理界面
MapReduce HistoryServer http://hadoop1:19888 历史任务查看

在这里插入图片描述

💡 如果从 Windows 浏览器访问,确保 hosts 文件中已配置 hadoop1/2/3 的 IP 映射,或直接用 IP 地址访问。

3.5.5 关闭集群
stop-yarn.sh
stop-dfs.sh

在这里插入图片描述

3.6 一键启停脚本

/home/hadoop/bin 下创建 hdp.sh

vim ~/bin/hdp.sh

在这里插入图片描述

添加下文:

#!/bin/bash
if [ $# -lt 1 ]
then
    echo "没有输入参数!"
    echo "示例:hdp.sh start|stop"
    exit ;
fi
case $1 in
"start")
        echo " =================== 启动 hadoop集群 ==================="

        echo " --------------- 启动 hdfs ---------------"
        ssh hadoop1 "/opt/module/hadoop/sbin/start-dfs.sh"
        echo " --------------- 启动 yarn ---------------"
        ssh hadoop2 "/opt/module/hadoop/sbin/start-yarn.sh"
        echo " --------------- 启动 historyserver ---------------"
        ssh hadoop1 "/opt/module/hadoop/bin/mapred --daemon start historyserver"
;;
"stop")
        echo " =================== 关闭 hadoop集群 ==================="

        echo " --------------- 关闭 historyserver ---------------"
        ssh hadoop1 "/opt/module/hadoop/bin/mapred --daemon stop historyserver"
                echo " --------------- 关闭 yarn ---------------"
        ssh hadoop2 "/opt/module/hadoop/sbin/stop-yarn.sh"
        echo " --------------- 关闭 hdfs ---------------"
        ssh hadoop1 "/opt/module/hadoop/sbin/stop-dfs.sh"
;;
*)
    echo "输入参数有误!"
    echo "示例:hdp.sh start|stop"
;;
esac

添加执行权限:

chmod +x ~/bin/hdp.sh

在这里插入图片描述

使用方式:

hdp.sh start    # 启动集群
hdp.sh stop     # 关闭集群

在这里插入图片描述

3.7 运行测试任务

集群启动后,运行一个示例任务验证:

# 创建 HDFS 测试目录
hdfs dfs -mkdir /input

# 上传测试文件
hdfs dfs -put $HADOOP_HOME/etc/hadoop/core-site.xml /input/

# 运行 WordCount 示例
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /input /output

# 查看结果
hdfs dfs -cat /output/part-r-00000

4. 常见问题排查

问题 可能原因 解决方案
DataNode 启动失败 多次格式化导致 clusterID 不一致 停止集群,删除所有节点的 dataname 目录,重新格式化 NameNode
NameNode 安全模式无法写入 未退出安全模式 hdfs dfsadmin -safemode leave
YARN 容器被 kill 内存不足或 vmem 检查 调大 NM 内存配置,关闭 vmem 检查
Web UI 无法访问 防火墙未关闭或 IP 映射错误 检查防火墙状态,确认 hosts 配置正确
SSH 免密登录失败 权限问题 确保 ~/.ssh 目录权限为 700,authorized_keys 权限为 600

5. 总结

本文完成了 Hadoop 3.3.6 分布式集群的安装部署,主要涵盖以下内容:

5.1 部署流程回顾

环境准备 → JDK 安装 → Hadoop 下载解压 → 配置文件修改 → 集群分发 → 格式化 → 启动验证

5.2 关键节点总结

阶段 关键操作 注意事项
环境准备 用户创建、静态IP、SSH免密、主机名 3 台机器都要执行,注意 IP 和主机名对应关系
JDK 安装 解压到 /opt/module,配置环境变量 需要分发到所有节点
Hadoop 配置 core-site / hdfs-site / yarn-site / mapred-site / workers 在 hadoop1 上统一配置后分发
集群启动 格式化 NN → start-dfs → start-yarn → 启动 HistoryServer 首次启动前必须格式化,且只需格式化一次
验证 jps 查看进程 + Web UI 访问 确认各节点进程与规划表一致

5.3 集群端口速查表

服务 端口 节点
HDFS NameNode RPC 8020 hadoop1
HDFS NameNode Web UI 9870 hadoop1
HDFS DataNode 9866 所有节点
SecondaryNameNode Web UI 9868 hadoop3
YARN ResourceManager Web UI 8088 hadoop2
YARN NodeManager 8042 所有节点
MapReduce HistoryServer 19888 hadoop1

5.4 Hadoop 2.x 与 3.x 主要差异

差异点 Hadoop 2.x Hadoop 3.x
NameNode Web UI 端口 50070 9870
SecondaryNN Web UI 端口 50090 9868
从节点配置文件 slaves workers
支持的 Java 版本 JDK 7/8 JDK 8+
Erasure Coding 不支持 支持(节省存储空间)
多 NameNode 仅 HA 双 NN 支持多 NN 联邦

参考资源

官方文档

资源 链接 说明
Hadoop 官方文档 hadoop.apache.org/docs/r3.3.6 Hadoop 3.3.6 完整文档
HDFS 架构设计 hadoop.apache.org/docs/r3.3.6/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html HDFS 设计文档
YARN 架构设计 hadoop.apache.org/docs/r3.3.6/hadoop-yarn/hadoop-yarn-site/YARN.html YARN 架构说明

推荐书籍

书名 作者 说明
《Hadoop 权威指南》(第4版) Tom White Hadoop 经典入门与进阶
《Hadoop 大数据技术从入门到精通》 黄宜华 等 中文 Hadoop 实战指南

常见问题参考

问题 参考链接
DataNode 启动失败排查 检查 clusterIDcat /opt/module/hadoop/data/current/VERSION
Hadoop 3.x 端口变化说明 Hadoop 3.x 默认端口列表
JDK 环境变量配置 JAVA_HOME 必须指向 JDK 安装根目录,不是 bin 目录
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐