背景
提供 JDBC 服务,迁移 Hive SQL 。
提供 Ad-Hoc 查询能力。
Spark Thrift Server
Spark Thrift Server 是 Spark 社区基于 HiveServer2 协议实现的 Thrift 服务,提供 Spark SQL JDBC 服务。由于 Spark 进程常驻,提交请求后立即执行计算,响应迅速,可用于 Ad-Hoc 查询。
Spark Thrift Server 架构
Spark Thrift Server 是基于 SparkContext 多线程应用场景的实现。
Spark 中一次 Action 算子对应一个 Job,提交一个 Job 后会等待执行完成,所以在单线程的场景下,Job 是顺序执行的。SparkContext 通过多线程提交 Job 时,不同的 Job 可并发提交执行。
下图是 Spark Thrift Server 的架构。Spark Thrift Server 在启动时初始化一个 SparkContext。接受请求后,会新建或者复用 SparkSession, 并通过 SparkSession.sql() 进行执行,由于处理请求的线程不同,所以 SparkSession.sql() 提交的任务可以并发执行。
优点
- 架构简单,方便部署运维。
- 启动后常驻 Spark 相关服务,响应快。
- 统一服务,隐藏集群配置,方便统一管理和优化。
缺点
- 单用户运行,不支持多用户访问
- 资源不隔离
- 不支持高可用
Kyuubi 0.7.0
Kyuubi 是网易开源的增强版 Spark Thrift Server 实现。支持多租户、资源隔离、高可用等,使得 Spark Thrift Server 服务具有更好的可用性和稳定性。
Kyuubi 0.7.0 架构
Kyuubi 0.7.0 版本,实现用户 Session 级别的 SparkContext 的初始化、注册、缓存、回收机制。
Kyuubi 接收到请求后可根据不同用户创建多个 SparkContext,启动多个 Spark 实例,从而实现多租户和资源隔离。
Kyuubi 0.7.0 高可用
Kyuubi 0.7.0 版本,支持 Load Balance Mode 、Active/Standby Failover 两种模式的高可用,通过 Zookeeper 作服务发现。
Load Balance Mode:负载均衡模式下,所有的 Kyuubi 服务都是活跃状态,这种模式下可以减轻 Kyuubi Server 的负载,提高服务的并发。不过会加大 Yarn 集群的负载,可能导致一个用户连接在不同的 Kyuubi Server 上,启动多个 SparkContext,造成集群资源浪费。
Active/Standby Failover:主备故障切换模式下,只有一个几点是 Active 的状态对外提供服务,当 Active 节点发生故障时,Standby 节点选举成功后变成 Active 状态对外提供服务,从而达到高可用,不过此模式不会加大整体并发能力。
优点
- 支持多租户
- 支持代理用户(hive.server2.proxy.user)
- 支持 Session 级别配置
- Executors 资源隔离
- 支持高可用
缺点
- 只支持 Yarn-Client 模式,共用 Driver 进程,可能成为服务瓶颈
- 高可用模式存在缺陷
Kyuubi 1.3.0
Kyuubi 1.X 版本中,将 Kyuubi Server 和 SparkContext 进行解耦。引入 Spark SQL Engine 进行 SparkContext 初始化和 SQL 执行,在 Kyuubi Server 中通过 spark-submit 命令启动,启动后将自身状态保持在 Zookeeper 中。Kyuubi Server 接收到请求后通过 Zookeeper 寻找可用引擎或启动新引擎进行处理。
Spark SQL Engine 作为独立的 Spark 应用,可以以不同的方式执行,并支持 yarn-cluster 模式。状态持续在 Zookeeper 中,使得 Kyuubi Server 之间可以共用 Engine,提高了 Kyuubi Server 的扩展能力。
优点
- 支持多租户
- 支持资源隔离
- 支持不同级别的引擎共享策略(CONNECTION, USER, SERVER)
- 支持高可用
缺点
- 多一层服务,加大了服务的复杂性
- 增加依赖 Zookeeper,作为服务端和引擎端的服务发现