ESXI 配置 Spark集群
一、安装虚拟机,配置网络
在主页面左侧选择虚拟机选项卡,点击虚拟机,此时会自动跳转到虚拟机详情页,在详情页左上角单击点击创建/注册虚拟机。

具体步骤|易错事项
1.选择创建类型,这里默认第一个即可。因为服务器上只有ISO镜像文件

2.设置名称,按要求设置即可,操作系统系列和版本等根据自身安装需求对应选择。
例: 服务器上有CentOS7和ubuntu的镜像,可根据个人喜欢选择。就算和后面加载的镜像文件不对应其实也不影响,不会出错

3.选择储存, 这里注意选择第二项。选择第一项会导致错误而无法新建虚拟机

4.CPU,内存和硬盘根据实际要求选择,这里需要注意的关键点有两个:网络适配器和CD/DVD驱动器。接下来就这两部分进行详细介绍
网络适配器
为保证虚拟机之间能够正常通信,需要将创建的虚拟机设置在同一个VLAN口。
详情设置可看到网络部分的vswitcher(虚拟交换机), 虚拟交换机和VMkernel已提取配置好,可以看到其中Management Network中的VMkernel端口就是服务器的访问地址。这些VLAN口最后连接到物理适配器实现网络互通。
同理,因为所有服务器都在同一个网段 10.10.10.x, 且服务器之间可以互相通信,所以不同服务器上的虚拟机也是可以互相通信的。

CD/DVD驱动器
我们需要新建多个CD/DVD驱动器,用于安装系统和后续的安装。由于服务器没有网络,我们需要添加新的CD/DVD驱动器,通过IOS镜像挂载的方式把提前下载好的文件挂载到虚拟机,再进行后续的安装操作。
选择准备好的ISO文件

选择合适系统镜像

关于系统镜像,需要注意的是,这里要选择大的,包括完整系统的镜像,容量小的镜像需要后续进行在线下载。
关于文件镜像,可用镜像制作软件(如UltraISO) 进行镜像制作,之后进行挂载。

5.配置确认无误,点击完成

6.打开电源

7.安装需要注意的两件事:配置网络和用户密码。
配置网络
可以在这里提前配置好手动地址,或者等安装完成后再通过配置文件修改(这部分后面会写到)
图 配置手动地址
用户密码
根据个人喜欢配置即可,新用户可不用配置,直接使用root用户更方便。

8.设置静态ip
进入虚拟机后,通过如下命令修改ifcfg文件
vi /etc/sysconfig/network-scripts/ifcfg-eth193
注意:这里eth193是我使用的服务器的网卡,需要自行确认后再进行编辑
需要修改的部分有: IPADDR(因为服务器的网段为10.10.10.x,可根据喜欢自行设置), NETMASK, ONBOOT(需要设置为yes), BOOTPROTO(需要设置为static)。 不需要写网关(GATEWAY), 因为都在同一网段,可直接ping通。
vi 使用: 进入编辑器后按
a进入编辑,编辑完成后按ESC返回主页面,之后按:, 再按下wq,回车。进行保存和退出

修改完成并退出后,通过ip addr 命令查看自己刚刚修改的静态端口,如果能看到,并ping另一台虚拟机/另一台服务器上的虚拟机正常,就可以进行下一步的操作了。

二、安装所需文件
文件清单
文件可命名为spark-offline-package
spark-offline-package
├── spark/ (Spark安装文件)
├── jdk/ (Java JDK)
├── python/ (Python及依赖库)
├── data/ (股票数据集)
└── scripts/ (部署脚本)
1.镜像挂载
使用lsblk命令查看是否挂载成功,如图sr0为挂载的镜像文件, sr1为挂载的文件包。
图 查看挂载
使用下面命令把镜像文件挂载到本地
mkdir -p /mnt/cdrom # 新建挂载目录
mount /dev/sr1 /mnt/cdrom # 挂载到指定目录
挂载完成后,会提示read-only,这是对镜像的写入保护,不影响后续操作。完成后便可进行各种软件的安装。

2.安装JDK
这里我选用的是openjdk-11+28_linux-x64_bin.tar.gz。使用以下命令解压JDK包
mkdir -p /opt/jdk #新建jdk安装目录
tar -xzf /mnt/cdrom/jdk/openjdk-11+28_linux-x64_bin.tar.gz -C /opt/jdk
编写java.sh脚本设置JAVA路径,并验证是否安装成功
sudo tee /etc/profile.d/java.sh >/dev/null <<'EOF'
export JAVA_HOME=/opt/jdk/current
export PATH="$JAVA_HOME/bin:$PATH"
EOF
# 立刻加载,并验证
source /etc/profile
printf 'PATH=%q\n' "$PATH"
command -v java
java -version
安装完成如图

如果有问题,可验证绝对路径下java是否存在。如果绝对路径下存在,说明JAVA安装好了,但是路径设置有问题。
ls -l /opt/jdk/current/bin/java || echo " /opt/jdk/current/bin/java -version || echo "
安装Spark
解压安装Spark
mkdir -p /opt
tar -xzf /mnt/cdrom/spark/spark-3.5.6-bin-hadoop3.tgz -C /opt
ln -sfn /opt/spark-3.5.6-bin-hadoop3 /opt/spark
编写spark.sh脚本设置Spark路径,并验证是否安装成功
sudo tee /etc/profile.d/spark.sh >/dev/null <<'EOF'
export SPARK_HOME=/opt/spark
export PATH="$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH"
EOF
确认Spark路径配置正确
"$SPARK_HOME/bin/spark-shell" --version
安装完成如图

安装Python
1.构建离线依赖
用 CentOS 安装介质当本地仓库
# 1) 挂载安装介质(注意:这会占用一次光驱,先把 python ISO 卸载)
sudo umount /mnt/cdrom 2>/dev/null || true
sudo mount /dev/sr0 /mnt/cdrom
# 2) 建立本地 repo 指向光盘
sudo tee /etc/yum.repos.d/CentOS-Media.repo >/dev/null <<'EOF'
[c7-media]
name=CentOS-$releasever - Media
baseurl=file:///mnt/cdrom
gpgcheck=0
enabled=1
EOF
sudo yum clean all
# 3) 安装编译环境(Development Tools)和常用头文件
sudo yum --disablerepo="*" --enablerepo="c7-media" -y groupinstall "Development Tools"
sudo yum --disablerepo="*" --enablerepo="c7-media" -y install \
zlib-devel bzip2-devel xz-devel libffi-devel sqlite-devel \
readline-devel ncurses-devel tk-devel uuid-devel openssl-devel
# 4) 验证 gcc 已就绪
gcc --version
make --version
安装Python
正确的依赖文件已经放在ISO中,直接安装就行
# 1) 解压源码(路径按你的 ISO 实际为准)
cd /usr/src
sudo tar -xzf /mnt/cdrom/python-3.11.4.tgz
cd Python-3.11.4
# 2) 配置与编译安装到 /opt/py311
# 说明:--enable-shared + rpath 便于后续使用;无 OpenSSL 1.1.1 时 ssl 模块会被跳过
sudo ./configure --prefix=/opt/py311 \
--enable-optimizations --with-lto --enable-shared \
LDFLAGS="-Wl,-rpath=/opt/py311/lib"
sudo make -j"$(nproc)"
sudo make install
# 3) 验证
/opt/py311/bin/python3.11 -V
/opt/py311/bin/pip3.11 --version
/opt/py311/bin/python3.11 -c "import sys; print('ssl ok?', end=' '); import ssl; print(True)"
# 若这里报错,说明没有 ssl 模块(预期现象)
安装完成如图

安装所需的库
numpy, pandas, matplotlib及其依赖
# 用 Python 3.11 的 pip,只从本地目录找
python3.11 -m pip install --no-index --find-links=/mnt/cdrom \
six==1.16.0 packaging==24.1 pyparsing==3.1.4 python-dateutil==2.9.0.post0 \
cycler==0.12.1 fonttools==4.53.1 tzdata==2024.1 pytz==2024.1 \
kiwisolver==1.4.7 pillow==10.4.0 contourpy==1.2.1 \
numpy==2.1.1 pandas==2.1.0 matplotlib==3.8.4
安装完成如图

安装PySpark
正确的依赖文件已经放在ISO中,直接安装就行
# 用 Python 3.11 的 pip
python3.11 -m pip install --no-index --find-links=/mnt/cdrom \
setuptools-*.whl wheel-*.whl
# 安装 py4j(优先 whl;若只有 tar.gz 也可以)
python3.11 -m pip install --no-index --find-links=/mnt/cdrom \
--no-build-isolation /mnt/cdrom/py4j-0.10.9.7.tar.gz
# 安装PySpark
python3.11 -m pip install --no-index --find-links=/mnt/cdrom \
--no-build-isolation /mnt/cdrom/pyspark-3.5.6.tar.gz
验证是否安装正确
unset SPARK_HOME # 避免不小心用到 /opt/spark
export PYSPARK_PYTHON=/opt/py311/bin/python3.11
python3.11 - <<'PY'
import pyspark
from pyspark.sql import SparkSession
print("pyspark:", pyspark.__version__)
spark = SparkSession.builder.master("local[*]").appName("check").getOrCreate()
print("spark core version (local):", spark.version)
spark.range(5).show()
spark.stop()
PY
三、克隆Master虚拟机作为Worker节点,部署Spark集群
温馨提示,关于虚拟机内大小写切换:连续按两下
shift+Caps Locks切换大小写
克隆前,最后一次确认并写好Spark配置文件
# 1) 确认关键环境都OK
java -version
/opt/spark/bin/spark-shell --version || true
python3.11 - <<'PY'
import pyspark, numpy, pandas, matplotlib
print("pyspark", pyspark.__version__)
print("numpy", numpy.__version__, "pandas", pandas.__version__, "matplotlib", matplotlib.__version__)
PY
# 2) Spark 环境固定(Master/Worker 通用骨架)
sudo tee /opt/spark/conf/spark-env.sh >/dev/null <<'EOF'
JAVA_HOME=/opt/jdk/current
PYSPARK_PYTHON=/opt/py311/bin/python3.11
SPARK_MASTER_PORT=7077
SPARK_MASTER_WEBUI_PORT=8080
SPARK_WORKER_CORES=2
SPARK_WORKER_MEMORY=4g
SPARK_WORKER_PORT=7078
SPARK_WORKER_WEBUI_PORT=8081
# Master 克隆出来后再填:SPARK_MASTER_HOST=<master-ip-or-hostname>
EOF
# 留空 workers(Master 克隆出来后再填)
sudo bash -c 'echo -n > /opt/spark/conf/workers'
# 3) 克隆清理(避免ID/SSH冲突)
sudo truncate -s 0 /etc/machine-id
sudo rm -f /var/lib/dbus/machine-id
sudo ln -s /etc/machine-id /var/lib/dbus/machine-id
sudo rm -f /etc/ssh/ssh_host_*key /etc/ssh/ssh_host_*key.pub
克隆
使用vSphere可直接将镜像克隆到指定虚拟机
首先要将其放置到指定位置

之后选择你要克隆到的虚拟机

选择好指定的位置,确认即可

节点克隆完整,接下来需要进行调整静态IP等操作

配置节点
每台节点做节点化操作
# 主机名(举例:这台是 spark-worker3)
sudo hostnamectl set-hostname spark-worker3
# /etc/hosts 填全集群清单(按你实际IP改)
sudo tee -a /etc/hosts >/dev/null <<'EOF'
# Spark Cluster Nodes
10.10.10.101 spark-master
10.10.10.102 spark-worker1
10.10.10.103 spark-worker2
10.10.10.104 spark-worker3
10.10.10.105 spark-worker4
10.10.10.106 spark-worker5
EOF
# 重新生成 SSH 主机密钥
sudo dpkg-reconfigure openssh-server >/dev/null 2>&1 || sudo systemctl restart sshd || sudo systemctl restart ssh
配置所有worker节点的静态IP地址
sudo tee /etc/sysconfig/network-scripts/ifcfg-ens192 >/dev/null <<'EOF'
TYPE=Ethernet
BOOTPROTO=none
NAME=ens192
DEVICE=ens192
ONBOOT=yes
IPADDR=10.10.10.104
PREFIX=24
GATEWAY=10.10.10.1
DNS1=10.10.10.1
EOF
sudo systemctl restart network
在Master节点生成并向worker节点分发密钥,开启端口
# 指定 Master 可达地址
sudo sed -i '1i SPARK_MASTER_HOST=spark-master' /opt/spark/conf/spark-env.sh
# 写入 workers 列表
sudo tee /opt/spark/conf/workers >/dev/null <<'EOF'
spark-worker1
spark-worker2
spark-worker3
spark-worker4
spark-worker5
EOF
# 生成 SSH 密钥并分发(用于 start-all.sh 免密)
ssh-keygen -t ed25519 -N '' -f ~/.ssh/id_ed25519
for h in spark-worker1 spark-worker2 spark-worker3 spark-worker4 spark-worker5; do
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@$h || ssh-copy-id -i ~/.ssh/id_ed25519.pub <你的用户名>@$h
done
# 启动 Master(可启用 systemd 自启)
sudo systemctl enable --now spark-master
# 或者:/opt/spark/sbin/start-master.sh
# 打开防火墙端口
firewall-cmd --add-port=7077/tcp --permanent
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --add-port=7078/tcp --permanent
firewall-cmd --add-port=8081/tcp --permanent
firewall-cmd --reload
设置Spark服务配置文件
Master节点
# spark-env.sh
sed -i '1i SPARK_MASTER_HOST=10.10.10.101' /opt/spark/conf/spark-env.sh
# 直启主类的 unit(已避免脚本问题)
cat >/etc/systemd/system/spark-master.service <<'EOF'
[Unit]
Description=Apache Spark Master
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
Environment=JAVA_HOME=/opt/jdk/current
Environment=SPARK_HOME=/opt/spark
Environment=SPARK_NO_DAEMONIZE=1
WorkingDirectory=/opt/spark
ExecStart=/opt/spark/bin/spark-class org.apache.spark.deploy.master.Master --port 7077 --webui-port 8080
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now spark-master
journalctl -u spark-master -n 50 --no-pager
Worker节点
# 2.1 建议固定主机名(例:这台是 worker3)
# sudo hostnamectl set-hostname spark-worker3
# 2.2 写 Worker 的 systemd 服务(直启主类)
sudo tee /etc/systemd/system/spark-worker.service >/dev/null <<'EOF'
[Unit]
Description=Apache Spark Worker
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
Environment=JAVA_HOME=/opt/jdk/current
Environment=SPARK_HOME=/opt/spark
Environment=SPARK_NO_DAEMONIZE=1
WorkingDirectory=/opt/spark
# 如需自定义端口/资源,在此行后追加 --cores/--memory/--port/--webui-port
ExecStart=/opt/spark/bin/spark-class org.apache.spark.deploy.worker.Worker \
spark://spark-master:7077 --port 7078 --webui-port 8081
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now spark-worker
systemctl status spark-worker --no-pager
注意这里
spark://spark-master:7077部分的spark-master要改为你的master节点
不能直接通过浏览器访问,但可通过虚拟机中的浏览器进行查看,配置完成结果如图




说些什么吧!