Spark Inspector 完全教程:从入门到精通
什么是 Spark Inspector?
Spark Inspector 是一个基于 Web UI 的交互式调试工具,它极大地增强了 Apache Spark 原生 UI 的功能,当你编写复杂的 Spark 作业(尤其是使用 DataFrame/Dataset API)时,原生 UI 虽然能看到每个 Stage 的执行情况,但对于理解数据在各个 Transformation 操作(如 select, filter, groupBy)中具体是如何变化的,却非常困难。

核心痛点:
假设你有一个长长的链式调用:
df.select(...).filter(...).groupBy(...).agg(...)
在原生 UI 中,你只能看到最终 Stage 的输入和输出数据量,但完全不知道中间每一步操作是如何影响数据的(filter 到底过滤掉了多少行?groupBy 生成了多少个 Key?)。
Spark Inspector 的解决方案: 它通过分析 Spark 的逻辑计划,让你可以“钻取”到每个 Transformation 的中间结果,直接查看该步骤执行后的数据样例、行数、Schema 等信息,这就像给你的 Spark 作业装上了“X光眼镜”,让你能看清数据流转的每一个细节。
为什么需要使用 Spark Inspector?
- 快速定位数据倾斜: 立即看到
groupBy或join操作后,每个 Key 的数据量分布,轻松发现倾斜的 Key。 - 验证数据清洗逻辑: 在复杂的
withColumn和filter链中,快速检查每一步是否按预期过滤或转换了数据。 - 理解执行计划: 可视化地查看 Spark 的逻辑计划(Logical Plan)和优化后的物理计划(Physical Plan),帮助你写出更高性能的代码。
- 调试复杂计算: 当
agg或UDF的结果不符合预期时,可以查看其输入数据,快速定位问题。 - 提升开发效率: 无需在每个
transform后都手动write一个临时文件来检查数据,节省大量时间。
如何安装和启动 Spark Inspector?
Spark Inspector 是一个独立的 Web 应用,它通过连接到你正在运行的 Spark 应用程序的 UI 来工作。
1 前提条件
- 正在运行的 Spark 应用: 你必须有一个正在运行的 Spark 作业,并且知道它的 Spark UI 地址(通常是
http://<driver-node>:4040)。 - 现代浏览器: Chrome, Firefox, Edge 等。
2 启动 Spark Inspector
最简单的方式是使用 Docker,如果你没有 Docker,也可以从其 GitHub Releases 页面下载预编译的 JAR 文件手动运行。

使用 Docker (推荐):
# 拉取镜像 docker pull sparkinspector/spark-inspector:latest # 运行容器 # 将你的 Spark UI 端口(4040)映射到主机的任意端口(18080) docker run -d -p 18080:4040 sparkinspector/spark-inspector:latest
启动后,在浏览器中访问 http://localhost:18080,你将看到 Spark Inspector 的主界面。
3 连接到你的 Spark 应用
- 在 Spark Inspector 的主界面,你会看到一个输入框,提示你输入 Spark UI 的 URL。
- 将你的 Spark Driver UI 地址(
http://spark-driver-node:4040)粘贴进去。 - 点击 "Connect" 按钮。
如果连接成功,Spark Inspector 会自动加载你当前正在运行的 Spark 应用,并列出其所有 Jobs 和 Stages,现在你就可以开始探索了!
核心功能与实战演练
假设我们有一个 Spark 作业,它读取一个用户行为日志文件,进行一系列处理。

示例代码逻辑:
# 1. 读取原始数据
df = spark.read.text("path/to/user_logs.txt")
# 2. 解析日志行 (假设日志格式为 "timestamp,userId,action")
from pyspark.sql.functions import split
parsed_df = df.withColumn("parts", split(df.value, ",")) \
.withColumn("timestamp", col("parts").getItem(0)) \
.withColumn("userId", col("parts").getItem(1).cast("long")) \
.withColumn("action", col("parts").getItem(2)) \
.drop("parts", "value")
# 3. 过滤掉无效用户
valid_users_df = parsed_df.filter(col("userId").isNotNull())
# 4. 统计每个用户的点击次数
click_action_df = valid_users_df.filter(col("action") == "click")
user_click_counts = click_action_df.groupBy("userId").count()
# 5. 找出点击次数最多的前10个用户
top_users = user_click_counts.orderBy(col("count").desc()).limit(10)
top_users.show()
我们用 Spark Inspector 来调试这个流程。
1 可视化逻辑计划
在 Spark Inspector 的左侧面板,你会看到一个类似数据库 ER 图的可视化逻辑计划。
- 节点: 代表一个 DataFrame 或一个 Transformation 操作。
- 连线: 代表数据流。
- 点击节点: 点击任何一个节点(
filter@...),右侧面板会立即显示该操作执行后的结果。
2 钻取中间结果
这是 Spark Inspector 最核心的功能。
-
检查
parsed_df:- 在逻辑计划中找到
parsed_df对应的节点。 - 点击它,右侧会显示:
- Schema:
timestamp: string, userId: long, action: string。 - 行数: 显示该 DataFrame 的总行数。
- 数据样本: 一个可滚动的表格,展示几行实际数据,你可以立即看到解析是否正确。
- Schema:
- 在逻辑计划中找到
-
验证
filter操作:- 找到
filter@...节点(对应valid_users_df)。 - 点击它,右侧面板会显示过滤后的结果。
- 关键信息:
- 输入行数:
parsed_df的总行数。 - 输出行数:
valid_users_df的总行数。 - 过滤掉的行数:
输入行数 - 输出行数。 - 数据样本: 你可以立即看到
userId为null的行是否真的被过滤掉了。
- 输入行数:
- 找到
-
分析
groupBy(数据倾斜检测):- 找到
groupBy@...节点(对应user_click_counts)。 - 点击它,右侧面板会显示聚合后的结果。
- 关键信息:
- Key 分布图: Spark Inspector 会绘制一个图表,展示每个
userId对应的count值,如果某个 Key 的柱子特别高,恭喜你,你找到了数据倾斜的源头! - 统计信息: 平均值、最大值、最小值等,让你对数据分布有宏观了解。
- 数据样本: 你可以看到哪些用户的点击次数最多。
- Key 分布图: Spark Inspector 会绘制一个图表,展示每个
- 找到
通过这个简单的“点击-查看”过程,你无需任何 print 或 write 操作,就完全掌握了数据在每一步的变化。
3 查看详细指标
对于每个被点击的节点,Spark Inspector 还提供了丰富的指标信息,帮助你进行性能分析:
- Metrics: 包括该 Stage 的执行时间、Shuffle Read/Write 数据量、任务数等。
- Data Size: 清晰地展示输入和输出的数据大小(以 MB/GB 为单位)。
- Duration: 显示该操作(或其所在的 Stage)的耗时。
最佳实践与技巧
- 尽早连接: 最好在 Spark 作业运行到感兴趣的阶段时再连接 Spark Inspector,这样可以获取到实时的数据信息。
- 结合原生 UI: Spark Inspector 是对原生 Spark UI 的增强,而不是替代,当需要查看任务级别的详细日志、GC 情况时,仍然需要回到原生的 UI。
- 专注关键节点: 不需要检查每一个微小的转换,重点关注
filter,join,groupBy,orderBy等可能改变数据分布或计算成本的节点。 - 团队共享: 将 Spark Inspector 的连接 URL 分享给团队成员,可以方便地共同分析和调试复杂的 Spark 作业。
Spark Inspector 是 Spark 开发者,特别是数据工程师和科学家的必备神器,它将枯燥的日志和指标转化为直观、可交互的数据视图,极大地降低了 Spark 作业的调试门槛。
记住这个工作流: 编写代码 -> 运行作业 -> 连接 Spark Inspector -> 点击逻辑计划中的节点 -> 分析中间结果 -> 定位问题 -> 回到代码修改 -> 重新运行。
掌握了 Spark Inspector,你的 Spark 开发调试效率将得到质的飞跃。
官方资源:
- GitHub 仓库: https://github.com/sparkutils/spark-inspector (这里有最新的安装说明和功能介绍)
