第2章 搭建Hadoop分布式集群
从安装 VMware、装 CentOS 7 开始,一步步配出 3 节点高可用集群(ZooKeeper + HDFS HA + YARN)。
本章学习目标
- 能创建并配置虚拟机,完成 CentOS 7 安装与静态 IP 设置
- 能配置 JDK、主机名、IP 映射与 SSH 免密登录
- 能安装并启动 ZooKeeper 集群
- 能安装配置 Hadoop 高可用集群(2 个 NameNode + 3 个 JournalNode)
- 能通过 jps、Web 界面、WordCount 验证集群可用
本章导览
核心内容
创建虚拟机并安装 CentOS 7
教材按"安装虚拟机软件 → 下载镜像 → 创建虚拟机 → 安装系统"四步走,每一步都有截图对照。
关键参数(教材建议值):处理器 1~2 核、内存 4GB、磁盘 40GB、网络类型 NAT、语言选 English。
安装虚拟机软件与创建虚拟机
- 安装 VMware Workstation,安装路径避免中文和空格
- 创建虚拟机时选择"稍后安装操作系统",再手动指定 Linux / Red Hat Enterprise Linux 8 64 位
- 网络类型选 NAT(便于虚拟机共享主机网络并设置静态 IP)
- 磁盘容量 40GB 以上,空间分配选"拆分成多个文件"
💡 三台虚拟机建议 4GB + 2GB + 2GB 内存,宿主机至少 16GB 才跑得动整套集群。
安装 CentOS 7 操作系统
启动虚拟机后按向导安装,重点设置:
- 语言选 English(避免中文路径带来的脚本问题)
- SOFTWARE SELECTION 选 Minimal Install 或 Server with GUI
- INSTALLATION DESTINATION 进入后点"完成"确认分区
- 开启网络(Network & Host Name),设置主机名 hadoop1
- ROOT PASSWORD 设密码,并新建 hadoop 用户
ping www.baidu.com 确认能联网,再去装 JDK 与 Hadoop。配置虚拟机集群环境
这一节是全章最关键的"体力活",也是学生最容易卡住的地方。顺序不能乱:主机名/IP → 防火墙 → JDK → 克隆 → SSH 免密。
修改主机名和设置固定IP
hostnamectl set-hostname hadoop1
# 修改静态 IP(Rocky/CentOS 8+ 用 nmcli,CentOS 7 改 ifcfg 文件)
vi /etc/sysconfig/network-scripts/ifcfg-ens33
# BOOTPROTO=static
# IPADDR=192.168.249.161
# GATEWAY=192.168.249.2
# DNS1=114.114.114.114
systemctl restart network # CentOS 7
ping www.baidu.com # 验证联网| 主机名 | IP | 角色 |
|---|---|---|
| hadoop1 | 192.168.249.161 | NameNode(Active)、ResourceManager |
| hadoop2 | 192.168.249.162 | NameNode(Standby)、JournalNode |
| hadoop3 | 192.168.249.163 | DataNode、NodeManager、JournalNode |
安装和配置JDK
# 1) 上传并解压
tar -zxvf jdk-8u-linux-x64.tar.gz -C /export/servers/
# 2) 配置环境变量
vi ~/.bashrc
export JAVA_HOME=/export/servers/jdk1.8.0_141
export PATH=$JAVA_HOME/bin:$PATH
# 3) 生效并验证
source ~/.bashrc
java -versionjava -version 确认,后面 Hadoop 启动报"Java home not found"都是这一步没配好。克隆虚拟机和配置主机IP映射
用 VMware 的"克隆 → 创建完整克隆"复制出 hadoop2、hadoop3,然后逐台改主机名和 IP,避免三台机器 IP 冲突。
# 每台机器都要配置(root 权限)
vi /etc/hosts
192.168.249.161 hadoop1
192.168.249.162 hadoop2
192.168.249.163 hadoop3
# 验证
ping hadoop2💡 克隆后忘记改 IP 会导致三台机器抢同一个地址,症状是"SSH 时好时坏",排查时先 ip addr 看一眼。
配置集群各节点SSH免密码登录
# 1) 生成密钥对(三次回车)
ssh-keygen -t rsa
# 2) 把公钥发给其它节点(含自己)
ssh-copy-id hadoop1
ssh-copy-id hadoop2
ssh-copy-id hadoop3
# 3) 验证:不再要求输入密码即成功
ssh hadoop2搭建Hadoop高可用集群
教材采用 <b>HA(高可用)方案</b>:两个 NameNode(一个 Active 一个 Standby)+ 三个 JournalNode 共享 EditLog + ZooKeeper 自动选主。
| 角色 | hadoop1 | hadoop2 | hadoop3 |
|---|---|---|---|
| NameNode | √ (Active) | √ (Standby) | |
| JournalNode | √ | √ | √ |
| DataNode | √ | √ | √ |
| ResourceManager | √ | ||
| NodeManager | √ | √ | √ |
| ZooKeeper | √ | √ | √ |
安装与配置ZooKeeper
# 解压后配置 zoo.cfg
vi $ZK_HOME/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/export/servers/zookeeper-3.5.7/data
clientPort=2181
server.1=hadoop1:2888:3888
server.2=hadoop2:2888:3888
server.3=hadoop3:2888:3888
# 每台机器写自己的 myid
echo 1 > /export/servers/zookeeper-3.5.7/data/myid # hadoop1 写 1,had2 写 2,had3 写 3
# 三台分别启动并查状态
zkServer.sh start
zkServer.sh status # 应看到一个 leader、两个 follower安装与配置Hadoop
重点改 5 个配置文件:core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml、workers。
# core-site.xml —— 集群入口用 nameservice 而不是单机主机名
<property><name>fs.defaultFS</name><value>hdfs://ns</value></property>
<property><name>hadoop.tmp.dir</name><value>/export/data/hadoop/tmp</value></property>
# hdfs-site.xml —— HA 关键配置
<property><name>dfs.nameservices</name><value>ns</value></property>
<property><name>dfs.ha.namenodes.ns</name><value>nn1,nn2</value></property>
<property><name>dfs.namenode.rpc-address.ns.nn1</name><value>hadoop1:9000</value></property>
<property><name>dfs.namenode.rpc-address.ns.nn2</name><value>hadoop2:9000</value></property>
<property><name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/ns</value></property>
<property><name>dfs.ha.automatic-failover.enabled</name><value>true</value></property>
<property><name>dfs.client.failover.proxy.provider.ns</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value></property>
# workers —— 数据节点列表
hadoop1
hadoop2
hadoop3💡 7 个配置文件改完要 scp 同步到另外两台,否则会出现"只有一台是集群"的假象。
启动与测试Hadoop
# 1) 三台先起 ZooKeeper
zkServer.sh start
# 2) 三台起 JournalNode(HA 必须)
hdfs --daemon start journalnode
# 3) 格式化 hadoop1 的 NameNode
hdfs namenode -format
# 4) hadoop1 启动 NameNode,hadoop2 同步元数据后再起
hdfs --daemon start namenode # hadoop1
hdfs namenode -bootstrapStandby # hadoop2
hdfs --daemon start namenode # hadoop2
# 5) 一键启动 HDFS + YARN
start-dfs.sh
start-yarn.sh
# 6) 验证
jps # 三台分别看到自己的角色进程
hdfs haadmin -getServiceState nn1 # active
hdfs haadmin -getServiceState nn2 # standby
hdfs dfsadmin -report # 三个 DataNode 均存活| 验证项 | 地址/命令 | 预期 |
|---|---|---|
| HDFS Web | http://hadoop1:9870 | Overview 里 3 个 Live DataNode |
| YARN Web | http://hadoop1:8088 | 集群资源与运行中的作业 |
| 状态切换 | hdfs haadmin -failover nn1 nn2 | active 换到 nn2 |
-format 只能执行一次!重复格式化会导致 nn2 元数据与 nn1 不一致,集群起不来——这是最常见的事故。本章小结
本章按"装虚拟机 → 配环境 → 装 ZooKeeper → 装 Hadoop → 启停验证"的顺序完成了三节点高可用集群搭建。关键点有四个:静态 IP 与 hosts 映射、SSH 免密、HA 相关的 7 个配置项、以及启动顺序(ZooKeeper → JournalNode → NameNode → start-dfs → start-yarn)。
思考与练习 先自己做,再点开答案
HA 集群为什么需要 JournalNode?
查看参考答案
HA 要求两个 NameNode 的元数据保持一致。Active 节点把 EditLog 写入 JournalNode 集群,Standby 节点持续读取并重放,从而保持热备状态。JournalNode 必须是奇数个(3 或 5),用于选举与多数派写入。
为什么不能重复执行 hdfs namenode -format?
查看参考答案
格式化会重新生成 clusterID 并清空元数据目录。两次格式化会让两台 NameNode 的 clusterID 不一致,DataNode 只认其中一个,表现为集群只有部分节点存活或启动失败。
启动集群的正确顺序是什么?
查看参考答案
① 三台启动 ZooKeeper → ② 三台启动 JournalNode → ③ hadoop1 启动 NameNode(首次先 format)→ ④ hadoop2 bootstrapStandby 后启动 NameNode → ⑤ start-dfs.sh → ⑥ start-yarn.sh。
jps 看不到 DataNode,怎么排查?
查看参考答案
① 看日志 logs/hadoop-hadoop-datanode-*.log;② 常见原因是 clusterID 不一致(重复 format)、磁盘目录权限不足、或 hosts 解析不到 hadoop1。