在CentOS8上搭建伪分布式Spark环境,首先需要准备好基础运行环境。我建议使用最小化安装的CentOS8系统,这样可以避免不必要的软件冲突。记得先执行sudo dnf update -y更新系统,这个步骤我遇到过好几次因为系统未更新导致依赖库版本不匹配的问题。
JDK的安装是个关键步骤。实测下来,Spark 3.x版本对Java8和Java11的支持最稳定。我习惯把JDK安装在/opt目录下,这里分享一个实用技巧:解压JDK包时使用-C参数直接指定目标路径,可以避免后续移动文件的麻烦。具体操作如下:
bash复制sudo tar -zxvf jdk-8u381-linux-x64.tar.gz -C /opt/
配置环境变量时有个容易踩的坑:很多人会忘记在PATH变量中包含$JAVA_HOME/bin。我曾经花了两个小时排查"java命令找不到"的问题,最后发现就是这个原因。正确的配置应该是这样的:
bash复制export JAVA_HOME=/opt/jdk1.8.0_381
export PATH=$PATH:$JAVA_HOME/bin
验证Java安装是否成功时,除了java -version,我还会用javac -version确认编译环境也配置正确。这点在后续Spark编译自定义函数时会很重要。
虽然Spark可以独立运行,但配置Hadoop伪分布式环境能让Spark更好地利用HDFS存储系统。我推荐使用Hadoop 3.3.x版本,它与Spark 3.4.x的兼容性最好。解压Hadoop后,需要特别注意目录权限问题:
bash复制sudo chown -R username:username /opt/hadoop-3.3.6
伪分布式模式的核心配置文件是etc/hadoop/core-site.xml和hdfs-site.xml。这里有个实用技巧:在core-site.xml中,我把临时目录设为/home/username/tmp而不是默认的/tmp,这样可以避免权限问题:
xml复制<property>
<name>hadoop.tmp.dir</name>
<value>/home/username/tmp</value>
</property>
格式化HDFS文件系统时,新手常犯的错误是重复执行hdfs namenode -format。记住:只有在首次安装或需要完全清除数据时才需要执行这个命令。格式化完成后,启动HDFS时建议先单独启动namenode验证是否正常:
bash复制hdfs --daemon start namenode
Spark的安装相对简单,但配置伪分布式环境有几个关键点需要注意。我习惯使用带有Hadoop支持的预编译版本,比如spark-3.4.1-bin-hadoop3.tgz。解压后第一件事就是复制模板配置文件:
bash复制cp spark-env.sh.template spark-env.sh
cp workers.template workers
在spark-env.sh中,除了设置JAVA_HOME和SPARK_MASTER_HOST外,我还会添加以下配置来提高性能:
bash复制export SPARK_WORKER_CORES=4
export SPARK_WORKER_MEMORY=4g
export SPARK_DAEMON_MEMORY=1g
workers文件的配置有个容易忽略的细节:虽然我们是单节点伪分布式,但主机名必须与hostname命令返回的结果完全一致。我曾经因为主机名大小写不一致导致worker无法注册到master。
启动集群前,建议先检查防火墙设置。Spark需要用到多个端口,除了7077(master端口),还有8080(web UI)等。我一般会一次性开放所有需要的端口:
bash复制sudo firewall-cmd --permanent --add-port={7077,8080,4040}/tcp
sudo firewall-cmd --reload
把所有组件的环境变量整合到.bashrc中是个好习惯,但要注意加载顺序。我的经验是把Java相关的放在最前面,然后是Hadoop,最后是Spark。这样能避免类加载冲突:
bash复制# Java环境
export JAVA_HOME=/opt/jdk1.8.0_381
export PATH=$PATH:$JAVA_HOME/bin
# Hadoop环境
export HADOOP_HOME=/opt/hadoop-3.3.6
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
# Spark环境
export SPARK_HOME=/opt/spark-3.4.1-bin-hadoop3
export PATH=$PATH:$SPARK_HOME/bin
对于内存配置,伪分布式环境下要特别注意不要分配超过物理内存的资源。我的经验法则是:留给操作系统至少2GB内存,剩下的可以分配给Spark。可以通过spark-defaults.conf调整内存参数:
bash复制spark.executor.memory 2g
spark.driver.memory 1g
最后,建议为Spark创建专用的日志目录,方便问题排查:
bash复制mkdir -p /var/log/spark
chown username:username /var/log/spark
环境搭建完成后,我通常会通过三个步骤来验证安装是否正确。首先启动Spark集群:
bash复制$SPARK_HOME/sbin/start-all.sh
然后用jps命令检查进程是否齐全,应该能看到Master和Worker进程。接着通过Web UI(http://localhost:8080)确认worker节点已注册。
最可靠的测试还是实际运行一个Spark作业。我偏好使用SparkPi示例,因为它既能测试计算能力,又能验证分布式执行:
bash复制spark-submit --class org.apache.spark.examples.SparkPi \
--master spark://$(hostname):7077 \
$SPARK_HOME/examples/jars/spark-examples_2.12-3.4.1.jar 100
如果运行成功,你会在输出中看到"Pi is roughly 3.14..."的字样。这个测试虽然简单,但能验证整个环境是否正常工作。