Kyuubi 是对spark thrift server的加强版,它弥补了spark thrift server缺少的多租户,授权,负载均衡,高可用特性。

kyuubi spark kyuubi spark-sql yarn队列状态_spark

统一接口

Kyuubi使用的协议与HiveServer保持一致,因此它能够支持所有的JDBC/ODBC客户端,用户应用程序也可以根据上图的thrift API写。用户可以用多种类型的客户端连接kyuubi服务,每个连接都绑定了一个sparkSession实例,sparkSession中包含了HiveMetaStoreClient,它能够与hive MetaStore Server交互。

运行时资源弹性

在启动期间,Kyuubi不会占用集群管理器(Yarn)的任何资源,如果没有与SparkContext交互的活动会话,Kyuubi会将所有资源返回给Yarn。此外,它还支持Spark动态资源分配,允许我们在SparkContext中动态分配资源。

Kyuubi动态SparkContext缓存

Kyuubi实现了一个SparkSessionCacheManager来控制SparkSession/SparkContext的实例化、注册、缓存、重用和回收。不同的用户在第一次连接到服务器后,在Kyuubi服务器中只有一个SparkContext实例,它将在整个连接生命周期和所有连接关闭后的一段时间内缓存在SparkSessionCacheManager中。这样SparkContext就会有多个实例,每个用户使用属于自己的实例,每个SparkContext占用yarn上部分资源,这就实现了多租户的功能。

kyuubi spark kyuubi spark-sql yarn队列状态_客户端_02

所有属于同一用户的连接共享这个SparkContext来生成它们自己的SparkSession。

spark动态资源分配

Spark提供了一种机制,可以根据工作负载动态调整应用程序占用的资源。这意味着,如果不再使用资源,您的应用程序可能会将它们返回给集群,并在以后需要时再次请求它们。如果多个应用程序共享Spark集群中的资源,该特性尤其有用。

安全

kyuubi支持Kerberos认证,并且支持集成spark-authorizer权限验证插件,该插件对Spark没有侵入性,主要用于查询优化的最后阶段。实际上,具体权限对接的是Ranger中的权限控制中心,通过集成Spark-authorizer,能够做到细粒度的权限控制。

kyuubi spark kyuubi spark-sql yarn队列状态_spark_03

高可用

kyuubi spark kyuubi spark-sql yarn队列状态_kyuubi_04

当配置spark.kyuubi.ha.enabled=true时,多个Kyuubi服务器实例可以向ZooKeeper注册。然后客户端可以通过ZooKeeper找到一个Kyuubi服务器。当一个客户端请求一个服务器实例时,ZooKeeper会随机返回一个选中的注册实例。这个特性提供了:
 高可用性
 负载均衡
 滚动升级

内部结构

kyuubi spark kyuubi spark-sql yarn队列状态_客户端_05


FrontendService负责维护与客户端的连接,与客户端进行交互,将客户端的SQL请求转发至BackendService;BackendService负责执行Spark SQL并将执行结果返回给FrontendService。FrontendService最后将结果返回至客户端。

SparkSessionCacheManager 负责管理SparkSession,OperationManager负责管理KyuubiOperation。客户端提交上来的请求转化为KyuubiOperation。通过KyuubiSession获取到sparkSession,将请求提交到spark sql执行。

总结

Kyuubi以HiveServer2 Thrift API为接口协议,提供Spark SQL服务。相比传统的Spark,Kyuubi主要增加多租户、权限、负载均衡等功能。