前言

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

分别设置为 hadoop1、hadoop2、hadoop3。

配置 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 集群规划

组件hadoop1hadoop2hadoop3
IP192.168.1.101192.168.1.102192.168.1.103
HDFSNameNode, DataNodeDataNodeSecondaryNameNode, DataNode
YARNNodeManagerResourceManager, NodeManagerNodeManager
其他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.defaultFSHDFS 的 NameNode 地址,客户端通过此地址访问 HDFS
hadoop.tmp.dirHadoop 运行时数据的本地存储目录,格式化 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-addressNameNode Web UI 端口(Hadoop 3.x 为 9870,2.x 为 50070)
dfs.namenode.secondary.http-addressSecondaryNameNode Web UI 端口
dfs.replicationHDFS 数据块副本数,测试环境设为 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.hostnameResourceManager 所在节点,本例为 hadoop2
yarn.nodemanager.resource.memory-mbNodeManager 可管理的总内存,需根据实际机器配置调整
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

预期输出:

节点进程
hadoop1NameNode, DataNode, Jps
hadoop2DataNode, ResourceManager, NodeManager, Jps
hadoop3DataNode, SecondaryNameNode, NodeManager, Jps
3.5.4 Web UI 访问
服务地址说明
HDFS NameNodehttp://hadoop1:9870HDFS 管理界面
YARN ResourceManagerhttp://hadoop2:8088YARN 资源管理界面
MapReduce HistoryServerhttp://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 不一致停止集群,删除所有节点的 data 和 name 目录,重新格式化 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 RPC8020hadoop1
HDFS NameNode Web UI9870hadoop1
HDFS DataNode9866所有节点
SecondaryNameNode Web UI9868hadoop3
YARN ResourceManager Web UI8088hadoop2
YARN NodeManager8042所有节点
MapReduce HistoryServer19888hadoop1

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

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

参考资源

官方文档

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

推荐书籍

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

常见问题参考

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

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

更多推荐