- 环境准备:准备虚拟机网络、主机名、防火墙等基础环境。
- 安装 JDK:Hadoop 的运行依赖 Java 环境。
- 安装 Hadoop:解压、配置环境变量。
- 配置 Hadoop 核心文件:这是搭建最关键的一步,涉及
core-site.xml,hdfs-site.xml,yarn-site.xml和workers。 - 格式化 HDFS 集群:首次启动前必须执行的操作。
- 启动与验证:启动集群、检查进程、验证 HDFS 和 YARN 功能。
- 常见问题与排错:提供一些常见问题的解决方案。
第一步:环境准备
在开始之前,你需要准备以下环境:

- 操作系统:推荐使用 CentOS 7 或 Ubuntu 18.04/20.04,本教程以 CentOS 7 为例。
- Hadoop 版本:推荐使用稳定版,如 Hadoop 3.3.6。
- 网络配置:确保所有节点(虚拟机)之间可以
ping通,推荐配置静态 IP 或使用主机名互相解析。 - 主机规划:这里我们搭建一个 3 节点的集群,角色分配如下:
| 主机名 | IP 地址 | 角色 |
|---|---|---|
hadoop101 |
168.1.101 | NameNode, ResourceManager, DataNode, NodeManager |
hadoop102 |
168.1.102 | SecondaryNameNode, DataNode, NodeManager |
hadoop103 |
168.1.103 | DataNode, NodeManager |
关闭防火墙和 SELinux
为了简化部署,我们先关闭防火墙和 SELinux。
# 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 关闭 SELinux setenforce 0 # 永久关闭,需要重启生效 sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
配置主机名和 hosts 文件
在 所有节点 上执行。
# 设置主机名 (根据节点不同进行设置) hostnamectl set-hostname hadoop101 # 重启后生效,或者直接执行 bash bash # 编辑 hosts 文件 vim /etc/hosts
在 hosts 文件中添加以下内容:
168.1.101 hadoop101 192.168.1.102 hadoop102 192.168.1.103 hadoop103
配免密登录
在 hadoop101 节点(主节点)上配置,然后分发给其他节点。
# 1. 生成密钥对 (一路回车即可) ssh-keygen -t rsa # 2. 将公钥拷贝到本机和其他所有节点 ssh-copy-id hadoop101 ssh-copy-id hadoop102 ssh-copy-id hadoop103
测试免密登录:
ssh hadoop102 # 如果不需要输入密码就登录成功,则配置正确 exit
安装 JDK
在 所有节点 上安装 JDK,推荐使用 OpenJDK 1.8。
# 下载 JDK (或使用 yum 安装) wget https://download.oracle.com/java/17/archive/jdk-17.0.2_linux-x64_bin.tar.gz # 创建安装目录 mkdir -p /usr/local/java # 解压 tar -zxvf jdk-17.0.2_linux-x64_bin.tar.gz -C /usr/local/java/ # 配置环境变量 vim /etc/profile
在文件末尾添加:
export JAVA_HOME=/usr/local/java/jdk-17.0.2 export PATH=$PATH:$JAVA_HOME/bin
让环境变量生效:
source /etc/profile
验证安装:
java -version javac -version
应显示相应的版本信息。
第二步:安装 Hadoop
在 hadoop101 节点(主节点)上操作,然后同步到其他节点。
下载并解压
# 创建 Hadoop 安装目录 mkdir -p /opt/module # 下载 Hadoop (以 3.3.6 为例) wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz # 解压 tar -zxvf hadoop-3.3.6.tar.gz -C /opt/module/
配置环境变量
在 所有节点 的 /etc/profile 文件中添加 Hadoop 环境变量。
vim /etc/profile
在文件末尾添加:
export HADOOP_HOME=/opt/module/hadoop-3.3.6 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
让环境变量生效:
source /etc/profile
验证安装:
hadoop version
应显示 Hadoop 的版本信息。
同步到其他节点
在 hadoop101 节点上执行,将 Hadoop 安装目录同步到 hadoop102 和 hadoop103。
# 同步 Hadoop 安装目录 scp -r /opt/module/hadoop-3.3.6/ root@hadoop102:/opt/module/ scp -r /opt/module/hadoop-3.3.6/ root@hadoop103:/opt/module/ # 同步环境变量文件 scp /etc/profile root@hadoop102:/etc/ scp /etc/profile root@hadoop103:/etc/ # 在 hadoop102 和 hadoop103 上分别执行 source /etc/profile
第三步:配置 Hadoop 核心文件
所有配置文件都位于 $HADOOP_HOME/etc/hadoop/ 目录下,我们将在 hadoop101 节点上配置,然后同步到其他节点。
core-site.xml (HDFS 核心配置)
vim $HADOOP_HOME/etc/hadoop/core-site.xml
添加以下配置:
<configuration>
<!-- 指定 HDFS 中 NameNode 的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop101:8020</value>
</property>
<!-- 指定 Hadoop 运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.3.6/data</value>
</property>
</configuration>
hdfs-site.xml (HDFS 站点配置)
vim $HADOOP_HOME/etc/hadoop/hdfs-site.xml
添加以下配置:
<configuration>
<!-- 指定 HDFS 副本数量 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 指定 NameNode 的数据存储目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/module/hadoop-3.3.6/data/dfs/name</value>
</property>
<!-- 指定 DataNode 的数据存储目录 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/module/hadoop-3.3.6/data/dfs/data</value>
</property>
<!-- 指定 SecondaryNameNode 的地址 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop102:9868</value>
</property>
</configuration>
yarn-site.xml (YARN 站点配置)
vim $HADOOP_HOME/etc/hadoop/yarn-site.xml
添加以下配置:
<configuration>
<!-- 指定 YARN 的 ResourceManager 的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop101</value>
</property>
<!-- reducer 获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 日志聚集功能开启 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
</configuration>
mapred-site.xml (MapReduce 配置)
# 首先需要重命名模板文件 cp $HADOOP_HOME/etc/hadoop/mapred-site.xml.template $HADOOP_HOME/etc/hadoop/mapred-site.xml vim $HADOOP_HOME/etc/hadoop/mapred-site.xml
添加以下配置:
<configuration>
<!-- 指定 MapReduce 运行在 YARN 上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
workers (指定从节点/数据节点)
这个文件定义了哪些节点是 DataNode 和 NodeManager。注意:新版本的 Hadoop 使用 workers 而不是 slaves。
vim $HADOOP_HOME/etc/hadoop/workers
如下,每一行一个主机名:
hadoop101
hadoop102
hadoop103
同步配置文件
在 hadoop101 节点上,将整个 etc/hadoop 目录同步到其他节点。
scp -r $HADOOP_HOME/etc/hadoop/ root@hadoop102:$HADOOP_HOME/etc/ scp -r $HADOOP_HOME/etc/hadoop/ root@hadoop103:$HADOOP_HOME/etc/
第四步:格式化 HDFS 集群
此操作仅在首次搭建集群时执行,且会清空 HDFS 上的所有数据!
在 hadoop101 节点上执行。
hdfs namenode -format
如果看到 Exit status 0,并且输出中有 Storage directory /opt/module/hadoop-3.3.6/data/dfs/name has been successfully formatted. 的字样,说明格式化成功。
第五步:启动与验证
启动 HDFS 集群
在 hadoop101 节点上执行。
# 启动 HDFS start-dfs.sh
启动 YARN 集群
在 hadoop101 节点上执行。
# 启动 YARN start-yarn.sh
检查进程
在 所有节点 上使用 jps 命令检查进程是否启动成功。
-
hadoop101(NameNode, ResourceManager):[root@hadoop101 hadoop-3.3.6]# jps 1234 NameNode 1454 ResourceManager 1672 DataNode 1788 NodeManager 1922 Jps
-
hadoop102(SecondaryNameNode):[root@hadoop102 hadoop-3.3.6]# jps 1234 SecondaryNameNode 1454 DataNode 1672 NodeManager 1788 Jps
-
hadoop103(DataNode):[root@hadoop103 hadoop-3.3.6]# jps 1234 DataNode 1454 NodeManager 1672 Jps
如果进程与预期一致,说明集群启动成功。
Web UI 验证
打开浏览器,访问以下地址:
- HDFS NameNode Web UI:
http://hadoop101:9870你可以看到 Datanodes 信息,应该显示 3 个 live nodes。
- YARN ResourceManager Web UI:
http://hadoop101:8088你可以看到 Cluster、Nodes 等信息,能看到 3 个活跃的节点。
运行一个测试程序
这是验证集群功能是否可用的最佳方式。
# 1. 在 HDFS 上创建一个输入目录 hdfs dfs -mkdir -p /input # 2. 将 Hadoop 自带的 jar 包作为输入文件上传到 HDFS hdfs dfs -put $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar /input # 3. 运行 WordCount 程序 hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /input /output # 4. 查看运行结果 hdfs dfs -cat /output/*
如果能看到单词和对应的词频统计结果,恭喜你!你的 Hadoop 集群已经成功搭建并可以正常工作了。
第六步:集群的常用操作
-
关闭集群:
# 先关闭 YARN stop-yarn.sh # 再关闭 HDFS stop-dfs.sh
-
重新格式化集群:
- 如果需要重新格式化,必须先停止所有服务。
- 然后删除
data和logs目录下的所有内容。 - 最后重新执行
hdfs namenode -format。
常见问题与排错
-
jps进程不全:- 原因:可能是启动脚本执行失败,或者节点间网络/免密登录有问题。
- 解决:检查
hadoop101节点的hadoop-3.3.6/logs目录下的日志文件(如hadoop-root-namenode-hadoop101.log),根据错误信息排查。
-
DataNode 启动失败,无法连接 NameNode:
- 原因:通常是
clusterID不匹配,格式化 NameNode 后,data/dfs/name目录下会生成一个current/VERSION文件,里面有一个clusterID,DataNode 启动时也需要这个 ID,如果本地没有,会去 NameNode 获取,如果获取失败就无法启动。 - 解决:确保所有节点的
data目录是干净的,只在主节点上执行一次格式化,如果问题依旧,可以尝试删除所有节点的data和logs目录,然后重新格式化并启动。
- 原因:通常是
-
Web UI 无法访问:
- 原因:防火墙未关闭、端口未开放、或者主机名/IP 配置错误。
- 解决:再次确认防火墙和 SELinux 已关闭,检查
core-site.xml中的fs.defaultFS和yarn-site.xml中的yarn.resourcemanager.hostname是否正确。
-
MapReduce 任务失败:
- 原因:可能是 YARN 资源不足、输入输出路径错误、或者程序本身有 Bug。
- 解决:在 YARN 的 Web UI (8088) 上查看任务失败的日志,点击失败的 Application,找到 "Logs" 链接,可以查看详细的错误堆栈信息。
这份教程涵盖了从零开始搭建一个功能完整的 Hadoop 集群的所有关键步骤,祝你搭建顺利!
