作为一名长期从事大数据平台搭建的技术从业者,我最近在VMware虚拟机上完整搭建了Hadoop 3.3.6 + Spark 3.4.3集群环境。这个过程中发现网上大多数教程都是基于CentOS 7的旧版本方案,而随着Ubuntu 22.04 LTS的普及和各大镜像源的更新,很多传统方法已经不再适用。本文将详细记录我在Ubuntu 22.04系统上从零开始搭建集群的全过程,包括环境准备、网络配置、集群部署和验证等关键步骤,特别针对2024年最新的软件版本和镜像源进行了适配优化。
这个教程特别适合想要学习大数据技术但缺乏物理服务器资源的学生和开发者。通过VMware虚拟机,你可以在个人电脑上模拟出完整的三节点集群环境,进行HDFS、YARN和Spark的实际操作练习。相比云服务方案,本地虚拟机方案成本更低,且能让你更深入地理解集群的底层配置原理。
在开始之前,我们需要精心选择各个组件的版本。版本兼容性是大数据平台搭建中最容易出问题的环节之一。经过多次测试验证,我最终确定了以下版本组合:
操作系统:Ubuntu 22.04.5 LTS(Jammy Jellyfish)
选择理由:LTS版本提供5年支持,且对Hadoop 3.x和Spark 3.x有更好的兼容性。相比CentOS,Ubuntu的软件源更新更及时,社区支持也更活跃。
Java环境:JDK 8u181
虽然Java 11也能运行Hadoop,但JDK 8仍然是生产环境最稳定的选择。注意要选择Oracle JDK或OpenJDK的LTS版本。
Hadoop:3.3.6(当前稳定版)
这个版本修复了之前3.3.x系列的多个重要bug,特别是与YARN资源管理相关的稳定性问题。
Spark:3.4.3(兼容Hadoop 3.3.x)
特意选择"pre-built for Apache Hadoop 3.3 and later"的二进制包,避免自行编译的麻烦。
所有软件都应从官方镜像站或可信的国内镜像源下载。以下是我验证过的下载链接:
bash复制# Hadoop 3.3.6
wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
# JDK 8u181 (华为镜像源,下载速度较快)
wget https://repo.huaweicloud.com/java/jdk/8u181-b13/jdk-8u181-linux-x64.tar.gz
# Ubuntu 22.04.5 桌面版ISO
wget https://releases.ubuntu.com/jammy/ubuntu-22.04.5-desktop-amd64.iso
# Spark 3.4.3 (带Hadoop 3.3支持)
wget https://archive.apache.org/dist/spark/spark-3.4.3/spark-3.4.3-bin-hadoop3.tgz
重要提示:下载完成后务必验证文件完整性。可以通过对比SHA-256校验和来确认文件未被篡改。例如Hadoop的校验和可以从https://downloads.apache.org/hadoop/common/hadoop-3.3.6/ 找到。
除了核心的大数据组件外,还需要准备以下辅助工具:
MobaXterm:Windows下强大的SSH客户端,支持多标签会话和文件传输。便携版无需安装,解压即可使用。
VMware Workstation Pro:建议使用16.x或17.x版本,对Ubuntu 22.04有更好的支持。如果是个人学习使用,可以申请免费的教育许可证。
文本编辑器:推荐VS Code或Notepad++,用于编辑配置文件和脚本。避免使用Windows自带的记事本,因为它会改变Unix系统的行尾格式。
在VMware中创建虚拟机的步骤如下:
安装Ubuntu时需要注意的几个关键点:
在分区阶段,建议手动分区:
/:20GB(ext4)swap:内存的1.5倍(如果内存≥8GB,可以等于内存大小)/home:剩余空间(存放用户数据)用户名和密码要简单易记,因为后续SSH连接会频繁使用。建议用户名如"hadoop",密码"hadoop123"。
安装完成后,立即执行系统更新:
bash复制sudo apt update && sudo apt upgrade -y
正确的网络配置是集群正常工作的基础。我们需要完成以下任务:
设置静态IP:防止虚拟机重启后IP变化导致集群通信失败。
编辑/etc/netplan/00-installer-config.yaml(文件名可能略有不同):
yaml复制network:
ethernets:
ens33: # 网卡名称,通过ip a查看
dhcp4: no
addresses: [192.168.88.130/24]
gateway4: 192.168.88.2
nameservers:
addresses: [8.8.8.8, 114.114.114.114]
version: 2
应用配置:sudo netplan apply
主机名解析:编辑/etc/hosts,添加所有节点信息:
code复制192.168.88.130 hadoop01
192.168.88.131 hadoop02
192.168.88.132 hadoop03
防火墙设置:Ubuntu默认使用UFW,建议直接禁用:
bash复制sudo ufw disable
为了提高集群性能,还需要进行一些系统级优化:
关闭Swap:Hadoop在内存不足时会自己处理,不需要Swap干预。
bash复制sudo swapoff -a
sudo sed -i '/swap/s/^/#/' /etc/fstab # 永久禁用
调整文件描述符限制:大数据应用会打开大量文件。
编辑/etc/security/limits.conf,添加:
code复制* soft nofile 65536
* hard nofile 65536
SSH服务优化:编辑/etc/ssh/sshd_config:
code复制PermitRootLogin no
PasswordAuthentication yes # 方便初期调试,生产环境应改为no
Java环境部署:
bash复制sudo mkdir -p /opt/java
sudo tar -zxvf jdk-8u181-linux-x64.tar.gz -C /opt/java
Hadoop安装:
bash复制sudo mkdir -p /opt/hadoop
sudo tar -zxvf hadoop-3.3.6.tar.gz -C /opt/hadoop
环境变量配置:
编辑/etc/profile,添加:
bash复制export JAVA_HOME=/opt/java/jdk1.8.0_181
export HADOOP_HOME=/opt/hadoop/hadoop-3.3.6
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
然后执行:source /etc/profile
Hadoop的核心配置文件位于$HADOOP_HOME/etc/hadoop/目录下:
core-site.xml - 全局配置:
xml复制<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/tmp</value>
</property>
</configuration>
hdfs-site.xml - HDFS配置:
xml复制<configuration>
<property>
<name>dfs.replication</name>
<value>3</value> <!-- 副本数,应与DataNode数量一致 -->
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/hadoop/namenode</value>
</property>
</configuration>
yarn-site.xml - YARN配置:
xml复制<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop01</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
格式化HDFS(仅在首次执行):
bash复制hdfs namenode -format
启动HDFS:
bash复制start-dfs.sh
启动YARN:
bash复制start-yarn.sh
验证服务:
bash复制hdfs dfs -mkdir /test
hdfs dfs -ls /
解压安装:
bash复制sudo tar -zxvf spark-3.4.3-bin-hadoop3.tgz -C /opt
sudo mv /opt/spark-3.4.3-bin-hadoop3 /opt/spark
环境变量配置:
编辑/etc/profile,添加:
bash复制export SPARK_HOME=/opt/spark
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
Spark配置:
spark-env.sh:bash复制export SPARK_MASTER_HOST=hadoop01
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
workers文件:code复制hadoop01
hadoop02
hadoop03
Spark可以独立运行,也可以集成到YARN上。推荐使用YARN模式,可以更好地利用集群资源:
提交测试任务:
bash复制spark-submit --class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
$SPARK_HOME/examples/jars/spark-examples_2.12-3.4.3.jar 100
监控任务:
在YARN的Web UI(http://hadoop01:8088)中可以查看Spark应用的运行状态和日志。
问题现象:节点间无法ping通,SSH连接超时。
解决方案:
sudo ufw status/etc/hosts文件是否包含所有节点信息。问题现象:NameNode或DataNode进程无法启动,日志中出现端口冲突或权限错误。
解决方案:
netstat -tulnp | grep javabash复制sudo chown -R hadoop:hadoop /opt/hadoop/tmp
bash复制cat $HADOOP_HOME/logs/hadoop-hadoop-namenode-hadoop01.log
问题现象:Spark应用提交后一直处于ACCEPTED状态,不执行。
解决方案:
bash复制yarn node -list
bash复制spark-submit --driver-memory 2g ...
bash复制yarn logs -applicationId <app_id>
HDFS管理:
hdfs dfsadmin -reporthdfs balancer -threshold 10YARN管理:
yarn node -listyarn application -kill <app_id>Spark管理:
yarn application -list$SPARK_HOME/sbin/start-history-server.shHadoop监控指标:
Linux系统监控:
top、htopiostat -x 1iftop日志收集:
当需要增加节点时:
workers文件。bash复制hdfs --daemon start datanode
yarn --daemon start nodemanager
HDFS优化:
dfs.blocksize(默认为128MB,可增大到256MB)dfs.client.read.shortcircuit设为trueYARN优化:
yarn.scheduler.minimum-allocation-mbyarn.nodemanager.pmem-check-enabledSpark优化:
--num-executorsspark.default.parallelismSSH安全:
/etc/ssh/sshd_config:code复制PasswordAuthentication no
PermitRootLogin no
Hadoop安全:
hdfs dfs -chmod和hdfs dfs -chown。防火墙策略:
从本地导入HDFS:
bash复制hdfs dfs -put /local/path /hdfs/path
从HDFS导出到本地:
bash复制hdfs dfs -get /hdfs/path /local/path
使用DistCp跨集群复制:
bash复制hadoop distcp hdfs://source-cluster/path hdfs://target-cluster/path
一个简单的WordCount示例:
scala复制val textFile = sc.textFile("hdfs://hadoop01:9000/input/sample.txt")
val counts = textFile.flatMap(line => line.split(" "))
.map(word => (word, 1))
.reduceByKey(_ + _)
counts.saveAsTextFile("hdfs://hadoop01:9000/output/wordcount")
提交到集群运行:
bash复制spark-submit --class WordCount \
--master yarn \
--deploy-mode cluster \
your-app.jar
当需要重新开始实验时:
停止所有服务:
bash复制stop-yarn.sh
stop-dfs.sh
删除HDFS数据:
bash复制rm -rf /opt/hadoop/tmp/*
rm -rf /opt/hadoop/namenode/*
rm -rf /opt/hadoop/datanode/*
清理Spark临时文件:
bash复制rm -rf /opt/spark/work/*
重新格式化HDFS:
bash复制hdfs namenode -format
官方文档:
进阶书籍:
在线课程:
社区支持:
经过这样一套完整的搭建过程,你应该已经掌握了一个功能完备的Hadoop+Spark集群环境。这个环境虽然是在虚拟机上搭建的,但所有配置和操作都与真实生产环境一致,可以作为学习和开发的有力工具。在实际操作中遇到问题时,记得多查看日志文件,它们通常能提供最直接的错误线索。