Spark Connect 是什么?和传统的 Driver 模式有什么区别?

第 1097 题 约 3 分钟读完

本文目录
  1. 面试怎么回答
  2. 传统模式的问题:用户代码和 Driver 绑在一起
  3. Spark Connect 怎么做:客户端和服务端分开
  4. 带来的好处
  5. 限制要心里有数

面试怎么回答

传统模式下用户代码就跑在 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」拆开了:

  1. 客户端只是一个很轻的库,你写的 DataFrame 操作不会在本地执行,而是变成未解析的逻辑计划;
  2. 逻辑计划用 Protobuf 编码,通过 gRPC 发给服务端(Spark Connect Server,默认端口 15002);
  3. 服务端负责解析、优化、执行,再把结果用 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 对象)不支持;
  • 多了一跳网络,大结果回传要控制好数据量。