Apache Kyuubi:靈活運用引擎隔離共享,加速即席查詢,支援大規模 ETL

語言: CN / TW / HK

Kyuubi 簡介

  Apache Kyuubi (Incubating)是一個 Thrift JDBC/ODBC 服務,目前對接了 Apache Spark 計算框架,支援多租戶和分散式等特性,可以滿足企業內諸如 ETL、BI 報表等多種大資料場景的應用。Kyuubi 可以為企業級資料湖探索提供標準化的介面,賦予使用者調動整個資料湖生態的資料的能力,使得使用者能夠像處理普通資料一樣處理大資料。專案已於2021年 6 月 21 號正式進入 Apache 孵化器。從社群當前階段的發展目標來看,它的主要方向是依託本身的架構設計,圍繞各類主流計算框架,打造一個面向 Serverless SQL on Lakehouse 的服務。

專案地址:https://github.com/apache/incubator-kyuubi

前言

    為了能讓 Kyuubi 可以更好的滿足諸如 ETL、BI 報表等多種大資料場景的應用,從 Kyuubi v1.0.0  版本開始,我們引入了 Kyuubi 引擎共享級別這個概念,來對的迭代過程中不斷被優化和完善。

    Kyuubi 引擎的共享級別描述了會話(session)和引擎(engine)之間的對應關係。它決定了一個新的會話是否可以以及如何與其他會話共享一個現有的後臺引擎。會話也被視為來自終端使用者建立的客戶端發起的Thrift JDBC/ODBC連線,而引擎是獨立的分散式應用程式,他它在 Spark SQL、 Flink SQL(開發中,見 https://github.com/apache/incubator-kyuubi/issues/1322 )等計算框架之上實現了所有功能,支援在單節點機器或叢集上執行。

    Kyuubi 的服務端是這個對應關係的描述者。而它本身是一個是水平可擴充套件的服務發現層,支援多個 Kyuubi Server 進行負載均衡(LoadBalance)來提供高可用(HA)、平滑下線等能力。值得注意的是,無論是在HA還是單節點模式下,Kyuubi引擎共享級別的功能都是不受影響的。換句話說,客戶端無論連線到哪個 Kyuubi Server 節點,在共享級別規則生效的前提下,它都能準確的聯絡上對應的引擎。

為什麼我們需要這個功能?

Apache Spark是一個用於大規模資料分析的統一計算框架。在想象駕駛這樣一輛全時驅動的超跑風馳電掣時,我們也要考慮人、車、環境等一系列綜合因素的影響。Kyuubi 在 API 上的易用性設計已經很大程度上降低了使用者使用Spark SQL 來處理資料的准入門檻和難度。而在執行時, Spark 本身的執行效率,也受到各種依賴服務,如 YARN, HDFS, HiveMetastore 等依賴因素的影響。舉例來說,

  • 百公里加速耗時。Spark 程式在啟動時需要和 YARN 和 HDFS 完成大量的準備工作來啟動自己,正常情況下這個階段是非常耗時的,更不用說在一些資源相對緊張的場景下。通過共享複用,可以免去這個耗時。

  • 核載量。Spark 程式主從架構及執行時的資源預設基本可以求匯出其核載量,當實際的承載量超出這個閾值時,應用會變得不穩定。適當的隔離,可以讓應用更加安全。

  • 資源利用率。一個常駐的 Spark 應用的資源管理基本上是由自身去管理的,當客戶端請求頻繁時,可以更高效的複用 Driver/Executor 的資源,反之,資源就閒置了。一個非常駐的 Spark 應用的資源管理基本上是通過YARN/K8S等平臺去管理的,用完了釋放,可以讓別的應用去高效的競爭這些資源。

    通過這個功能, 使用者和叢集管理者可以更加靈活地處理不同的大資料工作負載。

共享級別

    Kyuubi 目前支援下表所示的集中貢獻級別。其中,更好的引擎隔離度使我們的引擎和在其上執行的查詢執行更加穩定。更好的引擎共享性意味著我們更有可能重用一個已經全速運轉的引擎。

CONNECTION

    如上圖所示,在CONNECTION共享級別下,會話和引擎是一對一的關係,每個會話都有一個自己的獨立引擎,其他任何人或連線都無法訪問。在會話中,一個使用者或客戶端可以向相應的引擎傳送多個操作請求,包括元資料呼叫或 SQL 查詢任務。儘管它仍然是一種互動式的形式可以進行Ad hoc 查詢,但這種模式可以提供良好的隔離性使得它也適合批處理作業。當關閉會話時,相應的引擎也會同時關閉,意味著獨佔的資源會全部返還給資源管理器。

USER

     如上圖所示,在 USER 共享級別下,使用者和引擎是一對一的關係,每個使用者都有一個自己的獨立引擎,其他任何人都無法訪問,而來自同一使用者的會話連線則可以複用這個引擎。共享的範疇可以大致概括為 SparkContext 物件和 SharedState 物件。前者包含了 Spark 程式執行所需環境,包括類載入器、全域性的配置(Spark conf/Hadoop conf等)、Driver / Executors 程序。後者包括外接的Catalog、Hive Metastore的客戶端、全域性的檢視管理器等。預設情況下,每個會話依然可以擁有自己執行緒安全的 SparkSession 例項,它包含臨時檢視,SQL配置、UDFs等 SessionState 裡的內容。當然,將 kyuubi.engine.single.spark.session 設定為 true 將使 SparkSession 變成單例,這時候它也會被所有會話共享。

    不同於 CONNECTION 共享級別,在 USER 共享級別下,在當關閉會話時,相應的引擎將不會被關閉。並且,當所有的會話都被關閉時,它仍然有一個存活時間(Time to live, TTL)。在這個TTL內,可以快速建立新的會話,而無需等待引擎啟動,這對 Ad hoc 場景是友好的,特別是對於一些耗時極短的 SQL 而言。

    USER 共享級別目前是 Kyuubi 預設的模式。

GROUP

    如上圖所示,在 GROUP 共享級別下,主使用者組(Primary Group)和引擎是一對一的關係,每個主使用者組都有一個自己的獨立引擎,其他任何使用者組都無法訪問,而屬於同一使用者組的使用者則可以複用這個引擎,達到多人或者團隊共享的目的。我們可以遵循Hadoop GroupsMapping(https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/GroupsMapping.html ),通過配置將使用者對映到一個主使用者組。

   與 USER 共享級別相比,SparkContext、SparkSession 和 TTL 的工作機制基本都是一樣的。值得注意的是,由於單個 Spark 應用全域性的使用者屬性(sparkUser)是唯一的且不變的,所以我們只能拿主使用者組來模擬它。如果你想依靠一些外掛對客戶端使用者進行細粒度的訪問控制,你需要從 SparkContext.getLocalProperty("kyuubi.session.user") 獲取它,並將它傳送給安全服務,比如 Apache Ranger。

    GROUP 共享級別將在 Kyuubi v1.4.0-Incubating 版本釋出。在一些場景下,比如計算資源是稀缺的,而相對而言使用者卻不少,這時候給每個使用者啟動一個引擎,顯然是僧多粥少。不防使用 GROUP 模式,並使用 Spark 提供的  Fair Scheduler Pools 功能(https://spark.apache.org/docs/latest/job-scheduling.html#scheduling-within-an-application) 來進行 App 內的隔離共享,不同的會話可以通過 set spark.scheduler.pool = poolName 來實現一定的隔離能力。

SERVER

     如上圖所示,在 SERVER 共享級別下,架構就比較簡單了。基本上就等同於一個 Spark 社群提供的 ThriftServer,附帶上了高可用特性。

    在安全叢集中,比如開啟了 Kerberos 認證的 Hadoop 叢集,那對終端使用者就必須是擁有 Service Principal/Keytab 的管理員,才能使用這個模式了。

Subdomain

    引擎共享子域(kyuubi.engine.share.level.subdomain)是對引擎共享級別的補充。在滿足租戶隔離不被破壞的前提下,讓 USER、GROUP 或 SERVER 共享級別也能夠為一個使用者、組或伺服器(叢集)建立多個引擎。

   例如,在USER共享級別,你可以使用kyuubi.engine.share.level.subdomain=sd1kyuubi.engine.share.level.subdomain=sd2 來為使用者 Tom 建立兩個獨立的引擎,而 Tom 的其他會話可以分別指定這兩個鍵值對來選擇對應子域的引擎複用。

    kyuubi.engine.share.level.subdomain 應配置在 JDBC 連線 URL 中,以告訴Kyuubi Server 你想使用哪個引擎。

混合使用

    所有支援的共享級別都可以同時在一個 Kyuubi Server 或叢集中一起使用。

相關配置項

https://github.com/apache/incubator-kyuubi/blob/master/docs/deployment/engine_share_level.md#related-configurations

結論

    用純 SQL 的方式去描述傳統大資料數倉或者是 Lakehouse 上的各種工作負載、最大化計算資源的效能,並滿足企業服務等級協議(SLA)的要求,並不是一件容易的事情。在 Kyuubi 中我們引入了 Kyuubi 引擎共享級別來適配不同場景的訴求。同時,這個功能可以配合 Apache Spark 提供的動態資源分配、推斷執行、Adaptive Query Execution等高階功能共同強化使用者大規模 ETL 任務及 Ad hoc 查詢的自動化能力,為使用者帶來 Serverless SQL on Lakehouse 的能力。

作者:Kent Yao,網易數帆技術專家,Apache Kyuubi(Incubating) PPMC