1. 为什么选择VMware虚拟机搭建Hadoop+Spark集群?
在开始之前,我们需要明确一个基本问题:为什么要用虚拟机搭建大数据集群?我在2018年第一次接触Hadoop时,曾经尝试直接在物理机上部署,结果因为网络配置错误导致整个实验室的网络瘫痪。这次教训让我深刻认识到虚拟机环境的价值——它提供了完美的沙箱实验环境。
VMware Workstation Pro(目前最新版为17)作为业界领先的虚拟化平台,具有几个不可替代的优势:
- 完整的快照功能:你可以在每个关键步骤后创建系统快照,出错时一键回滚
- 网络隔离:NAT和仅主机模式能避免对外部网络造成影响
- 资源可控:可以精确分配CPU核心和内存,模拟真实集群环境
- 硬件兼容:避免了真实服务器可能遇到的驱动问题
重要提示:虽然VMware提供免费试用版,但长期使用建议购买正版许可证。网上流传的密钥往往会导致不可预知的问题,我在2023年就遇到过因为使用非正版密钥导致虚拟机突然崩溃的情况。
2. 环境准备与基础配置
2.1 硬件需求建议
根据我多年搭建集群的经验,推荐以下硬件配置:
- 宿主机:至少16GB内存(32GB更佳),因为每个虚拟机节点建议分配4-8GB
- CPU:支持VT-x/AMD-V虚拟化的四核以上处理器
- 存储:SSD硬盘,至少100GB可用空间(Hadoop很吃I/O性能)
我的当前测试环境配置供参考:
- ThinkPad P15v:i7-11800H (8核16线程)
- 64GB DDR4内存
- 1TB NVMe SSD
- VMware Workstation 17 Pro
2.2 软件版本选择
版本兼容性是大数据平台永远的痛。经过多次踩坑,我总结出以下稳定组合:
| 组件 | 推荐版本 | 备注 |
|---|---|---|
| VMware | 17.0.2 | 最新稳定版 |
| 操作系统 | CentOS 7.9 | 2026年仍维护的最终7.x版本 |
| Java | JDK 8u381 | Hadoop官方推荐版本 |
| Hadoop | 3.3.6 | 2026年LTS版本 |
| Spark | 3.5.1 | 兼容Hadoop 3.3.x的最新稳定版 |
注意:CentOS 8已停止维护,而CentOS Stream的滚动更新特性不适合生产环境。如果必须用新系统,Rocky Linux 9.x是更好的选择。
2.3 虚拟机创建规范
创建虚拟机时有几个关键设置经常被忽略:
- 虚拟磁盘类型选择SCSI(非IDE),性能更好
- 网络适配器选择NAT模式(初期)或自定义VMnet
- 开启CPU虚拟化引擎的"虚拟化Intel VT-x/EPT"选项
- 内存设置中锁定全部内存(避免交换)
我建议的集群规划:
- 3个节点:1个NameNode + 2个DataNode
- 每个节点配置:
- 4GB内存
- 2个CPU核心
- 50GB磁盘(动态分配)
- 桥接网络(后期改为专用网络)
3. 系统级准备工作
3.1 CentOS基础配置
安装完CentOS后,这些操作必不可少:
# 关闭SELinux(避免权限问题) sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # 关闭防火墙(实验环境) systemctl stop firewalld systemctl disable firewalld # 安装必备工具 yum install -y vim net-tools wget curl telnet lrzsz # 设置主机名(分别在三个节点执行) hostnamectl set-hostname nn01 # NameNode hostnamectl set-hostname dn01 # DataNode1 hostnamectl set-hostname dn02 # DataNode2 # 配置hosts文件(所有节点相同) cat >> /etc/hosts << EOF 192.168.100.101 nn01 192.168.100.102 dn01 192.168.100.103 dn02 EOF3.2 SSH免密登录配置
Hadoop集群管理依赖SSH,配置步骤:
- 所有节点生成密钥:
ssh-keygen -t rsa - 将NameNode的公钥分发到所有节点:
ssh-copy-id nn01 ssh-copy-id dn01 ssh-copy-id dn02- 测试是否成功:
ssh dn01 date应该不需要密码
常见问题:如果遇到"Permission denied"错误,检查以下文件权限:
- ~/.ssh 目录权限应为700
- ~/.ssh/authorized_keys 权限应为600
3.3 Java环境安装
Hadoop对Java版本非常敏感,建议这样安装:
# 下载JDK(官网获取最新链接) wget https://download.oracle.com/java/18/latest/jdk-18_linux-x64_bin.rpm # 安装并配置环境变量 rpm -ivh jdk-18_linux-x64_bin.rpm cat >> /etc/profile << EOF export JAVA_HOME=/usr/java/default export PATH=\$PATH:\$JAVA_HOME/bin EOF source /etc/profile验证安装:java -version应该显示正确的版本信息
4. Hadoop集群部署实战
4.1 Hadoop安装与配置
下载和解压Hadoop:
wget https://archive.apache.org/dist/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz tar -zxvf hadoop-3.3.6.tar.gz -C /opt/ mv /opt/hadoop-3.3.6 /opt/hadoop关键配置文件修改(所有节点相同):
- hadoop-env.sh
export JAVA_HOME=/usr/java/default export HADOOP_HOME=/opt/hadoop export HADOOP_LOG_DIR=/var/log/hadoop- core-site.xml
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://nn01:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/data/hadoop/tmp</value> </property> </configuration>- hdfs-site.xml
<configuration> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/data/hadoop/namenode</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/data/hadoop/datanode</value> </property> </configuration>- workers文件(旧版是slaves)
dn01 dn024.2 集群初始化与启动
仅在NameNode执行:
# 创建数据目录 mkdir -p /data/hadoop/{namenode,datanode,tmp} # 格式化HDFS hdfs namenode -format # 启动集群 start-dfs.sh验证集群状态:
hdfs dfsadmin -report应该能看到2个活动的DataNode
4.3 YARN资源管理配置
如果需要运行MapReduce作业,还需要配置YARN:
- mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>- yarn-site.xml
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.hostname</name> <value>nn01</value> </property> </configuration>启动YARN:
start-yarn.sh5. Spark集群部署与集成
5.1 Spark安装配置
下载和解压Spark:
wget https://archive.apache.org/dist/spark/spark-3.5.1/spark-3.5.1-bin-hadoop3.tgz tar -zxvf spark-3.5.1-bin-hadoop3.tgz -C /opt/ mv /opt/spark-3.5.1-bin-hadoop3 /opt/spark环境变量配置:
cat >> /etc/profile << EOF export SPARK_HOME=/opt/spark export PATH=\$PATH:\$SPARK_HOME/bin EOF source /etc/profile关键配置修改:
- spark-env.sh
export JAVA_HOME=/usr/java/default export HADOOP_CONF_DIR=/opt/hadoop/etc/hadoop export SPARK_MASTER_HOST=nn01 export SPARK_WORKER_MEMORY=2g- workers文件
dn01 dn025.2 启动Spark集群
在NameNode执行:
/opt/spark/sbin/start-all.sh验证集群状态:
/opt/spark/sbin/spark-shell --master spark://nn01:70775.3 集成测试
运行一个简单的WordCount示例:
val textFile = sc.textFile("hdfs://nn01:9000/input/sample.txt") val counts = textFile.flatMap(line => line.split(" ")) .map(word => (word, 1)) .reduceByKey(_ + _) counts.saveAsTextFile("hdfs://nn01:9000/output/wordcount")6. 集群运维与问题排查
6.1 常见错误解决方案
DataNode无法启动
- 检查日志:/var/log/hadoop/hadoop--datanode-.log
- 常见原因:clusterID不匹配,需要同步NameNode的VERSION文件
Spark作业卡住
- 检查资源分配:YARN的资源配置是否足够
- 查看Spark UI:http://nn01:4040
磁盘空间不足
- 定期清理HDFS垃圾箱:
hdfs dfs -expunge
6.2 性能优化建议
HDFS调优参数
<!-- hdfs-site.xml --> <property> <name>dfs.datanode.max.transfer.threads</name> <value>4096</value> </property>Spark内存配置
# spark-env.sh export SPARK_EXECUTOR_MEMORY=4g export SPARK_DRIVER_MEMORY=2gLinux系统调优
# 增大文件描述符限制 ulimit -n 65535
6.3 监控方案
基础监控配置:
- Hadoop自带监控:http://nn01:9870
- Spark监控:http://nn01:8080
- 简易监控脚本:
watch -n 5 "hdfs dfsadmin -report; yarn node -list"我在实际运维中发现,当DataNode磁盘使用超过90%时,经常会出现各种奇怪的问题。建议设置定期检查脚本,当磁盘使用超过85%时自动报警。