Spark单机部署全攻略:从环境配置到运行实践

一、为什么选择Spark单机部署?

Spark作为大数据处理领域的核心框架,其单机部署模式在开发测试、小型数据分析及教学场景中具有显著优势。相较于集群部署,单机模式无需复杂的分布式协调(如Zookeeper),减少了网络通信开销,且资源占用可控。对于开发者而言,单机环境能够快速验证算法逻辑、调试代码,同时避免因集群配置错误导致的排查成本。例如,在机器学习模型训练中,单机模式可快速迭代参数,待模型稳定后再迁移至集群环境。

二、环境准备:系统与依赖要求

1. 操作系统兼容性

Spark支持Linux、macOS及Windows(需WSL2或Cygwin),推荐使用Ubuntu 20.04 LTS或CentOS 8,因其对Java和Scala的兼容性最佳。Windows用户需注意路径分隔符问题(如使用/替代\)。

2. Java与Scala版本选择

Spark 3.x要求Java 8/11(推荐OpenJDK),Scala版本需与Spark二进制包匹配(如Spark 3.3.0对应Scala 2.12)。可通过以下命令验证:

  1. java -version # 应显示1.8.x或11.x
  2. scala -version # 应显示2.12.x

3. 依赖管理工具

建议使用Homebrew(macOS)或APT/YUM(Linux)安装基础依赖:

  1. # Ubuntu示例
  2. sudo apt update
  3. sudo apt install -y openjdk-11-jdk scala git

三、Spark单机安装与配置

1. 下载与解压

从Apache Spark官网选择与Scala版本匹配的预编译包(如spark-3.3.0-bin-hadoop3.tgz),解压至/opt/spark

  1. sudo tar -xzf spark-3.3.0-bin-hadoop3.tgz -C /opt/
  2. sudo ln -s /opt/spark-3.3.0-bin-hadoop3 /opt/spark

2. 环境变量配置

编辑~/.bashrc/etc/profile,添加以下内容:

  1. export SPARK_HOME=/opt/spark
  2. export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
  3. export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64

执行source ~/.bashrc使配置生效。

3. 核心配置文件调整

修改$SPARK_HOME/conf/spark-defaults.conf,启用历史服务器并调整内存:

  1. spark.master local[*]
  2. spark.eventLog.enabled true
  3. spark.eventLog.dir file:///tmp/spark-events
  4. spark.driver.memory 4g
  5. spark.executor.memory 4g
  • local[*]表示使用所有可用CPU核心。
  • 内存设置需根据物理内存调整(建议不超过总内存的70%)。

四、启动与验证

1. 启动Spark服务

执行以下命令启动Master和Worker(单机模式下两者合一):

  1. $SPARK_HOME/sbin/start-all.sh

通过jps命令验证进程:

  1. 12345 Jps
  2. 12344 Worker
  3. 12343 Master

2. Web UI访问

Spark默认提供8080端口(Master)和8081端口(Worker)的Web界面,浏览器访问http://localhost:8080可查看集群状态、任务历史及资源使用情况。

3. 运行测试任务

使用Spark Shell提交一个简单任务:

  1. $SPARK_HOME/bin/spark-shell

在交互界面中执行:

  1. val data = Seq(1, 2, 3, 4, 5)
  2. val rdd = sc.parallelize(data)
  3. rdd.map(_ * 2).collect().foreach(println)

预期输出:2, 4, 6, 8, 10

五、常见问题与解决方案

1. 端口冲突

若8080/8081端口被占用,修改$SPARK_HOME/conf/spark-env.sh

  1. export SPARK_MASTER_WEBUI_PORT=8088
  2. export SPARK_WORKER_WEBUI_PORT=8089

2. 内存不足错误

任务失败时日志显示OutOfMemoryError,需调整spark-defaults.conf中的spark.driver.memoryspark.executor.memory,或通过命令行参数覆盖:

  1. spark-submit --driver-memory 8g --executor-memory 8g ...

3. 数据本地化问题

若任务执行缓慢,检查spark.locality.wait参数(默认3s),适当增加可提升数据本地化率:

  1. spark.locality.wait 10s

六、进阶实践:与本地存储集成

1. 读取本地文件

Spark支持直接读取本地文件系统(需使用file://前缀):

  1. val text = sc.textFile("file:///tmp/data.txt")
  2. text.count()

2. 写入本地目录

将结果保存至本地:

  1. rdd.saveAsTextFile("file:///tmp/output")

注意:输出目录需不存在,否则会报错。

七、总结与建议

Spark单机部署是开发者快速上手大数据处理的理想选择。通过本文的步骤,读者可完成从环境搭建到任务运行的全流程。建议后续探索:

  1. 使用spark-submit提交打包的JAR文件。
  2. 集成Hadoop HDFS或MinIO作为分布式存储。
  3. 通过local[K](K为固定核心数)模拟不同资源场景。

对于生产环境,建议逐步迁移至集群模式(如Standalone、YARN或K8s),但单机部署积累的经验可直接复用至分布式场景。