Spark Connect 是什么?和传统的 Driver 模式有什么区别?
面试怎么回答
传统模式下用户代码就跑在 Driver 里,一个人 collect 大结果就能把 Driver 打挂、影响同一应用的其他会话,客户端还要装和集群一致的 Spark 版本。Spark Connect 把客户端和 Driver 拆开:客户端只把 DataFrame 操作变成未解析的逻辑计划,用 Protobuf 编码、通过 gRPC 发给服务端,服务端解析优化执行后用 Arrow 把结果传回来。好处是故障隔离、客户端轻量、升级解耦、多语言和远程接入方便。限制是不支持 RDD 和 SparkContext,只能用 DataFrame 和 SQL,老代码迁移前要先改掉 RDD 写法。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
Spark 3.4 引入了 Spark Connect,Spark 4.0 把它做得更完整。面试官问这个,一是看你跟没跟上 Spark 的新变化,二是看你理不理解 Driver 的职责。
传统模式的问题:用户代码和 Driver 绑在一起
传统的 Spark 应用里,你写的程序本身就运行在 Driver 进程里:
- 一个人的代码能拖垮整个 Driver:在 Notebook 里
collect()一个大结果,Driver OOM,同一个 Spark 应用里其他人的会话也跟着挂。 - 客户端很重:本地要装和集群版本一致的 Spark、Java、一堆依赖,版本一升级,所有客户端都要跟着升。
- 远程连接不方便:想在 IDE、Web 应用里直接连集群跑查询,基本做不到,只能打包提交。
Spark Connect 怎么做:客户端和服务端分开
Spark Connect 把「写 DataFrame 的客户端」和「真正执行的 Driver」拆开了:
- 客户端只是一个很轻的库,你写的 DataFrame 操作不会在本地执行,而是变成未解析的逻辑计划;
- 逻辑计划用 Protobuf 编码,通过 gRPC 发给服务端(Spark Connect Server,默认端口 15002);
- 服务端负责解析、优化、执行,再把结果用 Arrow 格式分批传回客户端。
连接方式也很简单:SparkSession.builder.remote("sc://host:15002").getOrCreate()。
带来的好处
- 隔离更好:客户端出问题只影响自己,不会把服务端的 Driver 打挂;
- 升级更容易:服务端升级 Spark,客户端只要协议兼容就不用跟着动;
- 多语言、轻量接入:Python 有单独的轻量客户端包,社区还有 Go、Rust 等客户端,IDE、Notebook、Web 服务都能直接连。
限制要心里有数
- RDD API 和 SparkContext 用不了,只支持 DataFrame / SQL 这一层;老代码里有
sc.parallelize、rdd.map的要先改写; - 部分依赖 Driver 本地状态的用法(比如某些自定义的 Listener、直接操作 JVM 对象)不支持;
- 多了一跳网络,大结果回传要控制好数据量。