学习Spark4.0源码【1】——下载并运行spark并进行debug

学习Spark4.0源码【1】——下载并运行spark并进行debug

官网文档:https://spark.apache.org/docs/4.0.0/

想要学习Spark4.0源码,第一步是搭建源码学习环境,然后学会如何将spark跑起来,并debug。

1.下载 Apache Spark 4.0.0

github地址:https://github.com/apache/spark

二进制发行版下载页面:https://spark.apache.org/downloads.html

如果你只需要使用spark,而不需要学习和修改源码 仅使用二进制发行版 即可。

如果想要学习源码,那就从github上拉取

1
git clone https://github.com/apache/spark

并用IDEA打开项目就可以得到 Spark 4.0.0 啦。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
spark/
├── core/ # 核心引擎
├── sql/ # SQL引擎
├── mllib/ # 机器学习
├── graphx/ # 图计算
├── streaming/ # 流处理
├── python/pyspark/ # Python API
├── R/ # R API
├── examples/ # 示例程序
├── connector/ # 外部连接器
├── resource-managers/ # 资源管理器
├── assembly/ # 打包构建
├── bin/ # 启动脚本
├── sbin/ # 守护进程脚本
└── dev/ # 开发工具

第一次加载maven依赖可能有些久,耐心等待一下。

2.编译spark

2.1 jdk环境要求

需要提前说的是 spark最低要求jdk17及以上版本,才可以运行。如果没有安装高版本jdk或者本地默认java环境是其他版本的,需要调整到java17。

1
2
3
4
5
6
kxr@kxrdeMacBook-Pro spark-4.0.0-bin-hadoop3 % /usr/libexec/java_home -V
Matching Java Virtual Machines (4):
21.0.7 (arm64) "Azul Systems, Inc." - "Zulu 21.42.19" /Users/kxr/Library/Java/JavaVirtualMachines/azul-21.0.7/Contents/Home
17.0.15 (arm64) "Azul Systems, Inc." - "Zulu 17.58.21" /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home
11.0.26 (arm64) "Oracle Corporation" - "Java SE 11.0.26" /Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home
1.8.0_452 (arm64) "Azul Systems, Inc." - "Zulu 8.86.0.25" /Users/kxr/Library/Java/JavaVirtualMachines/azul-1.8.0_452/Contents/Home

我有安装过17,但是我默认是用jdk8的。所以这里我使用jenv切换一下默认java版本

1
2
3
4
5
kxr@kxrdeMacBook-Pro ~ % jenv global 17
kxr@kxrdeMacBook-Pro ~ % java -version
openjdk version "17.0.15" 2025-04-15 LTS
OpenJDK Runtime Environment Zulu17.58+21-CA (build 17.0.15+6-LTS)
OpenJDK 64-Bit Server VM Zulu17.58+21-CA (build 17.0.15+6-LTS, mixed mode, sharing)

如果没有使用过多版本jdk管理的,可以看下这篇文章:使用 Jenv 管理多版本 JDK 环境

2.2 编译

2.2.1 使用编译脚本编译

使用Spark项目提供的Maven包装脚本 ,并且跳过测试执行(spark内部测试用例很多,这些可以不用编译)。

1
./build/mvn -DskipTests clean package
1
2
# 这个命令可以并行构建,要快一点 就是对电脑压力大一些
export MAVEN_OPTS="-Xmx6g -XX:MaxMetaspaceSize=4g" && ./build/mvn -DskipTests clean package -T 2C

这块有点久,有35个模块。

构建完成后会生成:

  • 各模块的jar包

    1
    2
    3
    core/target/spark-core_2.13-4.1.0-SNAPSHOT.jar
    sql/core/target/spark-sql_2.13-4.1.0-SNAPSHOT.jar
    mllib/target/spark-mllib_2.13-4.1.0-SNAPSHOT.jar
  • Assembly包(这是关键):

    1
    assembly/target/scala-2.13/jars/

    这个目录包含运行Spark所需的所有JAR文件

2.2.2 各模块JAR包 vs Assembly包

这块加入点理论内容,让大家了解我们编译到底编译出什么东西,有什么作用。

各模块JAR包(Individual Module JARs)

特点

  • 单一功能:每个JAR只包含对应模块的代码
  • 依赖分离:不包含第三方依赖库
  • 体积小:通常几MB到几十MB
  • 纯净性:只有该模块的class文件

作用

  1. 开发阶段:模块化开发和测试
  2. 依赖管理:作为Maven依赖被其他项目引用
  3. 部署优化:在已有Spark环境中只更新特定模块

🎯 Assembly包(Assembly JAR)

特点

  • 完整性:包含运行Spark所需的所有JAR文件
  • 依赖包含:包含所有第三方依赖库
  • 体积大:通常几百MB
  • 即用性:可以直接运行Spark应用

作用

  1. 运行时环境:提供完整的Spark运行时
  2. 分发部署:用于集群部署和分发
  3. 脚本依赖:spark-shell、spark-submit等脚本依赖此目录
1
2
3
4
5
# 运行spark-shell
./bin/spark-shell --version

# 启动Spark Shell
./bin/spark-shell

2.运行spark

先检查一下装备

1
./bin/spark-shell --version
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
WARNING: Using incubator modules: jdk.incubator.vector
Using Spark's default log4j profile: org/apache/spark/log4j2-defaults.properties
25/08/29 14:36:56 WARN Utils: Your hostname, kxrdeMacBook-Pro.local, resolves to a loopback address: 127.0.0.1; using 192.168.231.196 instead (on interface en0)
25/08/29 14:36:56 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 4.0.0
/_/

Using Scala version 2.13.16, OpenJDK 64-Bit Server VM, 17.0.15
Branch HEAD
Compiled by user wenchen on 2025-05-19T07:58:03Z
Revision fa33ea000a0bda9e5a3fa1af98e8e85b8cc5e4d4
Url https://github.com/apache/spark
Type --help for more information.

没问题,开玩!

1
./bin/spark-shell --master 'local[2]'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
WARNING: Using incubator modules: jdk.incubator.vector
Using Spark's default log4j profile: org/apache/spark/log4j2-defaults.properties
25/08/29 14:38:20 WARN Utils: Your hostname, kxrdeMacBook-Pro.local, resolves to a loopback address: 127.0.0.1; using 192.168.231.196 instead (on interface en0)
25/08/29 14:38:20 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address
Using Spark's default log4j profile: org/apache/spark/log4j2-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 4.0.0
/_/

Using Scala version 2.13.16 (OpenJDK 64-Bit Server VM, Java 17.0.15)
Type in expressions to have them evaluated.
Type :help for more information.
25/08/29 14:38:26 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
25/08/29 14:38:26 WARN Utils: Service 'SparkUI' could not bind on port 4040. Attempting port 4041.
Spark context Web UI available at http://192.168.231.196:4041
Spark context available as 'sc' (master = local[2], app id = local-1756449506757).
Spark session available as 'spark'.

scala>

完美!Spark Shell已经成功启动。退出spark shell(control+c)

现在k可以测试一些简单的Spark程序:

1
./bin/run-example SparkPi 10
1
./bin/run-example python/pi.py 10
1
./bin/spark-submit examples/src/main/python/pi.py 10

这些都是官方提供的一些测试示例。

3.如何debug

3.1新增master节点运行配置

新增一个应用程序运行配置,然后编辑如下:

入口类选择:org.apache.spark.deploy.master.Master

-cp选择:spark_core_2.13

注意 修改选项中一定要选择 一个选项:将带有”provided”作用域的依赖项添加到类路径

image-20250831005118672

然后保存就可以用这个配置启动一个master节点了。

image-20250831002742807

如上所示,spark master 节点运行在ip:192.168.100.199,并且webui运行在8080端口。那么就可以访问:

http://192.168.100.199:8080/

image-20250831155028623

3.2 新增work节点运行配置

入口类选择:org.apache.spark.deploy.worker.Worker

-cp选择:spark_core_2.13

程序实参:--webui-port 8081 spark://192.168.100.199:7077

注意 修改选项中一定要选择 一个选项:将带有”provided”作用域的依赖项添加到类路径

image-20250831155218977

这次我们可以加个断点(core/src/main/scala/org/apache/spark/deploy/worker/Worker.scala),可以看下work节点启动过程。

image-20250831155421544

可以看到成功啦!

image-20250831005009815

./sbin/start-master.sh

./sbin/start-worker.sh spark://192.168.100.199:7077

./spark-submit –class org.apache.spark.examples.SparkPi –master spark://kxrdeMacBook-Pro.local:7077 –deploy-mode client –executor-memory 1g –total-executor-cores 4 /Users/kxr/learning/spark/spark/examples/target/original-spark-examples_2.13-4.1.0-SNAPSHOT.jar 100