Kyuubi 是什么?多租户的 Spark SQL 网关怎么设计?
面试怎么回答
Spark Thrift Server 是一个长期运行的 Spark 应用,所有人的 SQL 都在里面跑,一个大查询打挂 Driver 大家一起断,所有作业用同一个身份访问数据,资源和配置也没法按人分。Kyuubi 分成 Server 和 Engine 两层:Server 提供兼容 HiveServer2 的 JDBC 接口,只做认证、会话管理和路由;Engine 是按需拉起的独立 Spark 应用,以真实用户身份提交。通过共享级别控制隔离粒度,CONNECTION、USER、GROUP、SERVER 从强隔离到强共享,引擎空闲会自动释放,Server 用 ZooKeeper 做高可用。多租户设计上,按共享级别隔离 Driver,引擎用真实身份配合 Ranger 做细粒度权限,不同团队用不同队列和资源上限,用引擎预热降低首查延迟,在 Server 层统一做审计和大结果限制。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
很多公司的分析师、BI 工具、数据平台都要通过 JDBC 跑 Spark SQL。最早大家用 Spark Thrift Server,用着用着就出问题了。Apache Kyuubi(网易开源,2022 年成为 Apache 顶级项目)就是为了解决这些问题出现的。面试官问这题,想看你懂不懂多租户 SQL 服务的隔离和资源设计。
Spark Thrift Server 的问题
Spark Thrift Server 本质上是一个长期运行的 Spark 应用,所有用户的 SQL 都在里面跑:
- 没有隔离:一个人跑了个大查询把 Driver 打挂,所有人的会话一起断;
- 身份单一:作业都以启动 Thrift Server 的那个用户身份访问 HDFS / Hive,权限和审计都做不细;
- 资源不好分:所有人共用同一组 Executor,没法按团队分队列、分配额;
- 配置固定:所有人只能用同一套 Spark 配置,想单独调参数很难。
Kyuubi 的架构
Kyuubi 分成两层:
- Kyuubi Server:对外提供兼容 HiveServer2 的 JDBC / Thrift 接口(也支持 REST),负责认证、会话管理和路由,本身不执行 SQL;
- Engine:真正执行 SQL 的计算引擎,通常是一个独立的 Spark 应用,按需拉起,以真实用户的身份提交到 YARN 或 K8s。
关键设计是引擎共享级别(Share Level):
CONNECTION:每个连接一个引擎,隔离最好,启动开销最大,适合大的 ETL 任务;USER:同一个用户共享一个引擎(默认),兼顾隔离和启动速度;GROUP:同一个组共享,适合团队共用资源;SERVER:所有人共享一个引擎,类似 Thrift Server。
引擎空闲超过一定时间会自动释放,下次连接再拉起;Server 通过 ZooKeeper 做服务发现和高可用。
多租户设计要考虑什么
- 隔离:按共享级别隔离 Driver,一个用户的问题不影响别人;
- 身份和权限:引擎以真实用户身份运行,配合 Ranger 插件做到库表、列级权限和行过滤、脱敏;
- 资源:不同用户 / 团队的引擎提交到不同队列,单独设置 Executor 数、内存上限,开动态资源分配;
- 体验:引擎启动要几十秒,可以用引擎池、预热、延长空闲时间来降低首次查询延迟;
- 治理:在 Server 层统一做 SQL 审计、慢查询记录、大结果集限制。
不只是 Spark
Kyuubi 的引擎还支持 Flink SQL、Trino、Hive 等,可以作为统一的 SQL 入口,但实际用得最多、最成熟的还是 Spark。