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項目做爲機器學習平臺。