前哨站/第2章 搭建Hadoop分布式集群
第2章 搭建Hadoop分布式集群

第2章 搭建Hadoop分布式集群

从安装 VMware、装 CentOS 7 开始,一步步配出 3 节点高可用集群(ZooKeeper + HDFS HA + YARN)。

虚拟机CentOS高可用集群

本章学习目标

  • 能创建并配置虚拟机,完成 CentOS 7 安装与静态 IP 设置
  • 能配置 JDK、主机名、IP 映射与 SSH 免密登录
  • 能安装并启动 ZooKeeper 集群
  • 能安装配置 Hadoop 高可用集群(2 个 NameNode + 3 个 JournalNode)
  • 能通过 jps、Web 界面、WordCount 验证集群可用

本章导览

核心内容

2.1

创建虚拟机并安装 CentOS 7

教材按"安装虚拟机软件 → 下载镜像 → 创建虚拟机 → 安装系统"四步走,每一步都有截图对照。

关键参数(教材建议值):处理器 1~2 核、内存 4GB、磁盘 40GB、网络类型 NAT、语言选 English。

2.1.1

安装虚拟机软件与创建虚拟机

  • 安装 VMware Workstation,安装路径避免中文和空格
  • 创建虚拟机时选择"稍后安装操作系统",再手动指定 Linux / Red Hat Enterprise Linux 8 64 位
  • 网络类型选 NAT(便于虚拟机共享主机网络并设置静态 IP)
  • 磁盘容量 40GB 以上,空间分配选"拆分成多个文件"

💡 三台虚拟机建议 4GB + 2GB + 2GB 内存,宿主机至少 16GB 才跑得动整套集群。

2.1.4

安装 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。
2.2

配置虚拟机集群环境

这一节是全章最关键的"体力活",也是学生最容易卡住的地方。顺序不能乱:主机名/IP → 防火墙 → JDK → 克隆 → SSH 免密。

2.2.1

修改主机名和设置固定IP

SHELL
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 按自己环境调整)
主机名IP角色
hadoop1192.168.249.161NameNode(Active)、ResourceManager
hadoop2192.168.249.162NameNode(Standby)、JournalNode
hadoop3192.168.249.163DataNode、NodeManager、JournalNode
2.2.3

安装和配置JDK

SHELL
# 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 -version
Hadoop 3.x 要求 JDK 8 或 11。装完务必用 java -version 确认,后面 Hadoop 启动报"Java home not found"都是这一步没配好。
2.2.4

克隆虚拟机和配置主机IP映射

用 VMware 的"克隆 → 创建完整克隆"复制出 hadoop2、hadoop3,然后逐台改主机名和 IP,避免三台机器 IP 冲突。

SHELL
# 每台机器都要配置(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 看一眼。

2.2.5

配置集群各节点SSH免密码登录

SHELL
# 1) 生成密钥对(三次回车)
ssh-keygen -t rsa

# 2) 把公钥发给其它节点(含自己)
ssh-copy-id hadoop1
ssh-copy-id hadoop2
ssh-copy-id hadoop3

# 3) 验证:不再要求输入密码即成功
ssh hadoop2
Hadoop 的启动脚本依赖 SSH 免密,没配好的典型现象是启动集群时要反复输密码、或者只能启动本机进程。
2.3

搭建Hadoop高可用集群

教材采用 <b>HA(高可用)方案</b>:两个 NameNode(一个 Active 一个 Standby)+ 三个 JournalNode 共享 EditLog + ZooKeeper 自动选主。

HA 集群角色分配
角色hadoop1hadoop2hadoop3
NameNode√ (Active)√ (Standby)
JournalNode√√√
DataNode√√√
ResourceManager√
NodeManager√√√
ZooKeeper√√√
2.3.1

安装与配置ZooKeeper

SHELL
# 解压后配置 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
myid 与 zoo.cfg 里 server.N 必须对应,写错会导致集群起不来但日志不报错,是经典的坑。
2.3.2

安装与配置Hadoop

重点改 5 个配置文件:core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml、workers。

SHELL
# 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 同步到另外两台,否则会出现"只有一台是集群"的假象。

2.3.3

启动与测试Hadoop

SHELL
# 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 Webhttp://hadoop1:9870Overview 里 3 个 Live DataNode
YARN Webhttp://hadoop1:8088集群资源与运行中的作业
状态切换hdfs haadmin -failover nn1 nn2active 换到 nn2
格式化 -format 只能执行一次!重复格式化会导致 nn2 元数据与 nn1 不一致,集群起不来——这是最常见的事故。

本章小结

本章按"装虚拟机 → 配环境 → 装 ZooKeeper → 装 Hadoop → 启停验证"的顺序完成了三节点高可用集群搭建。关键点有四个:静态 IP 与 hosts 映射、SSH 免密、HA 相关的 7 个配置项、以及启动顺序(ZooKeeper → JournalNode → NameNode → start-dfs → start-yarn)。

思考与练习 先自己做,再点开答案

01

HA 集群为什么需要 JournalNode?

查看参考答案

HA 要求两个 NameNode 的元数据保持一致。Active 节点把 EditLog 写入 JournalNode 集群,Standby 节点持续读取并重放,从而保持热备状态。JournalNode 必须是奇数个(3 或 5),用于选举与多数派写入。

02

为什么不能重复执行 hdfs namenode -format?

查看参考答案

格式化会重新生成 clusterID 并清空元数据目录。两次格式化会让两台 NameNode 的 clusterID 不一致,DataNode 只认其中一个,表现为集群只有部分节点存活或启动失败。

03

启动集群的正确顺序是什么?

查看参考答案

① 三台启动 ZooKeeper → ② 三台启动 JournalNode → ③ hadoop1 启动 NameNode(首次先 format)→ ④ hadoop2 bootstrapStandby 后启动 NameNode → ⑤ start-dfs.sh → ⑥ start-yarn.sh。

04

jps 看不到 DataNode,怎么排查?

查看参考答案

① 看日志 logs/hadoop-hadoop-datanode-*.log;② 常见原因是 clusterID 不一致(重复 format)、磁盘目录权限不足、或 hosts 解析不到 hadoop1。