在CentOS 8上从零搭建Spark伪分布式环境的完整指南作为一个长期在单机环境下折腾大数据技术栈的开发者我深知在有限资源下搭建Spark环境的痛点。本文将分享我在CentOS 8系统上配置Spark伪分布式环境的完整过程包括那些官方文档没提到的细节问题和实用技巧。1. 环境准备与基础配置在开始之前我们需要确保系统环境干净且一致。我使用的是CentOS 8.5 minimal安装版本这个版本去除了许多不必要的组件特别适合作为开发环境的基础。1.1 系统基础设置首先更新系统并安装基础工具sudo dnf update -y sudo dnf install -y wget curl tar vim net-tools然后设置主机名这里以spark-master为例sudo hostnamectl set-hostname spark-master echo 127.0.0.1 spark-master | sudo tee -a /etc/hosts1.2 创建专用用户为了避免权限问题我建议创建一个专门用于运行Spark的用户sudo useradd -m sparkuser sudo passwd sparkuser将用户添加到sudoers列表仅限测试环境echo sparkuser ALL(ALL) NOPASSWD:ALL | sudo tee -a /etc/sudoers2. Java环境配置Spark运行依赖Java环境以下是详细的JDK安装步骤2.1 安装OpenJDK 8虽然Oracle JDK也可以使用但我更推荐OpenJDKsudo dnf install -y java-1.8.0-openjdk-devel验证安装java -version javac -version2.2 环境变量配置编辑~/.bashrc文件添加以下内容export JAVA_HOME$(dirname $(dirname $(readlink -f $(which java)))) export PATH$PATH:$JAVA_HOME/bin然后使配置生效source ~/.bashrc提示使用readlink -f可以自动定位Java安装路径避免手动指定可能出现的路径错误3. Hadoop伪分布式环境虽然Spark可以独立运行但配置Hadoop环境可以获得完整的HDFS支持。3.1 下载与安装下载Hadoop 3.3.6并解压wget https://archive.apache.org/dist/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz sudo tar -xzf hadoop-3.3.6.tar.gz -C /opt/ sudo ln -s /opt/hadoop-3.3.6 /opt/hadoop sudo chown -R sparkuser:sparkuser /opt/hadoop*3.2 核心配置编辑/opt/hadoop/etc/hadoop/core-site.xmlconfiguration property namefs.defaultFS/name valuehdfs://spark-master:9000/value /property /configuration编辑/opt/hadoop/etc/hadoop/hdfs-site.xmlconfiguration property namedfs.replication/name value1/value /property /configuration3.3 初始化与启动格式化HDFShdfs namenode -format启动HDFS服务start-dfs.sh验证HDFS状态hdfs dfsadmin -report4. Spark伪分布式安装4.1 下载与解压选择与Hadoop版本兼容的Spark版本wget https://archive.apache.org/dist/spark/spark-3.4.1/spark-3.4.1-bin-hadoop3.tgz sudo tar -xzf spark-3.4.1-bin-hadoop3.tgz -C /opt/ sudo ln -s /opt/spark-3.4.1-bin-hadoop3 /opt/spark sudo chown -R sparkuser:sparkuser /opt/spark*4.2 关键配置编辑/opt/spark/conf/spark-env.shcp /opt/spark/conf/spark-env.sh.template /opt/spark/conf/spark-env.sh echo export SPARK_MASTER_HOSTspark-master /opt/spark/conf/spark-env.sh echo export SPARK_MASTER_PORT7077 /opt/spark/conf/spark-env.sh echo export SPARK_WORKER_CORES2 /opt/spark/conf/spark-env.sh echo export SPARK_WORKER_MEMORY2g /opt/spark/conf/spark-env.sh配置workers文件echo spark-master /opt/spark/conf/workers4.3 环境变量设置在~/.bashrc中添加export SPARK_HOME/opt/spark export PATH$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin5. 防火墙与端口配置CentOS 8使用firewalld作为防火墙管理工具需要开放以下关键端口端口号用途协议7077Spark Master通信TCP8080Spark Web UITCP8081Worker Web UITCP9000HDFS NameNodeTCP9864HDFS DataNodeTCP执行以下命令开放端口sudo firewall-cmd --permanent --add-port7077/tcp sudo firewall-cmd --permanent --add-port8080-8081/tcp sudo firewall-cmd --permanent --add-port9000/tcp sudo firewall-cmd --permanent --add-port9864/tcp sudo firewall-cmd --reload验证端口开放状态sudo firewall-cmd --list-ports6. 启动与验证6.1 启动Spark集群start-master.sh start-workers.sh检查进程是否正常运行jps应该能看到以下进程MasterWorkerNameNodeDataNode6.2 Web UI访问Spark Master Web UI默认在8080端口http://your-server-ip:8080Spark Worker Web UI默认在8081端口http://your-server-ip:80816.3 运行测试任务提交一个简单的Pi计算任务spark-submit --class org.apache.spark.examples.SparkPi \ --master spark://spark-master:7077 \ /opt/spark/examples/jars/spark-examples_2.12-3.4.1.jar 1007. 常见问题解决在实际搭建过程中我遇到了几个典型问题端口冲突问题如果8080端口被占用可以在spark-env.sh中设置export SPARK_MASTER_WEBUI_PORT8088内存不足问题调整worker内存设置export SPARK_WORKER_MEMORY1gSSH免密登录问题虽然是单节点但Spark仍然需要SSH本地登录ssh-keygen -t rsa cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keysHDFS权限问题在core-site.xml中添加property namehadoop.http.staticuser.user/name valuesparkuser/value /property8. 性能优化建议即使是伪分布式环境适当的优化也能提升开发体验资源配置调整根据机器配置调整executor内存和核心数在spark-defaults.conf中设置spark.executor.memory 2g spark.executor.cores 2日志级别调整编辑log4j.propertieslog4j.rootCategoryWARN, console本地磁盘缓存启用Spark的本地磁盘缓存export SPARK_LOCAL_DIRS/tmp/sparkJVM调优在spark-env.sh中添加export SPARK_DAEMON_JAVA_OPTS-XX:UseG1GC在实际项目中我发现伪分布式环境足够应对大多数开发测试场景。通过Web UI监控任务执行情况配合适当的日志级别设置可以快速定位问题。