Kyuubi是网易数帆旗下易数大数据团队开源的一个高性能的通用JDBC和SQL执行引擎,创建在Apache Spark之上。经过Kyuubi,用户可以像处理普通数据同样处理大数据。本文将详细解读Kyuubi的架构设计。html
引言
开源大数据项目的繁荣带来了强大的大数据平台,而对于负责数据价值挖掘的终端用户而言,平台的技术门槛是另外一种挑战。若是能将平台的能力统合,并不断地优化和迭代,让用户可以经过JDBC和SQL这种最广泛最通用的技术来使用,数据生产力将能够获得进一步的提高。git
Kyuubi就是在此背景下诞生的一个高性能的通用JDBC和SQL执行引擎,它的目标是促进用户像处理普通数据同样处理大数据。github
Kyuubi提供了一个标准化的JDBC接口,在大数据场景下能够方便地进行数据访问。终端用户能够专一于开发本身的业务系统和挖掘数据价值,而无需了解底层的大数据平台(计算引擎、存储服务、元数据管理等)。数据库
Kyuubi依赖Apache Spark提供高性能的数据查询能力,引擎能力的每一次提高,都能帮助Kyuubi的性能实现质的飞跃。此外,Kyuubi经过引擎缓存提高了ad-hoc响应能力,并经过横向扩展和负载均衡提高了并发能力。apache
Kyuubi提供完整的认证和受权服务,确保数据和元数据的安全。缓存
Kyuubi提供强大的高可用性和负载均衡,以保证SLA的承诺。安全
Kyuubi提供两级弹性资源管理架构,有效提升资源利用率,同时覆盖全部场景的性能和响应需求,包括交互式,或批处理和点查询,或全表扫描。服务器
Kyuubi拥抱Spark,并在Spark之上构建了一个生态系统,这它使得可以快速扩展示有的生态系统,并引入新的特性,例如云原生支持和Data Lake/Lake House
支持。session
Kyuubi的愿景是创建在Apache Spark和Data Lake技术之上,统一门户,成为一个理想的数据湖管理平台。它能够以纯SQL的方式支持数据处理(如ETL)和分析(如BI)。全部的工做负载均可以在同一个平台上完成,使用一份数据,一个SQL接口。架构
架构概述
Kyuubi系统的基本技术架构以下图所示。
图的中间部分是Kyuubi服务端的主要部分,它处理来自图像左边所示的客户端的链接和执行请求。在Kyuubi中,这些链接请求被维护为Kyuubi Session
,执行请求被维护为Kyuubi Operation
,并与相应的session进行绑定。
Kyuubi Session
的建立能够分为两种状况:轻量级和重量级。大多数session的建立都是轻量级的,用户无感知。惟一重量级的状况是在用户的共享域中没有实例化或缓存SparkContext
,这种状况一般发生在用户第一次链接或长时间没有链接的时候。这种一次性成本的session维护模式能够知足大部分的ad-hoc快速响应需求。
Kyuubi以松耦合的方式维护与SparkConext
的链接。这些SparkContexts
能够是本服务实例在客户端部署模式下在本地建立的Spark程序,也能够是集群部署模式下在Yarn或Kubernetes集群中建立的。在高可用模式下,这些SparkConext
也能够由其余机器上的Kyuubi实例建立,而后由这个实例共享。
这些SparkConext
实例本质上是由Kyuubi服务托管的远程查询执行引擎程序。这些程序在Spark SQL上实现,并对SQL语句进行端到端编译、优化和执行,以及与元数据(如Hive Metastore)和存储(如HDFS)服务进行必要的交互,最大限度地发挥Spark SQL的威力。它们能够自行管理本身的生命周期,自行缓存和回收,而且不受Kyuubi服务器上故障转移的影响。
接下来,咱们来分享一下Kyuubi的一些关键设计理念。
统一接口
Kyuubi实现了Hive Service RPC模块,它提供了与HiveServer2和Spark Thrift Server相同的数据访问方式。在客户端,您能够构建奇妙的业务报表、BI应用,甚至ETL工做,只经过Hive JDBC模块。
您只须要熟悉结构化查询语言(SQL)和Java数据库链接(JDBC)就能够处理海量数据。它能够帮助您专一于业务系统的设计和实现。
-
SQL是访问关系型数据库的标准语言,在大数据生态中也很是流行。
-
JDBC为工具/数据库开发者提供了一个标准的API,使得使用纯Java API编写数据库应用成为可能。
-
目前有不少免费或商业的JDBC工具。
运行时资源弹性
Kyuubi和Spark Thrift Server(STS)最大的区别在于,STS是一个单一的Spark应用。例如,若是一个应用运行在Apache Hadoop Yarn集群上,这个应用也是一个单一的Yarn应用,建立后只能存在于Yarn集群的特定固定队列中。Kyuubi支持提交多个Spark应用。
对于资源管理,Yarn失去了资源管理器的角色,没有起到相应的资源隔离和共享的做用。当来自客户端的用户拥有不一样的资源队列权限时,这种状况下STS将没法处理。
对于数据访问,单个Spark应用在全球范围内只有一个用户,也就是sparkUser
,咱们必须赋予它一个相似超级用户的角色,才能让它对不一样的客户端用户进行数据访问,这在生产环境中是一种极不安全的作法。
Kyuubi会根据客户端的链接请求建立不一样的Spark应用,这些应用能够放在不一样的共享域中,供其余链接请求共享。
Kyuubi在启动过程当中不会占用集群管理器(如Yarn)的任何资源,若是没有任何活跃的session与SparkContext
交互,Kyuubi会将全部资源返还。
Spark还提供了动态资源分配,根据工做负载动态调整应用程序占用的资源。这意味着应用能够将再也不使用的资源还给集群,当有需求时再次请求。若是多个应用程序在您的Spark集群中共享资源,这个特性特别有用。
经过这些特性,Kyuubi提供了一个两级弹性资源管理架构,以有效提升资源利用率。
好比说,
./beeline - u 'jdbc:hive2://kyuubi.org:10009/; \ hive.server2.proxy.user=tom# \ spark.yarn.queue=thequeue; \ spark.dynamicAllocation.enabled=true \ spark.dynamicAllocation.maxExecutors=500 \ spark.shuffle.service.enabled=true \ spark.executor.cores=3; \ spark.executor.memory=10g'
若是名为tom
的用户打开了像上面这样的链接,Kyuubi将尝试在Yarn集群中名为thequeue
的队列中建立一个拥有[3,500]个执行器(3核,每一个10g mem)的Spark SQL引擎应用程序。
一方面,因为tom启用了Spark的动态资源请求特性,Spark会根据SQL操做的规模和队列中的可用资源,高效地请求和回收程序内的执行器。另外一方面,当Kyuubi发现程序闲置时间过长时,也会对程序自己进行回收。
高可用性与负载均衡
对于企业服务来讲,服务水平协议(SLA)的承诺必须达到很高的水平。而并发量也须要足够强大,以支持整个企业的请求。Spark Thrift Server做为单一的Spark应用,在没有实现High Availability的状况下,很难知足SLA和并发的要求。当有大的查询请求时,在元数据服务访问、Spark Driver的调度和内存压力,或者是应用的总体计算资源限制等方面都有潜在的瓶颈。
Kyuubi基于ZooKeeper同时提供了高可用和负载均衡解决方案,以下图所示。
咱们从上到下进行分解。
-
图中最上面的是客户端层,客户端能够从服务发现层的命名空间中找到多个注册的Kyuubi实例(k.i.),而后选择一个链接。注册到同一命名空间的Kyuubi实例相互提供了负载均衡的能力。
-
被选中的Kyuubi实例将从服务发现层的eng-namespace中选择一个可用的引擎实例(e.i.)创建链接。若是没有找到可用的实例,它将建立一个新的实例,等待引擎完成注册,而后继续链接。
-
若是是同一我的请求新的链接,则会将链接设置为同一个或另外一个Kyuubi实例,但引擎实例会被重复使用。
-
对于来自不一样用户的链接,将重复步骤2和3。这是由于在服务发现层中,用于存储引擎实例地址的命名空间是基于用户隔离的(默认状况下),不一样用户不能跨命名空间访问其余实例。
认证与受权
在一个安全的集群中,服务应该可以识别和认证呼叫者。因为用户声称的事实并不意味着这必定是真的。Kyuubi的认证过程用于验证客户端用来与Kyuubi服务器对话的用户身份。一旦完成,若是成功,客户端和服务器之间将创建一个可信的链接;不然拒绝。
通过验证的客户端用户也将是建立关联引擎实例的用户,而后能够应用数据库对象或存储的受权。咱们还建立了一个Submarine: Spark Security做为外部插件,实现基于SQL标准的细粒度受权。
结论
Kyuubi是一个统一的多租户JDBC接口,用于大规模数据处理和分析,创建在Apache Spark之上。它扩展了Spark Thrift Server在企业应用中的场景,其中最重要的是多租户支持。
除了网易集团业务,目前已有网约车、餐饮零售、物流等领域多家企业在其大数据技术栈中采用了Kyuubi。欢迎你们加入到Kyuubi项目,共促大数据价值最大化!
做者简介: 燕青,网易数帆-易数事业部高级工程师,主要专一于开源大数据领域,是Apache Spark贡献者,主要贡献于SQL/Core模块。他也是Kyuubi项目和spark-authorizer项目的发起人,后者经过Apache Ranger解决Apache Spark的安全问题。他也是Apache Submarine Committer,致力于改进Submarine项目做为机器学习平台。