网易在Spark多租户方面的工作,这个项目叫做Kyuubi(该项目的开源地址: https://github.com/netease-bigdata/kyuubi https://github.com/yaooqinn/kyuubi),实际上是类似于HiveSever2的程序。
大家可能都知道,Hive一般有两种使用模式,一种是client模式,所有的SQL解析都客户端在这之中完成。一种是HiveSever2模式,整个SQL解析放到server端完成。
在集团内部实际使用过程中,更希望用户的使用行为通过Server端完成,否则会很难管理,因为客户端根本不在平台掌控范围之内,我们很难进行各种升级及配置变化。只有当MetaStore和HDFS 配置不暴露给用户,我们才能更好得管控。Hive的社区比较完善,在这方面没有问题,但是Spark还有些不足。
其实,所谓的Kyuubi只是在类似HiveSever2的基础上提供服务, 提供SparkSQL服务,而不是Hive SQL服务。
Kyuubi基于Spark Thrift Sever
改造,Spark Thrift Sever
类似于HiveSever2
,但是它不够完善。由于我们在此基础上增加了多租户的功能,因此可以支持集团内部各业务线的使用。
要想实现多租户功能,首先要把SparkContext变成多实例,之后每次执行代理真正的用户身份执行;其次,我们提供了Spark SQL集群,用户请求负载均衡到每台Kyuubi服务器,并且这部分是高可用的,一台服务器挂了会立刻切换到另一台。
此外,我们对安全性也进行了改进,支持kerbros。其实,整个网易数据平台都是强安全认证系统,每个用户都有自己的kerberos key tabkerbros,所有系统拿kerberoskerbros做认证访问都是带认证的,Kyuubi要融入这个体系同样需要支持kerberoskerbros。
Kyuubi的主要特点如下: 一、具备统一接口,与HiveSever2相比,Kyuubi提供SwiftThrift的API,无论是Beeline客户端、JDBC客户端、ODBC客户端还是网易猛犸自助分析查询平台、有数可视化BI平台,Kyuubi都可以用标准的方式连接到Spark。
二、有弹性的资源控制能力,Kyuubi支持session级别的资源配置,每个session所需的队列、资源核数和内存都可以进行配置。
三、支持SparkContext的动态缓存。创建一个SparkContext耗时较长,所以我们要对SparkContext进行缓存设置,让用户不需要每次查询都动态创建SparkContext。
此外,也支持Spark动态资源分配特性,启用SparkContext需要启用一堆Spark执行器。如果业务需要较快的响应速度,那就直接发SQL,不需要等待进程启用。
四、Kyuubi安全特性,首先是支持Kerberos还有代理执行,最后支持集成我们的spark-authorizer权限验证插件,该插件对Spark没有侵入性,主要用于查询优化的最后阶段。实际上,具体权限对接的是rRangerr中的权限控制中心,通过集成Spark-authorizer,我们能够做到细粒度的权限控制。
此外,我们也支持服务的高可用和负载均衡,Kyuubi基于负载均衡的方式设计,通过将ZK作为Namespace来实现。具体过程为,Kyuubi将自己注册到ZK,ZK形成服务列表,注明各服务的存活状态,客户端会与ZK通讯拿到该服务器列表,从中挑选Kyuubi服务器执行。通过这种方式,我们将负载均衡到众多Spark查询设备上,从而避免了单点故障,保证了服务的可用性。
Kyuubi以HiveServer2 Thrift API
为接口协议,提供Spark SQL服务。相比传统的Spark,Kyuubi主要增加了企业级特性,如果公司多租户场景较多且业务线复杂,多租户功能是比较要紧的事情比如多租户、权限、负载均衡等。