Apache Kyuubi 1.6.0 新特性解讀
一、服務(wù)端增強(qiáng)
1、支持批(JAR)任務(wù)提交
Apache Kyuubi 是網(wǎng)易數(shù)帆開(kāi)源的一款企業(yè)級(jí)的數(shù)據(jù)湖探索平臺(tái),也是一款分布式和多租戶網(wǎng)關(guān),為數(shù)據(jù)湖查詢例如 Spark、Flink 或者 trino 等提供 SQL 查詢服務(wù)。Kyuubi 支持多租戶、高可用以及多工作負(fù)載等功能特性,可以滿足企業(yè)內(nèi)部諸如 ETL、BI 報(bào)表、交互式分析以及批數(shù)據(jù)處理等多種大數(shù)據(jù)場(chǎng)景的應(yīng)用。
首先介紹一下 Apache Kyuubi 1.6.0 針對(duì)服務(wù)端增強(qiáng)引入了一些新特性。
Kyuubi 1.6.0 支持批(JAR)任務(wù)提交。Kyuubi 本身支持 SQL,但是很多公司不僅有 SQL 任務(wù),還有 JAR 任務(wù),在這里稱(chēng)之為 Batch 任務(wù),這時(shí) Kyuubi 已有的功能就無(wú)法滿足 ETL 需求。在 Kyuubi 1.6.0 版本中提供了一個(gè)通過(guò) Restful API 形式提交 Batch 任務(wù),實(shí)現(xiàn) Kyuubi Batch 的功能。
Kyuubi Batch 功能的實(shí)現(xiàn)設(shè)計(jì)如圖所示,用戶首先需要通過(guò) POST 方式向 Kyuubi Server 發(fā)送一個(gè) Create Batch 的請(qǐng)求,Kyuubi Server 接收到請(qǐng)求后,會(huì)立即返回 BatchId,Kyuubi Server 會(huì)使用這個(gè) BatchId 作為一個(gè) tag 傳入 Spark 中,加入到 Spark submit 的 conf 中。這里是使用 Yarn 作為 resource manager,所以這里會(huì)把這個(gè) tag 傳到 Yarn context 中,這樣 BatchId 同時(shí)會(huì)和 Ky?uubi Server 以及 Yarn 都進(jìn)行一次綁定。最后能夠通過(guò)這個(gè) BatchId 去訪問(wèn) Kyuubi Server 獲取 Batch Report,Kyuubi Server 也能夠通過(guò) BatchId 去訪問(wèn) Yarn 獲取 application report。同時(shí) Kyuubi Server 也可以去合并 Kyuubi Server 端的一些信息,比如 Batch 任務(wù)的創(chuàng)建時(shí)間,創(chuàng)建的節(jié)點(diǎn),這些信息可以返回給用戶,用戶也能夠通過(guò)這個(gè) BatchId 去獲取 Spark submit 的日志,能夠清楚知道 Spark submit 執(zhí)行到了哪些階段,以及 Kyuubi Server 端發(fā)生了什么,如果出現(xiàn)異常,也能夠清楚的找到異常信息。
對(duì)于用戶來(lái)說(shuō),還可以通過(guò) DELETE 方式關(guān)閉目前正在運(yùn)行的 Batch 任務(wù),如果 Batch 任務(wù)沒(méi)有提交到 Yarn 集群,Kyuubi Server 需要 kill 掉本地的 spark submit 進(jìn)程,如果已經(jīng)提交到y(tǒng)arn集群,對(duì)于 Kyuubi Server 來(lái)說(shuō)需要通過(guò) BatchId kill 掉正在運(yùn)行的 Batch 任務(wù),并返回給用戶這個(gè) close 的結(jié)果。
在示意圖左半部分的 4 個(gè) API,是針對(duì) Kyuubi 單個(gè)節(jié)點(diǎn)的,比如拉取 local job,kill 本地進(jìn)程,都是需要在Kyuubi進(jìn)程啟動(dòng)節(jié)點(diǎn)處理的。一般在生產(chǎn)環(huán)境為了實(shí)現(xiàn) HA 和 SLB,需要部署多臺(tái) Kyuubi 節(jié)點(diǎn),為了實(shí)現(xiàn)多個(gè)節(jié)點(diǎn)的 HA,我們?cè)谶@個(gè)功能特性里面引入了 Metadata Store,以及 Kyuubi 內(nèi)部節(jié)點(diǎn)的請(qǐng)求的轉(zhuǎn)發(fā)機(jī)制。
Metadata Store 是用來(lái)存儲(chǔ)一些 Batch 任務(wù)的元數(shù)據(jù),比如 BatchId,創(chuàng)建 Batch 任務(wù)的 conf 和參數(shù),還有 Kyuubi 節(jié)點(diǎn)的一些信息,比如哪個(gè)節(jié)點(diǎn)創(chuàng)建的 Batch,都會(huì)加入到這個(gè)元數(shù)據(jù)中。有了 Metadata Store 之后,Batch 元數(shù)據(jù)會(huì)對(duì)多個(gè) Kyuubi 節(jié)點(diǎn)都可見(jiàn),包括目前的狀態(tài),以及哪個(gè)節(jié)點(diǎn)創(chuàng)建的 Batch。關(guān)于 Kyuubi Server 之間的 rest 請(qǐng)求轉(zhuǎn)發(fā),我們可以在這里舉一個(gè)簡(jiǎn)單的例子,比如采用 K8S 的 loadbalance 作為 Kyuubi Serve?r 的服務(wù)發(fā)現(xiàn),每個(gè) rest 請(qǐng)求都會(huì)從這個(gè) loadbalance 中去隨機(jī)選擇一個(gè) Kyuubi 節(jié)點(diǎn)來(lái)處理,比如在處理 Kyuubi Batch 的時(shí)候,是在 Kyuubi 節(jié)點(diǎn) 1 創(chuàng)建的,當(dāng)用戶需要拉取 local job 的時(shí)候,會(huì)向 loadbalance 節(jié)點(diǎn)發(fā)送請(qǐng)求,load balance 會(huì)選擇 Kyuubi 節(jié)點(diǎn) 2 來(lái)處理這個(gè)請(qǐng)求,這個(gè)時(shí)候 Kyuubi 節(jié)點(diǎn) 2 會(huì)首先在內(nèi)存中尋找這個(gè) Batch 任務(wù),如果沒(méi)有找到,就會(huì)去訪問(wèn) Metadata Store,去查詢這個(gè)任務(wù)的元數(shù)據(jù)信息。此時(shí)發(fā)現(xiàn)任務(wù)是由 Kyuubi 節(jié)點(diǎn) 1 創(chuàng)建的,就會(huì)把拉取日志的請(qǐng)求發(fā)送給 Kyuubi 節(jié)點(diǎn) 1,由 Kyuubi 節(jié)點(diǎn) 1 拉取本地日志,返回給 Kyuubi 節(jié)點(diǎn) 2,Kyuubi 節(jié)點(diǎn) 2 這個(gè)時(shí)候就會(huì)把這個(gè)結(jié)果返回給用戶。這樣用戶就可以成功的通過(guò) Kyuubi 節(jié)點(diǎn) 2 獲取到 Spark submit 的日志。通過(guò) Metadata Store 和節(jié)點(diǎn)內(nèi)部轉(zhuǎn)發(fā),實(shí)現(xiàn)了多節(jié)點(diǎn)的 HA,換句話來(lái)說(shuō),用戶是通過(guò) load balance 連接到任意節(jié)點(diǎn),都可以拿到 Batch 的信息。
通過(guò)運(yùn)用 Metadata Store 和 Kyuubi Server,也可以在服務(wù)重啟的時(shí)候,做到恢復(fù)重啟前在運(yùn)行的 Batch 任務(wù)。如果這個(gè) Batch 任務(wù)沒(méi)有提交到 Yarn 集群,Kyuubi Server 會(huì)通過(guò) Metadata Store 里面的元信息進(jìn)行重新提交,如果已經(jīng)提交給 Yarn 集群,Kyuubi Server 會(huì)監(jiān)控運(yùn)行的 Batch 任務(wù)的狀態(tài)。
在 Kyuubi1.6.0 版本中,對(duì) Metadata Store 做了一些增強(qiáng),當(dāng) Metadata Store 有問(wèn)題,比如 MySQL 短時(shí)間不可用,這個(gè)時(shí)候會(huì)把更新 Metadata Store 的一些請(qǐng)求存儲(chǔ)在內(nèi)存中,進(jìn)行異步的重試,而不是打斷用戶的主線程。同時(shí)當(dāng) Metadata Store 不可用的時(shí)候,對(duì)于 Batch 任務(wù)的狀態(tài)請(qǐng)求會(huì) fallback 到 Yarn 上獲取任務(wù)的狀態(tài),對(duì)這個(gè)狀態(tài)進(jìn)行一些補(bǔ)充,然后 Kyuubi Server 會(huì)返回給用戶。
同時(shí)在 1.6.0 版本中,Kyuubi 提供了 restful 的 CLI 和 SDK,可以讓用戶很方便的使用其提供的服務(wù),而不需要使用 curl 命令或者一些很原始的 rest API,直接使用 CLI 對(duì)用戶來(lái)說(shuō)更加友好,restful SDK 可以讓平臺(tái)層的用戶使用編程的方式進(jìn)行集成。同時(shí)擁有這種中心化提交 Batch 任務(wù)的服務(wù),可以方便的去監(jiān)管 Spark submit 的行為,比如做一些提交權(quán)限的校驗(yàn),拒絕不合理的 JAR 提交,來(lái)提高整個(gè)集群的安全性。
剛才也提到了,Kyuubi1.6.0 提供了 restful SDK 和 Command Line 來(lái)給用戶使用。restful 的 SDK 對(duì)于一些平臺(tái)團(tuán)隊(duì)來(lái)說(shuō),通過(guò)編程的方式很容易集成。這里主要介紹命令行工具的使用,上圖右側(cè)展示了命令行的使用,類(lèi)似于 K8S 的 ctl。命令結(jié)構(gòu)為 kyuubi-ctl + action 命令 + batch + yml 文件。其中 action 包括 create、get、logs、delete,分別對(duì)應(yīng)前文提到的 4 個(gè) API,還有一個(gè)復(fù)合命令 Submit,包含了其它 4 個(gè) action。配置文件中指定了 JAR 的位置,Batch 類(lèi)型,目前已經(jīng)支持了 Spark,正在支持 Flink,還有提交 JAR 的主程序和它的參數(shù)以及配置。
這樣對(duì)于用戶來(lái)說(shuō)非常便捷,只需一行命令就能完成任務(wù)的提交,不需要配置很多 Spark 的本地環(huán)境,這里會(huì)使用最新的 Spark 版本,減少了用戶的維護(hù)成本。
2、統(tǒng)一 API 接口和認(rèn)證機(jī)制
在 Kyuubi1.6.0 版本中,統(tǒng)一了 API 接口和認(rèn)證機(jī)制。到 Kyuubi1.6.0 為止提供了 Thrift,Rest、JDBC 和 ODBC 的 API,提供了 Kerberos 和 Password 的認(rèn)證機(jī)制,在之前的版本中,對(duì)于 Thrift 協(xié)議來(lái)說(shuō),只支持一種認(rèn)證機(jī)制,在 1.6.0 版本中,兩種認(rèn)證機(jī)制都支持了。對(duì)于 rest 請(qǐng)求 1.6.0 之前是不支持認(rèn)證的,在 1.6.0 版本中,這兩種認(rèn)證機(jī)制也都做了支持。有了統(tǒng)一的 API 和認(rèn)證機(jī)制,1.6.0 基本上覆蓋了用戶所有的使用方式。
二、客戶端增強(qiáng)
剛剛介紹的是 1.6.0 服務(wù)端的增強(qiáng),在這個(gè)版本中對(duì)客戶端也做了增強(qiáng)。
1、增強(qiáng)內(nèi)置 JDBC 驅(qū)動(dòng)能力
增強(qiáng)了內(nèi)置 JDBC 的驅(qū)動(dòng)能力:
① 剝離了 Hive 和 Hadoop 的依賴(lài);
② 支持使用 keytab 進(jìn)行 Kerberos 身份認(rèn)證。
2、增強(qiáng) Beeline
1.6.0 版本增強(qiáng)了 Beeline,在 Beeline 中可以顯示 Spark 控制臺(tái)的進(jìn)度條,如圖所示,可以清楚地看到 Spark 每個(gè) Stage 的執(zhí)行情況和總體執(zhí)行情況。
三、引擎插件
在計(jì)算引擎方面,Kyuubi1.6.0 提供了非常成熟穩(wěn)定的 Spark 支持,同時(shí) Flink、trino 以及 Hive 等計(jì)算引擎的支持也得到了充分的驗(yàn)證。
1、Kyuubi Spark Engine
我們首先來(lái)看 Spark 引擎。Kyuubi 作為 Spark 的引擎,支持的已經(jīng)是非常成熟了,有一套完善的生命周期管控,也經(jīng)過(guò)了很多公司的大規(guī)模生產(chǎn)驗(yàn)證,在業(yè)界有眾多的生產(chǎn)環(huán)境的落地案例。對(duì)于版本支持這塊,Kyuubi Spark Engine 支持了 3.0 到 3.3 的所有版本,對(duì)于這些版本也都進(jìn)行了充分的驗(yàn)證。在 Spark 引擎中兼容了所有的部署模式,比如 Spark on Local/Standalone 或者 Spark on Yarn/K8S,不論是 Client 還是 Cluster mode 都是支持的。
Kyuubi Spark Engine 從 Spark3.1 版本開(kāi)始就提供了一個(gè)企業(yè)級(jí)插件,比如自動(dòng)小文件合并,限制掃描的最大分區(qū)數(shù),以及限制查詢結(jié)果大小,并提供了一個(gè)開(kāi)箱即用的 Z-Order 優(yōu)化來(lái)支持計(jì)算寫(xiě)入 Stage 的配置隔離。同時(shí)在 1.6.0 中,又新增了 Spark TPC-DS 和 TPC-H 連接器,以及 Authz 認(rèn)證的插件。
Kyuubi 社區(qū)依然還在陸續(xù)開(kāi)發(fā)一些比如像血緣插件等企業(yè)級(jí)的功能。
2、Kyuubi Flink Engine
再來(lái)看一下 Flink Engine,在 Kyuubi1.6.0 中基本成熟穩(wěn)定了,并且 Kyuubi 的 Flink Engine 是對(duì)所有社區(qū)開(kāi)發(fā)者和用戶去關(guān)注的,也在不斷的迭代演進(jìn)中,在 1.6.0 版本中,F(xiàn)link Engine 支持了 Flink1.14、1.15 版本,1.16 還沒(méi)有發(fā)布,社區(qū)這邊已經(jīng)在逐步支持。
對(duì)于部署模式而言,F(xiàn)link Engine 支持 on Local、on Yarn(PerJob and Session mode),關(guān)于 on Yarn/K8S Application mode 會(huì)在 1.7.0 版本進(jìn)行發(fā)布,因?yàn)?Application mode 非常契合 Kyuubi 的部署模式,目前是在開(kāi)發(fā)階段。
3、Kyuubi Trino Engine, Kyuubi Hive/JDBC Engine
Trino Engine 是一個(gè)生產(chǎn)可用,經(jīng)過(guò)移動(dòng)云等社區(qū)用戶的生產(chǎn)驗(yàn)證狀態(tài)。Hive 和 JDBC Engine 提供了一個(gè) Beta 版本,歡迎大家使用反饋,以及生產(chǎn)驗(yàn)證。