支撐了80%的離線作業(yè),日作業(yè)量在1W+ 大多數(shù)場(chǎng)景比 Hive 性能提升了3-6倍 多租戶,、并發(fā)的場(chǎng)景更加高效穩(wěn)定 T3出行是一家基于車聯(lián)網(wǎng)驅(qū)動(dòng)的智慧出行平臺(tái),,擁有海量且豐富的數(shù)據(jù)源。因?yàn)檐嚶?lián)網(wǎng)數(shù)據(jù)的多樣性,,T3出行構(gòu)建了以 Apache Hudi 為基礎(chǔ)的企業(yè)級(jí)數(shù)據(jù)湖,,提供強(qiáng)有力的業(yè)務(wù)支撐。而對(duì)于負(fù)責(zé)數(shù)據(jù)價(jià)值挖掘的終端用戶而言,,平臺(tái)的技術(shù)門(mén)檻是另一種挑戰(zhàn),。如果能將平臺(tái)的能力統(tǒng)合,,并不斷地優(yōu)化和迭代,讓用戶能夠通過(guò) JDBC 和 SQL 這種最普遍最通用的技術(shù)來(lái)使用,,數(shù)據(jù)生產(chǎn)力將可以得到進(jìn)一步的提升,。 T3出行選擇了基于網(wǎng)易數(shù)帆主導(dǎo)開(kāi)源的 Apache Kyuubi(以下簡(jiǎn)稱Kyuubi)來(lái)搭建這樣的能力。在2021 中國(guó)開(kāi)源年會(huì)(COSCon'21)上,,T3出行高級(jí)大數(shù)據(jù)工程師李心愷詳細(xì)解讀了選擇 Kyuubi 的原因,,以及基于 Kyuubi 的深度實(shí)踐和實(shí)現(xiàn)的價(jià)值。 引入 Kyuubi 前的技術(shù)架構(gòu)
T3出行整個(gè)數(shù)據(jù)湖體系,,由數(shù)據(jù)存儲(chǔ)與計(jì)算,、數(shù)據(jù)查詢與分析和應(yīng)用服務(wù)層組成。其中數(shù)據(jù)計(jì)算分為離線和實(shí)時(shí),。 數(shù)據(jù)存儲(chǔ) OBS 對(duì)象存儲(chǔ),,格式化數(shù)據(jù)存儲(chǔ)格式以 Hudi 格式為主。 數(shù)據(jù)計(jì)算 離線數(shù)據(jù)處理:利用 Hive on Spark 批處理能力,,在 Apache Dolphin Scheduler 上定時(shí)調(diào)度,,承擔(dān)所有的離線數(shù)倉(cāng)的 ETL 和數(shù)據(jù)模型加工的工作。 實(shí)時(shí)數(shù)據(jù)處理:建設(shè)了以 Apache Flink 引擎為基礎(chǔ)的開(kāi)發(fā)平臺(tái),,開(kāi)發(fā)部署實(shí)時(shí)作業(yè),。 數(shù)據(jù)查詢與分析 OLAP 層主要為面向管理和運(yùn)營(yíng)人員的報(bào)表,對(duì)接報(bào)表平臺(tái),,查詢要求低時(shí)延響應(yīng),,需求多變快速響應(yīng)。面向數(shù)據(jù)分析師的即席查詢,,更是要求 OLAP 引擎能支持復(fù)雜 SQL 處理,、從海量數(shù)據(jù)中快速甄選數(shù)據(jù)的能力。 應(yīng)用服務(wù)層 數(shù)據(jù)應(yīng)用層主要對(duì)接各個(gè)業(yè)務(wù)系統(tǒng),。離線 ETL 后的數(shù)據(jù)寫(xiě)入不同業(yè)務(wù)不同數(shù)據(jù)庫(kù)中,,面向下游提供服務(wù)。 現(xiàn)有架構(gòu)痛點(diǎn) 跨存儲(chǔ) 數(shù)據(jù)分布在 Hudi,、ClickHouse,、MongoDB 等不同存儲(chǔ),需要寫(xiě)代碼關(guān)聯(lián)分析增加數(shù)據(jù)處理門(mén)檻和成本,。 SQL不統(tǒng)一 Hive 不支持通過(guò) upsert,、update、delete 等語(yǔ)法操作 Hudi 表,,同時(shí) MongoDB,、ClickHouse 等語(yǔ)法又各不相同,開(kāi)發(fā)轉(zhuǎn)換成本較高,。 資源管控乏力 Hive on Spark,、Spark ThriftServer 沒(méi)有較好的資源隔離方案,,無(wú)法根據(jù)租戶權(quán)限做并發(fā)控制。 選型 Apache Kyuubi Apache Kyuubi 是一個(gè) Thrift JDBC/ODBC 服務(wù),,對(duì)接了 Spark 引擎,,支持多租戶和分布式的特性,可以滿足企業(yè)內(nèi)諸如 ETL,、BI 報(bào)表等多種大數(shù)據(jù)場(chǎng)景的應(yīng)用,。Kyuubi 可以為企業(yè)級(jí)數(shù)據(jù)湖探索提供標(biāo)準(zhǔn)化的接口,賦予用戶調(diào)動(dòng)整個(gè)數(shù)據(jù)湖生態(tài)的數(shù)據(jù)的能力,,使得用戶能夠像處理普通數(shù)據(jù)一樣處理大數(shù)據(jù),。項(xiàng)目已于2021年 6 月 21 號(hào)正式進(jìn)入 Apache 孵化器。于T3出行而言,,Kyuubi 的角色是一個(gè)面向 Serverless SQL on Lakehouse 的服務(wù),。
Apache Kyuubi 架構(gòu) HiveServer 是一個(gè)廣泛應(yīng)用的大數(shù)據(jù)組件,。因傳統(tǒng)的 MR 引擎處理效率已經(jīng)較為落后,,Hive 引擎替換為了 Spark,但是為了和原本的 MR 及 TEZ 引擎共存,,Hive 保留了自己的優(yōu)化器,,這使得Hive Parse 性能在大多數(shù)場(chǎng)景下都落后于 Spark Parse。 STS(Spark Thrift Server)支持HiveServer 的接口和協(xié)議,,允許用戶直接使用 Hive 接口提交 SQL 作業(yè),。但是 STS 不支持多租戶,同時(shí)所有 Spark SQL 查詢都走唯一一個(gè) Spark Thrift 節(jié)點(diǎn)上的同一個(gè) Spark Driver,,并發(fā)過(guò)高,,并且任何故障都會(huì)導(dǎo)致這個(gè)唯一的 Spark Thrift 節(jié)點(diǎn)上的所有作業(yè)失敗,從而需要重啟 Spark Thrift Server,,存在單點(diǎn)問(wèn)題,。 對(duì)比 Apache Kyuubi 和 Hive、STS,,我們發(fā)現(xiàn),,Kyuubi 在租戶控制,任務(wù)資源隔離,,引擎升級(jí)對(duì)接,,性能等方面擁有諸多優(yōu)勢(shì)。詳情見(jiàn)下圖,。
Apache Kyuubi 優(yōu)勢(shì) Apache Kyuubi在T3出行場(chǎng)景 AD-HOC場(chǎng)景 Hue 整合 Kyuubi,,替代 Hive 為分析師和大數(shù)據(jù)開(kāi)發(fā)提供服務(wù)。 我們?cè)?hue_safety_valve.ini 配置文件中,,增加如下配置: [notebook][[interpreters]][[[cuntom]]]name=Kyuubiinterface=hiveserver2[spark]sql_server_host=Kyuubi Server IPsql_server_port=Kyuubi Port 然后重啟 Hue 即可,。
ETL場(chǎng)景 DS 配置 Kyuubi 數(shù)據(jù)源,,進(jìn)行離線 ETL 作業(yè)。因?yàn)?Kyuubi Server 的接口,、協(xié)議都和 HiveServer2 完全一致,,所以 DS 只需要數(shù)據(jù)源中 Hive 數(shù)據(jù)源類型配置為 Kyuubi 多數(shù)據(jù)源,就可以直接提交 SQL 任務(wù),。 目前,,Kyuubi 在T3出行支撐了80%的離線作業(yè),日作業(yè)量在1W+,。
聯(lián)邦查詢場(chǎng)景 公司內(nèi)部使用多種數(shù)據(jù)存儲(chǔ)系統(tǒng),,這些不同的系統(tǒng)解決了對(duì)應(yīng)的使用場(chǎng)景。除了傳統(tǒng)的 RDBMS (比如 MySQL) 之外,,我們還使用 Apache Kafka 來(lái)獲取流和事件數(shù)據(jù),,還有 HBase、MongoDB,,以及數(shù)據(jù)湖對(duì)象存儲(chǔ)和 Hudi 格式的數(shù)據(jù)源,。 我們知道,要將不同存儲(chǔ)來(lái)源的數(shù)據(jù)進(jìn)行關(guān)聯(lián),,我們需要對(duì)數(shù)據(jù)進(jìn)行提取,,并放到同一種存儲(chǔ)介質(zhì)中,比如 HDFS,,然后進(jìn)行關(guān)聯(lián)操作,。這種數(shù)據(jù)割裂,會(huì)給我們的數(shù)據(jù)關(guān)聯(lián)分析帶來(lái)很大的麻煩,,如果我們能夠使用一種統(tǒng)一的查詢引擎分別查詢不同數(shù)據(jù)源的數(shù)據(jù),,然后直接進(jìn)行關(guān)聯(lián)操作,這將帶來(lái)巨大的效率提升,。 所以,,我們利用 Spark DatasourceV2 實(shí)現(xiàn)了統(tǒng)一語(yǔ)法的跨存儲(chǔ)聯(lián)邦查詢。其提供高效,,統(tǒng)一的 SQL 訪問(wèn),。這樣做的優(yōu)勢(shì)如下: 單個(gè) SQL 方言和 API 統(tǒng)一安全控制和審計(jì)跟蹤 統(tǒng)一控制 能夠組合來(lái)自多個(gè)來(lái)源的數(shù)據(jù) 數(shù)據(jù)獨(dú)立性 基于 Spark DatasourceV2 ,對(duì)于讀取程序,,我們只需定義一個(gè) DefaultSource 的類,,實(shí)現(xiàn) ReadSupport 相關(guān)接口,就可以對(duì)接外部數(shù)據(jù)源,,同時(shí) SupportsPushDownFilters,、 SupportsPushDownRequiredColumns、 SupportsReportPartitioning 等相關(guān)的優(yōu)化,,實(shí)現(xiàn)了算子下推功能,。由此我們可以將查詢規(guī)則下推到 JDBC 等數(shù)據(jù)源,,在不同數(shù)據(jù)源層面上進(jìn)行一些過(guò)濾,再將計(jì)算結(jié)果返回給 Spark,,這樣可以減少數(shù)據(jù)的量,,從而提高查詢效率。 現(xiàn)有方案是通過(guò)建立游戲外部表,,利用 HiveMeta Server 管理外部數(shù)據(jù)源的元信息,, 對(duì)表進(jìn)行統(tǒng)一多權(quán)限管理。 例如:MongoDB 表映射 CREATE EXTERNALTABLE mongo_test USING com.mongodb.spark.sql OPTIONS ( spark.mongodb.input.uri "mongodb://用戶名:密碼@IP:PORT/庫(kù)名?authSource=admin", spark.mongodb.input.database "庫(kù)名", spark.mongodb.input.collection "表名", spark.mongodb.input.readPreference.name "secondaryPreferred", spark.mongodb.input.batchSize "20000" ); 后續(xù)升級(jí) Spark3.X ,,引入了 namespace 的概念后,,DatasouceV2 可實(shí)現(xiàn)插件形式的Multiple Catalog 模式,這將大大提高聯(lián)邦查詢的靈活度,。
Kyuubi 性能測(cè)試
我們基于 TPC-DS 生成了 500GB 數(shù)據(jù)量進(jìn)行了測(cè)試,。選用部分事實(shí)表和維度表,分別在 Hive 和 Kyuubi 上進(jìn)行性能壓測(cè),。主要關(guān)注場(chǎng)景有: 單用戶和多用戶場(chǎng)景 聚合函數(shù)性能對(duì)比 Join 性能對(duì)比 單 stage 和多 stage 性能對(duì)比 壓測(cè)結(jié)果對(duì)比,,Kyuubi 基于 Spark 引擎大多數(shù)場(chǎng)景比 Hive 性能提升了3-6倍,同時(shí)多租戶,、并發(fā)的場(chǎng)景更加高效穩(wěn)定,。 T3出行對(duì) Kyuubi 的改進(jìn)與優(yōu)化 我們對(duì) Kyuubi 的改進(jìn)和優(yōu)化主要包括如下幾個(gè)方面: Kyuubi Web:?jiǎn)?dòng)一個(gè)獨(dú)立多 web 服務(wù),監(jiān)控管理 Kyuubi Server,。 Kyuubi EventBus:定義了一個(gè)全局的事件總線。 Kyuubi Router:路由模塊,,可以將專有語(yǔ)法的 SQL 請(qǐng)求轉(zhuǎn)發(fā)到不同的原生 JDBC 服務(wù)上,。 Kyuubi Spark Engine:修改原生 Spark Engine。 Kyuubi Lineage:數(shù)據(jù)血緣解析服務(wù),,將執(zhí)行成功多 SQL 解析存入圖數(shù)據(jù)庫(kù),,提供 API 調(diào)用。 Kyuubi Web 服務(wù)功能 當(dāng)前運(yùn)行的 SparkContext 和 SQL 數(shù)量 各個(gè) Kyuubi Server 實(shí)例狀態(tài) Top 20: 1天內(nèi)最耗時(shí)的 SQL 用戶提交 SQL 排名(1天內(nèi)) 展示各用戶 SQL 運(yùn)行的情況和具體語(yǔ)句 SQL 狀態(tài)分為:closed,,cancelled,,waiting和running。其中waiting和running 的 SQL 可取消 根據(jù)管理租戶引擎對(duì)應(yīng)隊(duì)列和資源配置,、并發(fā)量 可以在線查看,、修改 Kyuubi Server、Engine 相關(guān)配置
Kyuubi EventBus Server 端引入了 RESTful Service,。 在Server應(yīng)用進(jìn)程中,,事件總線監(jiān)聽(tīng)了包括應(yīng)用停止時(shí)間、JDBC 會(huì)話關(guān)閉,、JDBC 操作取消等事件,。引入事件總線的目的,,是為了在單個(gè)應(yīng)用中和不同的子服務(wù)間進(jìn)行通信。否則不同的子服務(wù)對(duì)象需要包含對(duì)方的實(shí)例依賴,,服務(wù)對(duì)象的模型會(huì)非常復(fù)雜,。
Kyuubi Router 增加了 Kyuubi JDBC Route 模塊,JDBC 連接會(huì)先打向此服務(wù),。 該服務(wù)根據(jù)既定策略轉(zhuǎn)發(fā)到不同服務(wù),。下圖為具體策略。
Kyuubi Spark Engine 將 Kyuubi-Spark-Sql-Engine 的 Spark 3.X 版本改成了 Spark 2.4.5,,適配集群版本,,后續(xù)集群升級(jí)會(huì)跟上社區(qū)版本融合 增加了Hudi datasource 模塊,使用 Spark datasource 計(jì)劃查詢 Hudi,,提高對(duì) Hudi 的查詢效率 集成 Hudi 社區(qū)的 update,、delete 語(yǔ)法,新增了 upsert 語(yǔ)法和 Hudi 建表語(yǔ)句
Kyuubi Lineage 基于 ANTLR 的 SQL 血緣解析功能?,F(xiàn)有提供了兩個(gè)模式,,一個(gè)是定時(shí)調(diào)度,解析一定時(shí)間范圍內(nèi)的執(zhí)行成功的 SQL 語(yǔ)句,,將解析結(jié)果存儲(chǔ)到 HugeGraph 圖庫(kù)中,,用于數(shù)據(jù)治理系統(tǒng)等調(diào)用。另一個(gè)模式為提供 API 調(diào)用,,查詢時(shí)用戶直接調(diào)用,,SQL 復(fù)雜時(shí)可以直觀理清自己的 SQL 邏輯,方便修改和優(yōu)化自己的 SQL,。
基于 Kyuubi 的解決方案
總結(jié) T3出行大數(shù)據(jù)平臺(tái)基于 Apache Kyuubi 0.8,,實(shí)現(xiàn)了數(shù)據(jù)服務(wù)統(tǒng)一化,大大簡(jiǎn)化了離線數(shù)據(jù)處理鏈路,,同時(shí)也能保障查詢時(shí)延要求,,之后我們將用來(lái)提升更多業(yè)務(wù)場(chǎng)景的數(shù)據(jù)服務(wù)和查詢能力。最后,,感謝 Apache Kyuubi 社區(qū)的相關(guān)支持,。后續(xù)計(jì)劃升級(jí)到社區(qū)的新版本跟社區(qū)保持同步,同時(shí)基于T3出行場(chǎng)景做的一些功能點(diǎn),,也會(huì)陸續(xù)回饋給社區(qū),,共同發(fā)展。也期望 Apache kyuubi 作為 Serverless SQL on Lakehouse 引領(lǐng)者越來(lái)越好,! |
|
來(lái)自: 新用戶8719ag3P > 《待分類》