1 环境说明

CPU:12th Gen Intel(R) Core(TM) i7-12700F
内存:32GB 3600MT/s
宿主机操作系统:Windows 11
虚拟化软件:VMware® Workstation 17 Pro
处理器:2(处理器数量 1,每个处理器内核数量 2,处理器内核总数 2)
内存:4GB
存储:30GB
操作系统:CentOS-7-x86_64-Everything-1708
网络适配器:NAT
Hadoop:Apache Hadoop 3.5.0
JDK:JDK 17
软件源:CentOS-7-x86_64-Everything-1708.iso 本地源
VMware 虚拟网络编辑器:
网段:192.168.37.0
网关:192.168.37.2
子网掩码:255.255.255.0

VMnet8 网络适配器:
地址:192.168.37.1
子网掩码:255.255.255.0
主机名    IP
master   192.168.37.100
slave1   192.168.37.101
slave2   192.168.37.102

实验全程在 root 用户下进行。

本实验使用 CentOS 7.4 1708 本地源安装系统基础依赖,JDK 17 与 Hadoop 3.5.0 使用离线压缩包手动安装。本地源不负责提供 JDK 17。

需要提前准备的文件:

CentOS-7-x86_64-Everything-1708.iso
jdk-17_linux-x64_bin.tar.gz
hadoop-3.5.0.tar.gz

文件放置建议:

三台虚拟机均需要:
/root/jdk-17_linux-x64_bin.tar.gz
/root/hadoop-3.5.0.tar.gz

2 基础环境配置

2.1 配置本地 yum 源(所有节点)

备份原有 yum 源:

mkdir -p /etc/yum.repos.d/bak
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/

创建本地源配置:

vi /etc/yum.repos.d/CentOS-Base.repo

写入:

[base]
name=CentOS-$releasever - Base
baseurl=file:///mnt
gpgcheck=0
# 后面的全删了或者注释

CentOS-7-x86_64-Everything-1708.iso 挂载到虚拟机光驱。

挂载 ISO:

mount /dev/cdrom /mnt

清理并重建缓存:

yum clean all
yum makecache

安装基础工具:

yum install -y vim net-tools wget tar openssh-server openssh-clients rsync which psmisc

2.2 网络配置(所有节点)

查看网卡名称:

ip addr

本实验按 ens33 编写。如果实际网卡名不同,需要把下面配置中的 ens33 改成实际网卡名。

编辑网卡配置:

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

master 节点写入:

TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.37.100
NETMASK=255.255.255.0
GATEWAY=192.168.37.2
DNS1=8.8.8.8
DNS2=114.114.114.114

Slave1和Slave2此处省略。

重启网络服务:

systemctl restart network

验证 IP:

ip addr

验证标准:

  • 三台机器 IP 正确。

  • 三台机器之间可以互相 ping 通。

  • 宿主机可以访问 192.168.37.100192.168.37.101192.168.37.102


2.3 修改主机名(所有节点)

master 执行:

hostnamectl set-hostname master

slave1 执行:

hostnamectl set-hostname slave1

slave2 执行:

hostnamectl set-hostname slave2

重新登录终端,或执行:

bash

2.4 关闭防火墙与 SELinux(所有节点)

关闭 firewalld:

systemctl stop firewalld
systemctl disable firewalld

临时关闭 SELinux:

setenforce 0

2.5 SSH Root 登录配置(所有节点)

编辑 SSH 服务配置文件:

vim /etc/ssh/sshd_config

确认或修改以下配置:

PermitRootLogin yes
PasswordAuthentication yes

重启 SSH 服务:

systemctl restart sshd
systemctl enable sshd

验证:

ssh root@本机IP

验证标准:

  • 可以使用 root 账户 SSH 登录。

  • 可以输入密码正常进入系统。


2.6 hosts 配置(所有节点)

编辑 hosts 文件:

vim /etc/hosts

保留:

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

追加:

192.168.37.100 master
192.168.37.101 slave1
192.168.37.102 slave2

验证:

ping -c 2 master
ping -c 2 slave1
ping -c 2 slave2

验证标准:

  • master 解析到 192.168.37.100

  • slave1 解析到 192.168.37.101

  • slave2 解析到 192.168.37.102


2.7 时间同步(所有节点)

安装ntp服务

yum install -y ntp ntpdate

关闭chronyd,避免与ntpd冲突:

systemctl stop chronyd
systemctl disable chronyd

配置master为NTP服务器,在master节点编辑配置文件:

vim /etc/ntp.conf

配置文件修改内容如下:

# 漂移文件
driftfile /var/lib/ntp/drift

restrict default nomodify notrap nopeer noquery

# 允许本机回环访问
restrict 127.0.0.1
restrict ::1

# 允许 192.168.37.0 网段内的节点向 master 同步时间
restrict 192.168.37.0 mask 255.255.255.0 nomodify notrap

# 使用本机时钟作为时间源
server 127.127.1.0
fudge 127.127.1.0 stratum 10

启动并设置开机自启:

systemctl start ntpd
systemctl enable ntpd

slave1slave2 节点编辑配置文件:

vim /etc/ntp.conf

建议直接将文件内容修改为如下配置:

# 漂移文件
driftfile /var/lib/ntp/drift

# 默认限制外部访问
restrict default nomodify notrap nopeer noquery

# 允许本机回环访问
restrict 127.0.0.1
restrict ::1

# 指定 master 为唯一时间服务器
server 192.168.37.100 iburst

启动并设置开机自启:

systemctl start ntpd
systemctl enable ntpd

手动校准时间(slave1、slave2)

如果slave1slave2master时间差距较大,可以先停止ntpd,手动同步一次,再重新启动服务。

systemctl stop ntpd
ntpdate master
systemctl start ntpd

验证时间同步

ntpq -p

如果配置正常,可以看到类似如下内容:

remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*master          LOCAL(0)        11 u   10   64    1    0.300    0.120   0.050

其中remote一列出现master,并且前面带有*,说明当前节点已经成功以master 作为时间同步源。

也可以在三台机器上分别执行:

date

验证三台机器时间是否基本一致。


3 SSH 免密登录

Hadoop 启动脚本会从 master 通过 SSH 登录各个节点启动服务,因此至少需要配置 master 到 master、slave1、slave2 的免密登录。

3.1 生成密钥(master)

在 master 节点执行:

ssh-keygen -t rsa

连续按 Enter,使用默认路径和空密码。


3.2 分发公钥(master)

在 master 节点执行:

ssh-copy-id root@master
ssh-copy-id root@slave1
ssh-copy-id root@slave2

首次连接时输入 yes,然后输入对应节点 root 密码。


3.3 权限修复(所有节点)

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

如果某节点没有 ~/.ssh/authorized_keys,说明还没有公钥写入,可以先不处理该节点,或重新执行 ssh-copy-id


3.4 验证

在 master 节点执行:

ssh root@master
exit
ssh root@slave1
exit
ssh root@slave2
exit

验证标准:

  • 不需要输入密码。

  • 可以正常登录后退出。

  • 这是 Hadoop 集群脚本能否正常启动从节点服务的前置条件。


4 JDK 17 安装

Hadoop 3.5.0 服务端要求 JDK 17,因此本实验不再使用原 Hadoop 2.7.7 实验中的 JDK 8。

4.1 上传并解压 JDK 17(所有节点)

jdk-17_linux-x64_bin.tar.gz 上传到三台机器的 /root 目录。

进入 root 目录进行解压:

cd /root
tar -xzvf jdk-17.0.12_linux-x64_bin.tar.gz

4.2 配置 Java 环境变量(所有节点)

编辑环境变量:

vim /etc/profile
------
# JAVA
export JAVA_HOME=/root/jdk-17.0.12
export PATH=$JAVA_HOME/bin:$PATH
------

应用生效:

source /etc/profile

4.3 验证

java -version

5 Hadoop 安装与部署

5.1 上传并解压 Hadoop 3.5.0(所有节点)

hadoop-3.5.0.tar.gz 上传到三台机器的 /root 目录。

进入 root 目录:

cd /root
tar -xzvf hadoop-3.5.0.tar.gz
cd hadoop-3.5.0

目录功能说明:

bin          # Hadoop 用户命令
etc          # Hadoop 配置文件
include      # C 语言相关头文件
lib          # 动态链接库
libexec      # Hadoop 脚本运行所需配置
LICENSE.txt
NOTICE.txt
README.txt
sbin         # Hadoop 管理脚本
share        # Hadoop jar 包、示例程序和依赖

5.2 配置 Hadoop 环境变量(所有节点)

编辑环境变量:

vim /etc/profile
------
# hadoop
export HADOOP_HOME=/root/hadoop-3.5.0
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
------

应用生效:

source /etc/profile

验证:

hadoop version

6 Hadoop 配置

进入 Hadoop 配置目录:

cd /root/hadoop-3.5.0/etc/hadoop

涉及的主要配置文件:

hadoop-env.sh     Hadoop 运行环境变量
core-site.xml     Hadoop 核心配置
hdfs-site.xml     HDFS 配置
yarn-site.xml     YARN 配置
mapred-env.sh     MapReduce 环境变量
mapred-site.xml   MapReduce 配置
workers           DataNode 与 NodeManager 从节点列表

6.1 配置 hadoop-env.sh(所有节点)

编辑文件:

vim hadoop-env.sh
------
# JAVA
export JAVA_HOME=/root/jdk-17.0.12

# Hadoop daemons run as root in this experimental environment
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
------

说明:

Hadoop 3.x 使用 root 启动 HDFS/YARN 服务时,必须显式声明相关用户变量。
否则 start-dfs.sh 或 start-yarn.sh 可能会拒绝启动。

6.2 配置 core-site.xml(所有节点)

编辑文件:

vim core-site.xml
------
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://master:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/root/hadoopdata</value>
    </property>
</configuration>
------

说明:

Hadoop 2.x 笔记中常见的 fs.default.name 已经过时。
Hadoop 3.x 推荐使用 fs.defaultFS。

6.3 配置 hdfs-site.xml(所有节点)

编辑文件:

vim hdfs-site.xml
------
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/root/hadoopdata/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/root/hadoopdata/dfs/data</value>
    </property>
    <property>
        <name>dfs.namenode.http-address</name>
        <value>master:9870</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>master:9868</value>
    </property>
</configuration>
------

说明:

Hadoop 3.x NameNode Web UI 默认端口是 9870,不是 Hadoop 2.x 常见的 50070。

6.4 配置 yarn-site.xml(所有节点)

编辑文件:

vim yarn-site.xml
------
<configuration>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>master</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.env-whitelist</name>
        <value>JAVA_HOME,HADOOP_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME,CLASSPATH_PREPEND_DISTCACHE</value>
    </property>
</configuration>
------

6.5 配置 mapred-env.sh(所有节点)

编辑文件:

vim mapred-env.sh
------
# 修改 JDK 环境变量
export JAVA_HOME=/root/jdk-17.0.12
------

6.6 配置 mapred-site.xml(所有节点)

Hadoop 3.5.0 默认已经存在 mapred-site.xml,编辑文件:

vim mapred-site.xml
------
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.application.classpath</name>
        <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*,$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*,$HADOOP_COMMON_HOME/share/hadoop/common/*,$HADOOP_COMMON_HOME/share/hadoop/common/lib/*,$HADOOP_HDFS_HOME/share/hadoop/hdfs/*,$HADOOP_HDFS_HOME/share/hadoop/hdfs/lib/*,$HADOOP_YARN_HOME/share/hadoop/yarn/*,$HADOOP_YARN_HOME/share/hadoop/yarn/lib/*</value>
    </property>
</configuration>
------

6.7 配置 workers(所有节点)

编辑文件:

vim workers
------
slave1
slave2
------

说明:

workers 文件用于指定 DataNode 和 NodeManager 从节点。
本实验将 master 作为 NameNode、SecondaryNameNode、ResourceManager;
slave1 和 slave2 作为 DataNode、NodeManager。
因此 workers 只写 slave1 和 slave2。

如果把 master 也写进 workers,master 也会启动 DataNode 和 NodeManager,
这会导致进程验证结果与本实验规划不一致。

7 集群启动

7.1 初始化 NameNode(master)

首次启动前,在所有节点清理旧数据目录:

rm -rf /root/hadoopdata

只在 master 节点格式化 NameNode:

hdfs namenode -format

验证标准:

出现 Storage directory ... has been successfully formatted
或
SHUTDOWN_MSG: Shutting down NameNode

注意:

NameNode 只需要格式化一次。
如果集群已经正常运行,不要反复格式化。
反复格式化会导致 NameNode 和 DataNode 的集群 ID 不一致。

7.2 启动 HDFS(master)

在 master 节点执行:

start-dfs.sh

启动后,HDFS 会根据配置在:

master:NameNode、SecondaryNameNode
slave1:DataNode
slave2:DataNode

7.3 启动 YARN(master)

在 master 节点执行:

start-yarn.sh

启动后,YARN 会根据配置在:

master:ResourceManager
slave1:NodeManager
slave2:NodeManager

如果需要启动 MapReduce JobHistory Server,可以在 master 执行:

mapred --daemon start historyserver

7.4 进程验证

在三台机器分别执行:

jps

master 正常应显示:

NameNode
SecondaryNameNode
ResourceManager
Jps

如果启动了 JobHistory Server,还会显示:

JobHistoryServer

slave1和slave2 正常应显示:

DataNode
NodeManager
Jps

验证标准:

  • master 有 NameNodeSecondaryNameNodeResourceManager

  • slave1、slave2 有 DataNodeNodeManager

  • 如果缺少 DataNode,优先检查 workers、SSH 免密、防火墙、hosts、NameNode 是否格式化。


7.5 Web 页面验证

在宿主机浏览器访问:

HDFS NameNode:
http://192.168.37.100:9870

YARN ResourceManager:
http://192.168.37.100:8088

SecondaryNameNode:
http://192.168.37.100:9868

DataNode Web UI:
http://192.168.37.101:9864
http://192.168.37.102:9864

验证标准:

  • http://192.168.37.100:9870 能看到 HDFS 页面。

  • Live Nodes 数量应为 2。

  • http://192.168.37.100:8088 能看到 YARN 页面。

  • YARN Nodes 数量应为 2。


8 功能验证

hadoop jar /root/hadoop-3.5.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.5.0.jar pi 10 10

验证标准:

  • 正常输出 π 估算值

  • 无报错


9 关闭 Hadoop 集群

如果启动了 JobHistory Server,先关闭:

mapred --daemon stop historyserver

关闭 YARN:

stop-yarn.sh

关闭 HDFS:

stop-dfs.sh