Kyuubi 剖析 | Apache Kyuubi(Incubating) 核心功能調(diào)研
? ?




作者簡介



王震
愛奇藝高級研發(fā)工程師,負責大數(shù)據(jù)計算平臺的開發(fā)和維護工作
Apache?Linkis?(Incubating) PPMC
Apache Kyuubi (Incubating)?Contributor




背景

? ? Apache Kyuubi (Incubating) 是 Spark Thrift Server 增強版實現(xiàn),實現(xiàn) HiveServer2 協(xié)議,啟動一個 Thrift 服務(wù),通過 JDBC 方式接收 Spark SQL 請求并執(zhí)行。我司通過提供 Kyuubi 服務(wù), 實現(xiàn) Hive SQL 到 Spark SQL 的遷移,同時提供 Ad-hoc 查詢服務(wù)。
? ? 目前使用版本是 Kyuubi 0.7 版本,社區(qū)最新的 Kyuubi 1.4.0 版本帶來了很大的架構(gòu)優(yōu)化,所以做如下的調(diào)研測試。

測試環(huán)境部署

版本信息
? ? Kyuubi 版本:1.4.0 (未發(fā)布,master 分支)
? ? Spark 版本:3.1.1
打包編譯
? ? 拉取 Kyuubi 代碼,并執(zhí)行打包命令,完成后上傳至服務(wù)器
1 | ./build/dist --tgz --spark-provided -Pkyuubi-extension-spark-3-1 # 打包 |
配置
綁定IP和端口
配置 Kyuubi Server 服務(wù) IP 和端口
1
2kyuubi.frontend.bind.host 0.0.0.0
kyuubi.frontend.bind.port 10015配置 KERBEROS 認證
Hadoop 集群開啟了 Kerberos 認證,則配置 Kerberos 認證,并添加 Kerberos 相關(guān)配置,使用 hue 用戶代理運行。
1
2
3kyuubi.authentication KERBEROS
kyuubi.kinit.principal hue/_HOST@***.COM
kyuubi.kinit.keytab /etc/kyuubi/conf/hue.keytabZookeeper 配置
Kyuubi 依賴 Zookeeper 做服務(wù)發(fā)現(xiàn)和 HA,所以需要添加 Zookeeper 配置并使用了 DIGEST 認證。
1
2
3kyuubi.ha.zookeeper.quorum=192.168.1.100:2181
kyuubi.ha.zookeeper.auth.type=DIGEST
kyuubi.ha.zookeeper.auth.digest=hue:hue配置 Namespace
不同集群的 Kyuubi Server 使用同一個 Zookeeper 集群,配置不同 Namespace 隔離,后續(xù)連接時只需要指定?
zooKeeperNamespace?訪問不同集群。1
2kyuubi.ha.zookeeper.namespace=kyuubi_cluster001
kyuubi.session.engine.initialize.timeout=180000

功能調(diào)研

Beeline 連接 Kyuubi
? ? 使用 beeline 工具連接 Kyuubi 進行測試,Kyuubi JDBC 鏈接包括了以下配置:
1 | # zookeeper 連接 |
相關(guān)說明:
由于 JDBC 鏈接會有分號等字符,beeline 連接時 JDBC 鏈接需要帶上引號。
Hive 和 Spark 中都有 beeline 命令,可能與 Kyuubi Server 存在兼容性問題,需要使用合適的 beeline 路徑。
共享引擎策略
引擎共享策略
Kyuubi 支持共享引擎,可通?kyuubi.engine.share.level?配置不同共享級別,共享級別定義如下:CONNECTION:連接級別,引擎適用于一次 jdbc connection,不做其他共享,此配置適用于離線 ETL 任務(wù),使得不同任務(wù)之間相互隔離。
USER:用戶級別共享,引擎可以在同一個用戶的不同連接進行共享,適用于 AdHoc 查詢和較小的任務(wù),可以節(jié)省資源,并在有可用引擎時支持快速響應(yīng)。
SERVER:服務(wù)級別共享(全局共享),引擎可以全局共享,所有連接可以共享一個引擎,不過啟動引擎的用戶需要具有較高權(quán)限才能滿足訪問不同用戶的表。
引擎使用單個 SparkSession
默認情況下,共享引擎對于新的 Connection 連接,使用的新的 SparkSession,不同連接共享 SparkContext 的資源,不過一些 session 級別的參數(shù)、函數(shù)、臨時表等都是隔離開的??梢酝ㄟ^kyuubi.engine.single.spark.session參數(shù),使用全局的 SparkSession,使得不同連接可以共享 Session 狀態(tài),包括參數(shù)、函數(shù)、臨時表等。引擎 TTL
對于共享引擎,多個連接共享使用,并不由某個連接單獨管理,在某個連接關(guān)閉后引擎不會馬上退出,而是在引擎空閑的時間超過配置的超時時間后自動退出,通過kyuubi.session.engine.idle.timeout?參數(shù)進行配置。
? ??
? ? 對于共享引擎,官方公眾號有更詳細介紹:Apache Kyuubi:靈活運用引擎隔離共享,加速即席查詢,支持大規(guī)模 ETL
用戶默認配置
? ? Kyuubi 支持用戶級別的默認配置,可以為不同用戶配置不同的參數(shù),詳見:Settings: User Defaults
? ? 下面示例,給 user1 和 user2 設(shè)置了不同的隊列和動態(tài)資源最大 Executor 數(shù):
1 | # For system defaults |
Kyuubi Spark SQL Extensions
? ? Kyuubi 中實現(xiàn)了一些 Spark SQL 的優(yōu)化,可通過?spark.sql.extensions=org.apache.kyuubi.sql.KyuubiSparkSQLExtension?配置開啟,具體:Auxiliary SQL extension for Spark SQL 的官方文檔。
解決小文件問題:
? ? KyuubiSparkSQLExtension 中定義了?RepartitionBeforeWritingHive?和?RepartitionBeforeWritingDatasource?規(guī)則,在寫入 Hive 或 DataSource 前插入 Repartition 操作,來控制寫入的分區(qū)數(shù),可通過?spark.sql.optimizer.insertRepartitionNum?參數(shù)配置 Repartition 操作的分區(qū)數(shù)。
? ? 對于動態(tài)分區(qū)寫入,加了一個隨機數(shù)來解決 Repartition 可能帶來的數(shù)據(jù)傾斜的問題,不過可能會導致小文件,通過?spark.sql.optimizer.dynamicPartitionInsertionRepartitionNum?配置可設(shè)置動態(tài)分區(qū) Repartition 操作插入的隨機分區(qū)數(shù)。

Kyuubi Metrics
? ? Kyuubi Server 中也定義了一些監(jiān)控指標,用于監(jiān)控 Kyuubi Server 的運行狀況,支持了很多的 Reporter,包括 Prometheus,后續(xù)工作需要將指標投遞到 Prometheus 中,對 Kyuubi 服務(wù)進行監(jiān)控告警。具體參考:Kyuubi Server Metrics 官方文檔。
Kyuubi Ctl
? ? Kyuubi 的 bin 目錄中提供了?kyuubi-ctl?工具,目前主要用于維護 Server 和 Engine 實例的狀態(tài),可以獲取和刪除 Server 和 Engine 在 Zookeeper 上的注冊信息。
? ? 目前包括了,下面一些命令,可執(zhí)行?bin/kyuubi-ctl --help?獲取完整幫助信息。
1 | Command: get [server|engine] [options] |
? ? 后續(xù)在服務(wù)做灰度升級時,可通過?kyuubi-ctl?命令,先下線 KyuubiServer 注冊信息,切斷 KyuubiServer 流量,等一段時間后該 KyuubiServer 上連接都關(guān)閉后,下線該服務(wù)。

后續(xù)規(guī)劃

共享策略
離線 SQL:對于離線 SQL 為了保證任務(wù)穩(wěn)定性,不使用共享引擎,保證任務(wù)進行完全隔離不相互影響。
Adhoc 任務(wù):使用 User 級別共享,加大 TTL 時間,讓引擎盡量常駐,使得 Adhoc 查詢能夠及時響應(yīng);需要考慮 Spark 調(diào)度策略,防止資源搶占導致響應(yīng)慢。
配置管理
目前考慮將配置交由上游系統(tǒng)管理,根據(jù)標簽設(shè)置不同配置,任務(wù)提交時帶上相應(yīng)的標簽即可。

點個在看你最好看


