Spark源码阅读环境搭建

前言

凭借高性能、高容错和可扩展的优势,Spark已成为目前应用最为广泛的大数据计算引擎之一。作为一名数据工程师,处理日常spark任务错误是最家常便饭的事,但如何快速排查并解决问题以及调优任务是很多初级大数据工程师都会遇到的一道坎?知己知彼才能百战不殆,要想掌握Spark,那就必须深刻理解框架的运行机制,只能从Spark源码入手。

阅读源码的第一步就是要搭建Spark源码阅读环境,由于大多数人的工作电脑都是Windonws系统,因此本文提供了Windows系统Spark 3.1.2源码环境搭建过程。

Spark源码环境搭建疑惑

一开始不知道大家有没有和我一样的疑惑,官方提供了spark源码,那是不是只要把源码下载下来然后导入到IDEA中就可以了呢?在回来这个问题前,先看看导入源码后IDEA会有哪些行为:

① 会解析 pom.xml(Maven)或 build.gradle(Gradle)文件,下载依赖项(可能需要较长时间);

② 建立索引(indexing),实现代码提示、跳转等功能;

③ 显示源码目录结构;

IDEA执行完以上行为后是能静态查看代码的,基本上可以满足查看源码的需求。但如果你想要进一步:

  • 理解代码执行流程(比如调试 Spark SQL 解析过程)
  • 跟踪方法调用栈(例如 Spark 的 DAGScheduler 如何工作)
  • 修改源码并验证效果
  • 分析运行时变量值、线程状态
  • 学习框架内部机制(如 YARN 的资源调度逻辑)

就必须让程序真正运行起来,并能设置断点、单步调试。这就需要编译和构建源码了。

编译源码的真正目的

目的说明
1. 生成字节码(.class 文件)Java/Scala 源码必须经过编译才能在 JVM 上运行。否则无法启动任何服务(如 HiveServer2、SparkContext)。
2. 解决依赖和模块间引用编译过程会检查类路径、依赖库是否正确引入。很多“看似能看”的代码,其实缺少依赖会导致运行时 ClassNotFoundException
3. 支持断点调试(Debug)只有编译后的代码与源码映射正确(*.class*.java),才能在 IDEA 中设置断点、进入方法、观察变量。否则调试时“跟不进去”。
4. 验证源码完整性编译能暴露语法错误、版本冲突、注解处理失败等问题。有些开源项目 clone 下来可能有缺失或分支不对,编译会直接报错。
5. 生成可执行包或组件比如编译 Spark 才能生成 spark-submit,编译 Hive 才能启动 metastorehiveserver2
6. 支持增量开发与热部署编译后的项目可以配合 IDEA 的 Debug 模式实现“改完代码立即生效”(部分场景),便于快速验证想法。

【静态源码】和【编译后源码】的区别

能力静态源码源码编译后
阅读代码
跳转定义、查找用法
设置断点调试❌(无法进入方法)
查看运行时变量值
跟踪异常堆栈⚠️ 有限
修改代码并验证❌(无法运行)
分析性能瓶颈(结合 Profiler)

一句话总结:查看源码 ≠ 能正确运行和调试源码,编译的目的不只是“生成 class 文件”,更是为了获得一个“可构建、可运行、可调试”的开发环境。

哪些人需要编译源码?

角色是否需要编译
初学者想了解架构⭕ 建议编译(至少编译一次,感受完整流程)
开发者二次开发(改 Hive/Spark 源码)✅ 必须编译
调试线上问题(复现 Bug)✅ 必须编译
面试官/学习者临时查阅逻辑❌ 可不编译,仅查看即可
贡献代码到社区(PR)✅ 必须编译并通过 CI 测试

因此,对于初学者最好编译源码,并能在Debug代码时看代码的执行流程,这会更加有助于理解框架。

Spark源码下载

spark源码可以通过官网和git下载,本文采用官网下载,下载地址:https://archive.apache.org/dist/spark/。

本文编译的版本是Spark 3.1.2。

在这里插入图片描述

软件环境准备在这里插入图片描述

① 编译spark需要依赖其他软件环境,各软件的版本可查看下载spark源码中的pom文件。

Java 1.8
Scala 2.12.10
Maven 3.6.3

各环境安装教程可参考:
超详细JDK下载与安装步骤
Scala安装和源码环境搭建
Maven安装和配置详细教程
② 由于spark源码中没有提供为Windows系统提供编译命令,因此还需要借助Git Bash工具提供类似 Linux/macOS 的 Unix-like 命令行环境(基于 Bash shell),本文装的Git 版本是 2.33.0。

③ 由于编译中需要下载各种依赖文件,spark源码pom文件中默认是国外镜像,下载会很慢,因此需改为国内镜像,本文采用阿里云。

改动的镜像仓库为 gcs-maven-central-mirror,全部替换为阿里云。

<id>nexus-aliyun</id>
<!--Google Mirror of Maven Central, placed first so that it's used instead of flaky Maven Central.
See https://storage-download.googleapis.com/maven-central/index.html
-->
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>

在这里插入图片描述

Spark源码编译过程

Spark源码编译官网介绍:https://spark.apache.org/docs/latest/building-spark.html

Maven内存设置

源码编译需要消耗大量的内存,因此可以根据自己的电脑配置适当调大Maven内存,否则可能会出现内存不足的报错。

用记事本打开build/mvn命令,进行编辑:

export MAVEN_OPTS="-Xss64m -Xmx2g -XX:ReservedCodeCacheSize=1g"

在这里插入图片描述

源码编译

日常工作中spark大多数是基于yarn进行资源调度,因此本文基于Hadoop进行编译,通过如下设置指定要编译的 Hadoop 的确切版本hadoop.version

./build/mvn -T 8C -Pyarn -Phadoop=3.2.0 -DskipTests clean package

注:hadoop版本要和pom文件中的版本保持一致。

在这里插入图片描述
切换到下载解压后的spark源码目录,打开git bash,执行上述maven命令,源码开始编译。
在这里插入图片描述

编译成功

编译过程会较久,耐心等待,最后如果出现BUILD SUCESS即代表成功。

在这里插入图片描述
为进一步确认spark编译成功,打卡Windonws的powershell,切换到源码目录,运行./bin/spark-shell --version,如果成功输出版本则代表编译成功了。
在这里插入图片描述

源码导入IDEA

为了更好的阅读源码,需要将编译好的源码导入到IDEA查看。IDEA默认是不支持scala程序开发的,IDEA中的scala相关配置参考:
Scala安装和源码环境搭建

后语

由于每个人电脑的环境不一致,编译过程中可能会各种莫名其妙的报错。因此如果装过java、maven等环境的,最好清理一下重新装过,尽量减少版本冲突。但即使这样编译中还是会出现问题,此时要静下心来,对报的错一一网上查询解决方案。如果尝试了各种方案还是无法解决,那么可以试着放弃该版本,试一试编译另外的版本,说不定就会编译成功。(作者一开始是编译3.3.3,但一直卡在java.lang.NoSuchMethodError: org.fusesource.jansi.AnsiConsole.wrapOutputStream这个错误中,最后果然放弃转向了3.1.2,最后编译成功了。)

参考

从零开始,手把手教你搭建Spark源码学习环境
sparksql源码共读 | 复习&答疑&大家遇到问题总结
Spark源码阅读环境搭建

更多推荐