VMware + CentOS 7 手把手搭建 4 节点 Linux 集群基础环境(IP 规划 / 克隆 / SSH 免密 / NTP)
这篇写给谁:要搭 Hadoop、HBase、Kafka、Spark 这类分布式集群,却先卡在「几台虚拟机怎么互通」的同学;以及被各种教程里一段段 ifcfg、ssh-copy-id 晃晕、不知道该在哪台机器上执行的新手。
硬性要求(别问能不能少):4 台虚拟机,每台 2 核 + 2GB 内存 + 20GB 磁盘。合计约 8GB 物理内存(含宿主机开销建议 12GB+),磁盘 80GB+(VMware 磁盘是动态扩容,实际用多少占多少)。
本篇范围:只做「操作系统层」——固定 IP、克隆节点、关防火墙、SSH 免密、时间同步、装 JDK。装完这 4 台机器就是一个干净的、互通的 Linux 集群底座,上面的 Hadoop/Hive/HBase 部署见下一篇(本文最后一节给出衔接)。
环境:VMware Workstation + CentOS 7(最小化安装)+ JDK 1.8.0_151。
一、节点规划
先把 4 台机器的 IP 分配定死,后面所有配置文件都按这张表来,中途改 IP 是最常见的时间黑洞。
| 节点 | IP | 主机名 | 规划用途(后续部署时承担的角色) |
|---|---|---|---|
| 主节点 | 192.168.5.100 | master | NameNode、SecondaryNameNode、ResourceManager、JobHistoryServer、MariaDB、Hive、HMaster |
| 从节点 1 | 192.168.5.101 | slave1 | DataNode、NodeManager、Zookeeper、RegionServer |
| 从节点 2 | 192.168.5.102 | slave2 | 同上 |
| 从节点 3 | 192.168.5.103 | slave3 | 同上 |
右列现在用不上,但决定了每台机器的内存分配——master 要跑 6 个以上 Java 进程,slave 只跑 4 个左右,所以 master 建议给 2.5~3GB,slave 给 2GB。
网关192.168.5.2是 VMware NAT 网络(VMnet8)的默认网关,用 NAT 模式就不用改宿主机的虚拟网络设置;如果用的是仅主机模式,网关按你自己的网段填。
二、基础环境搭建
2.1 设置固定 IP
CentOS 7 的默认网卡名是ens33(配置文件/etc/sysconfig/network-scripts/ifcfg-ens33;老版本是ifcfg-eth0,先ip addr确认网卡名再改)。
编辑该文件,改成静态 IP:
# 修改这几项:ONBOOT=yesNM_CONTROLLED=yesBOOTPROTO=static# 新增(IP 按节点递增 100~103)IPADDR=192.168.5.100NETMASK=255.255.255.0GATEWAY=192.168.5.2DNS1=192.168.5.2重启网络并确认:
servicenetwork restartipaddr# 或 ifconfig,最小化安装没有 ifconfig 时先 yum install -y net-tools2.2 克隆节点的配置修改
把配好的 master 关机 → VMware 里「克隆」出 slave1~3(选「完整克隆」,不要链接克隆,链接克隆后面磁盘扩容很麻烦)。
克隆必须处理两件事:网卡 MAC 和主机名。VMware 会给克隆机生成新的 MAC,但ifcfg-ens33里还写着源机器的HWADDR,不改的话网卡直接起不来:
- 开机后执行
ip addr,记下当前网卡名和link/ether后面的真实 MAC - 改
ifcfg-ens33:把DEVICE、HWADDR改成第 1 步查到的值,同时把IPADDR改成目标 IP - 改主机名:
hostnamectl set-hostname slave1(老版本改/etc/sysconfig/network) service network restart- 检查 IP、主机名是否生效
reboot
踩坑预警:漏改 MAC 的表现是「没网但也不报错」——
ping网关不通、SSH 连不上,systemctl status network里只写device ens33 does not exist之类含糊的话。别去怀疑 IP 冲突,先回头对 MAC。
2.3 关闭防火墙 + 关闭 SELinux(4 台都要做)
这一步别省。CentOS 7 默认 firewalld + SELinux 双锁,后面 Hadoop 的 8020/50010、HBase 的 16000/16020、ZK 的 2888/3888 全会被拦,报错全是「连接超时」,排查起来毫无线索。
# 关闭 firewalld 并禁止开机启动systemctl stop firewalld&&systemctl disable firewalld# 永久关闭 SELinuxsed-i's/SELINUX=enforcing/SELINUX=disabled/'/etc/selinux/configreboot# SELinux 改完必须重启才生效;重启后等虚拟机完全起来再 SSH 进去继续重启后验证:getenforce输出Disabled即成功。
只想临时生效可以用
setenforce 0,但重启后会恢复成 Enforcing,集群跑几天突然不通就是这么来的。
2.4 配置 SSH 免密登录
集群的一键启停脚本(start-dfs.sh、start-hbase.sh)本质是靠 SSH 到各节点执行命令,所以免密是硬要求。
IP 映射
4 台机器都要在/etc/hosts里加:
192.168.5.100 master 192.168.5.101 slave1 192.168.5.102 slave2 192.168.5.103 slave3只改 master 是不够的——Hadoop 的 DataNode 也要反向解析 master,缺一边会报
UnknownHostException: master。
生成密钥并分发
在 master 上生成 RSA 密钥对(连按三次 Enter,路径和密码都默认):
ssh-keygen-trsa生成/root/.ssh/id_rsa(私钥)和/root/.ssh/id_rsa.pub(公钥)。把公钥登记到 4 台机器上(包括 master 自己):
ssh-copy-id-i/root/.ssh/id_rsa.pub master ssh-copy-id-i/root/.ssh/id_rsa.pub slave1 ssh-copy-id-i/root/.ssh/id_rsa.pub slave2 ssh-copy-id-i/root/.ssh/id_rsa.pub slave3验证:依次ssh slave1、ssh slave2、ssh slave3、ssh master,都不提示密码才算通过。
第一条
ssh-copy-id master千万别漏。很多人只做了 slave1~3,结果start-dfs.sh卡在master's password:不动——脚本内部要 SSH 到本机启动 NameNode,它在等一个永远不会输入的密码。我第一次搭集群就在这上面耗了半小时,一直以为是 Java 环境问题。
2.5 配置 NTP 时间同步
分布式组件的 RPC、日志、数据块校验都依赖时钟一致;HBase 的 RegionServer 时钟偏差超阈值会直接退出(下一篇的坑 5 会细说)。
- 4 台都装(
ntpdate是独立包,只装ntp会导致后面ntpdate master报 command not found):
yum-yinstallntp ntpdate- master 作为时间源,编辑
/etc/ntp.conf,注释掉所有server开头的行,加:
restrict 192.168.5.0 mask 255.255.255.0 nomodify notrap server 127.127.1.0 fudge 127.127.1.0 stratum 10- slave1~3 的
/etc/ntp.conf注释掉原有server行,只加一行:
server master- 启动服务:
# masterservicentpd start&&chkconfigntpd on# slave1~3:先手动校一次,再常驻ntpdate masterservicentpd start&&chkconfigntpd on验证:4 台同时执行date,秒级差异应该在 1 秒内。
2.6 安装 JDK(4 台都要装)
# 安装包上传到 /opt 后安装rpm-ivhjdk-8u151-linux-x64.rpm编辑/etc/profile,末尾追加:
exportJAVA_HOME=/usr/java/jdk1.8.0_151exportPATH=$PATH:$JAVA_HOME/binsource /etc/profile生效,java -version验证。
路径是
/usr/java/jdk1.8.0_151,不是/usr/lib/jvm/...——RPM 包安装的 Oracle JDK 默认装到/usr/java。后面 Hadoop 的hadoop-env.sh里要写这个绝对路径,写错了集群起不来。
三、环境验收(6 项全过才算合格)
搭完先别急着装大数据组件,按这张表逐项确认,能省掉 80% 的后续故障:
| 检查项 | 命令(在 master 上执行) | 预期结果 |
|---|---|---|
| IP 是否固定 | ip addr | 4 台各自是 192.168.5.100~103 |
| 主机名 | hostname | master / slave1 / slave2 / slave3 |
| hosts 解析 | ping -c 2 slave1 | 解析到 192.168.5.101,能通 |
| SELinux | getenforce | Disabled |
| SSH 免密 | ssh slave1 date、ssh master date | 直接返回时间,不提示密码 |
| 时钟同步 | 4 台同时date | 秒级差异在 1 秒内 |
| Java | java -version | 1.8.0_151 |
全部通过,这 4 台机器就可以直接拿去部署集群了。
四、踩坑复盘(3 个)
坑 1:克隆后 MAC 没改 → 网卡起不来
- 现象:克隆机
ping 网关不通,ip addr显示的 MAC 和ifcfg-ens33里的HWADDR对不上,日志提示找不到ens33。 - 原因:VMware 克隆会重新生成 MAC,但配置文件里还是源机器的 MAC。
- 解决:
ip addr取真实 MAC → 改DEVICE和HWADDR→service network restart。
坑 2:master 没对自己做免密 →start-dfs.sh卡在输密码
- 现象:脚本停在
master's password:,输入密码也不继续。 - 原因:启停脚本通过 SSH 连本机启动 NameNode,而本机没登记公钥。
- 解决:补一条
ssh-copy-id -i /root/.ssh/id_rsa.pub master。
坑 3:只关了 firewalld 没关 SELinux → 组件间连接全超时
- 现象:端口
telnet能通、SSH 也通,但 Java 进程之间就是连不上,日志刷Connection refused/ timeout。 - 原因:SELinux 的强制访问控制拦截了进程间的 socket 通信(firewalld 只拦网络层)。
- 解决:
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config→reboot→getenforce确认Disabled。
五、下一步:在这些机器上部署大数据组件
本文做完后,4 台机器已经具备:固定 IP、互通的主机名解析、免密的 SSH、一致的时间、可用的 JDK。
下一篇在这套底座上依次部署Hadoop 2.6.5(HDFS + YARN)→ Hive 1.2.1(MariaDB 元数据库)→ Zookeeper 3.4.6 + HBase 1.3.6,并附 7 个踩坑复盘(NameNode 重复格式化、jline 版本冲突、YARN 内存杀容器、ZK myid 写错等)。
依赖关系先看一眼,避免装错顺序:
Hadoop HDFS + YARN(存储与计算底座) ├── Hive(SQL → MapReduce)→ 元数据存 MariaDB └── HBase(KV 数据库)→ 数据存 HDFS,协调靠 Zookeeper顺序必须是 Hadoop → Hive → Zookeeper + HBase,逆序必报错。