T3出行是一家基于車聯網驅動的智慧出行平台,擁有海量且豐富的資料源。因為車聯網資料的多樣性,T3出行建構了以 Apache Hudi 為基礎的企業級資料湖,提供強有力的業務支撐。而對于負責資料價值挖掘的終端使用者而言,平台的技術門檻是另一種挑戰。如果能将平台的能力統合,并不斷地優化和疊代,讓使用者能夠通過 JDBC 和 SQL 這種最普遍最通用的技術來使用,資料生産力将可以得到進一步的提升。
支撐了80%的離線作業,日作業量在1W+
大多數場景比 Hive 性能提升了3-6倍
多租戶、并發的場景更加高效穩定
T3出行選擇了基于網易數帆主導開源的 Apache Kyuubi(以下簡稱Kyuubi)來搭建這樣的能力。在2021 中國開源年會(COSCon'21)上,T3出行進階大資料工程師李心恺詳細解讀了選擇 Kyuubi 的原因,以及基于 Kyuubi 的深度實踐和實作的價值。

T3出行整個資料湖體系,由資料存儲與計算、資料查詢與分析和應用服務層組成。其中資料計算分為離線和實時。
資料存儲
OBS 對象存儲,格式化資料存儲格式以 Hudi 格式為主。
資料計算
離線資料處理:利用 Hive on Spark 批處理能力,在 Apache Dolphin Scheduler 上定時排程,承擔所有的離線數倉的 ETL 和資料模型加工的工作。
實時資料處理:建設了以 Apache Flink 引擎為基礎的開發平台,開發部署實時作業。
資料查詢與分析
OLAP 層主要為面向管理和營運人員的報表,對接報表平台,查詢要求低延遲時間響應,需求多變快速響應。面向資料分析師的即席查詢,更是要求 OLAP 引擎能支援複雜 SQL 處理、從海量資料中快速甄選資料的能力。
應用服務層
資料應用層主要對接各個業務系統。離線 ETL 後的資料寫入不同業務不同資料庫中,面向下遊提供服務。
跨存儲
資料分布在 Hudi、ClickHouse、MongoDB 等不同存儲,需要寫代碼關聯分析增加資料處理門檻和成本。
SQL不統一
Hive 不支援通過 upsert、update、delete 等文法操作 Hudi 表,同時 MongoDB、ClickHouse 等文法又各不相同,開發轉換成本較高。
資源管控乏力
Hive on Spark、Spark ThriftServer 沒有較好的資源隔離方案,無法根據租戶權限做并發控制。
Apache Kyuubi 是一個 Thrift JDBC/ODBC 服務,對接了 Spark 引擎,支援多租戶和分布式的特性,可以滿足企業内諸如 ETL、BI 報表等多種大資料場景的應用。Kyuubi 可以為企業級資料湖探索提供标準化的接口,賦予使用者調動整個資料湖生态的資料的能力,使得使用者能夠像處理普通資料一樣處理大資料。項目已于2021年 6 月 21 号正式進入 Apache 孵化器。于T3出行而言,Kyuubi 的角色是一個面向 Serverless SQL on Lakehouse 的服務。
Apache Kyuubi 架構
HiveServer 是一個廣泛應用的大資料元件。因傳統的 MR 引擎處理效率已經較為落後,Hive 引擎替換為了 Spark,但是為了和原本的 MR 及 TEZ 引擎共存,Hive 保留了自己的優化器,這使得Hive Parse 性能在大多數場景下都落後于 Spark Parse。
STS(Spark Thrift Server)支援HiveServer 的接口和協定,允許使用者直接使用 Hive 接口送出 SQL 作業。但是 STS 不支援多租戶,同時所有 Spark SQL 查詢都走唯一一個 Spark Thrift 節點上的同一個 Spark Driver,并發過高,并且任何故障都會導緻這個唯一的 Spark Thrift 節點上的所有作業失敗,進而需要重新開機 Spark Thrift Server,存在單點問題。
對比 Apache Kyuubi 和 Hive、STS,我們發現,Kyuubi 在租戶控制,任務資源隔離,引擎更新對接,性能等方面擁有諸多優勢。詳情見下圖。
Apache Kyuubi 優勢
Hue 整合 Kyuubi,替代 Hive 為分析師和大資料開發提供服務。
我們在 hue_safety_valve.ini 配置檔案中,增加如下配置:
然後重新開機 Hue 即可。
DS 配置 Kyuubi 資料源,進行離線 ETL 作業。因為 Kyuubi Server 的接口、協定都和 HiveServer2 完全一緻,是以 DS 隻需要資料源中 Hive 資料源類型配置為 Kyuubi 多資料源,就可以直接送出 SQL 任務。
目前,Kyuubi 在T3出行支撐了80%的離線作業,日作業量在1W+。
公司内部使用多種資料存儲系統,這些不同的系統解決了對應的使用場景。除了傳統的 RDBMS (比如 MySQL) 之外,我們還使用 Apache Kafka 來擷取流和事件資料,還有 HBase、MongoDB,以及資料湖對象存儲和 Hudi 格式的資料源。
我們知道,要将不同存儲來源的資料進行關聯,我們需要對資料進行提取,并放到同一種存儲媒體中,比如 HDFS,然後進行關聯操作。這種資料割裂,會給我們的資料關聯分析帶來很大的麻煩,如果我們能夠使用一種統一的查詢引擎分别查詢不同資料源的資料,然後直接進行關聯操作,這将帶來巨大的效率提升。
是以,我們利用 Spark DatasourceV2 實作了統一文法的跨存儲聯邦查詢。其提供高效,統一的 SQL 通路。這樣做的優勢如下:
單個 SQL 方言和 API
統一安全控制和審計跟蹤
統一控制
能夠組合來自多個來源的資料
資料獨立性
基于 Spark DatasourceV2 ,對于讀取程式,我們隻需定義一個 DefaultSource 的類,實作 ReadSupport 相關接口,就可以對接外部資料源,同時 SupportsPushDownFilters、SupportsPushDownRequiredColumns、SupportsReportPartitioning 等相關的優化,實作了算子下推功能。由此我們可以将查詢規則下推到 JDBC 等資料源,在不同資料源層面上進行一些過濾,再将計算結果傳回給 Spark,這樣可以減少資料的量,進而提高查詢效率。
現有方案是通過建立外部表,利用 HiveMeta Server 管理外部資料源的元資訊, 對表進行統一多權限管理。
例如:MongoDB 表映射
後續更新 Spark3.X ,引入了 namespace 的概念後,DatasouceV2 可實作插件形式的Multiple Catalog 模式,這将大大提高聯邦查詢的靈活度。
我們基于 TPC-DS 生成了 500GB 資料量進行了測試。選用部分事實表和次元表,分别在 Hive 和 Kyuubi 上進行性能壓測。主要關注場景有:
單使用者和多使用者場景
聚合函數性能對比
Join 性能對比
單 stage 和多 stage 性能對比
壓測結果對比,Kyuubi 基于 Spark 引擎大多數場景比 Hive 性能提升了3-6倍,同時多租戶、并發的場景更加高效穩定。
我們對 Kyuubi 的改進和優化主要包括如下幾個方面:
Kyuubi Web:啟動一個獨立多 web 服務,監控管理 Kyuubi Server。
Kyuubi EventBus:定義了一個全局的事件總線。
Kyuubi Router:路由子產品,可以将專有文法的 SQL 請求轉發到不同的原生 JDBC 服務上。
Kyuubi Spark Engine:修改原生 Spark Engine。
Kyuubi Lineage:資料血緣解析服務,将執行成功多 SQL 解析存入圖資料庫,提供 API 調用。
目前運作的 SparkContext 和 SQL 數量
各個 Kyuubi Server 執行個體狀态
Top 20: 1天内最耗時的 SQL
使用者送出 SQL 排名(1天内)
展示各使用者 SQL 運作的情況和具體語句
SQL 狀态分為:closed,cancelled,waiting和running。其中waiting和running 的 SQL 可取消
根據管理租戶引擎對應隊列和資源配置、并發量
可以線上檢視、修改 Kyuubi Server、Engine 相關配置
Server 端引入了 RESTful Service。
在Server應用程序中,事件總線監聽了包括應用停止時間、JDBC 會話關閉、JDBC 操作取消等事件。引入事件總線的目的,是為了在單個應用中和不同的子服務間進行通信。否則不同的子服務對象需要包含對方的執行個體依賴,服務對象的模型會非常複雜。
增加了 Kyuubi JDBC Route 子產品,JDBC 連接配接會先打向此服務。
該服務根據既定政策轉發到不同服務。下圖為具體政策。
将 Kyuubi-Spark-Sql-Engine 的 Spark 3.X 版本改成了 Spark 2.4.5,适配叢集版本,後續叢集更新會跟上社群版本融合
增加了Hudi datasource 子產品,使用 Spark datasource 計劃查詢 Hudi,提高對 Hudi 的查詢效率
內建 Hudi 社群的 update、delete 文法,新增了 upsert 文法和 Hudi 建表語句
基于 ANTLR 的 SQL 血緣解析功能。現有提供了兩個模式,一個是定時排程,解析一定時間範圍内的執行成功的 SQL 語句,将解析結果存儲到 HugeGraph 圖庫中,用于資料治理系統等調用。另一個模式為提供 API 調用,查詢時使用者直接調用,SQL 複雜時可以直覺理清自己的 SQL 邏輯,友善修改和優化自己的 SQL。
T3出行大資料平台基于 Apache Kyuubi 0.8,實作了資料服務統一化,大大簡化了離線資料處理鍊路,同時也能保障查詢時延要求,之後我們将用來提升更多業務場景的資料服務和查詢能力。最後,感謝 Apache Kyuubi 社群的相關支援。後續計劃更新到社群的新版本跟社群保持同步,同時基于T3出行場景做的一些功能點,也會陸續回饋給社群,共同發展。也期望 Apache kyuubi 作為 Serverless SQL on Lakehouse 引領者越來越好!
作者:李心恺,T3出行進階大資料工程師
Kyuubi 首頁:
https://kyuubi.apache.org/
Kyuubi 源碼:
https://github.com/apache/incubator-kyuubi