Hadoop 3.5.0 集群部署实验教程(CentOS版)
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
网络适配器:NATHadoop: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.gz2 基础环境配置
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 psmisc2.2 网络配置(所有节点)
查看网卡名称:
ip addr本实验按 ens33 编写。如果实际网卡名不同,需要把下面配置中的 ens33 改成实际网卡名。
编辑网卡配置:
vim /etc/sysconfig/network-scripts/ifcfg-ens33master 节点写入:
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.114Slave1和Slave2此处省略。
重启网络服务:
systemctl restart network验证 IP:
ip addr验证标准:
三台机器 IP 正确。
三台机器之间可以互相 ping 通。
宿主机可以访问
192.168.37.100、192.168.37.101、192.168.37.102。
2.3 修改主机名(所有节点)
master 执行:
hostnamectl set-hostname masterslave1 执行:
hostnamectl set-hostname slave1slave2 执行:
hostnamectl set-hostname slave2重新登录终端,或执行:
bash2.4 关闭防火墙与 SELinux(所有节点)
关闭 firewalld:
systemctl stop firewalld
systemctl disable firewalld临时关闭 SELinux:
setenforce 02.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.100slave1解析到192.168.37.101slave2解析到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在slave1、slave2 节点编辑配置文件:
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)
如果slave1、slave2与master时间差距较大,可以先停止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.gz4.2 配置 Java 环境变量(所有节点)
编辑环境变量:
vim /etc/profile
------
# JAVA
export JAVA_HOME=/root/jdk-17.0.12
export PATH=$JAVA_HOME/bin:$PATH
------应用生效:
source /etc/profile4.3 验证
java -version5 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 version6 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:DataNode7.3 启动 YARN(master)
在 master 节点执行:
start-yarn.sh启动后,YARN 会根据配置在:
master:ResourceManager
slave1:NodeManager
slave2:NodeManager如果需要启动 MapReduce JobHistory Server,可以在 master 执行:
mapred --daemon start historyserver7.4 进程验证
在三台机器分别执行:
jpsmaster 正常应显示:
NameNode
SecondaryNameNode
ResourceManager
Jps如果启动了 JobHistory Server,还会显示:
JobHistoryServerslave1和slave2 正常应显示:
DataNode
NodeManager
Jps验证标准:
master 有
NameNode、SecondaryNameNode、ResourceManager。slave1、slave2 有
DataNode、NodeManager。如果缺少 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