Kyuubi Gateway通過提供JDBC/ODBC介面,支援SQL查詢和BI工具(如Tableau、Power BI)無縫串連Serverless Spark,實現高效的資料訪問與分析。同時,其多租戶資源隔離能力能夠滿足企業級應用的需求。
建立Kyuubi Gateway
進入Gateway頁面。
在左側導覽列,選擇。
在Spark頁面,單擊目標工作空間名稱。
在EMR Serverless Spark頁面,單擊左側導覽列中的。
在Kyuubi Gateway頁面,單擊建立Kyuubi Gateway。
在建立Kyuubi Gateway頁面,配置以下資訊,單擊建立。
參數
說明
名稱
建立Gateway的名稱。僅支援小寫字母、數字、短劃線(-),並且開頭和結尾必須是字母或者數字。
Kyuubi Gateway 資源
預設
2 CPU, 8 GB。支援的規格及其推薦並發上限如下:
1 CPU, 4 GB:102 CPU, 8 GB:204 CPU, 16 GB:308 CPU, 32 GB:4516 CPU, 64 GB:8532 CPU, 128 GB:135
說明如果Spark配置項數量過多,將導致Spark任務的瞬時提交並發度下降。
Kyuubi 版本
當前Gateway使用的Kyuubi版本。
說明如果資料目錄中使用DLF(之前稱為DLF 2.5),則Kyuubi 版本必須選擇為1.9.2-0.0.1及之後的版本。
引擎版本
當前Gateway使用的引擎版本。引擎版本號碼含義等詳情請參見引擎版本介紹。
關聯隊列
建立的Gateway將部署在所選隊列。通過Gateway提交Spark任務時,將使用Gateway建立者的身份提交任務。
認證方式
僅支援Token方式。
在您建立Gateway之後,需要為其產生一個唯一的鑒權Token,以便在之後的請求中使用該Token進行身分識別驗證和存取控制。建立Token的具體操作,請參見Gateway管理。
服務高可用
開啟服務高可用後,將部署3台或以上Kyuubi Server以達到高可用。
開啟該開關後,還需配置以下參數:
Kyuubi Server 部署數量:Kyuubi伺服器數量。
Zookeeper 叢集地址:高可用Kyuubi Gateway依賴於Zookeeper叢集,請填寫Zookeeper叢集地址,多個節點請以英文逗號(,)分隔,並確保網路互連。例如,
zk1:2181,zk2:2181,zk3:2181。
網路連接
選擇已建立的網路連接,以便直接存取VPC內的資料來源或外部服務。有關建立網路連接的具體操作,請參見EMR Serverless Spark與其他VPC間網路互連。
公網 Endpoint
預設關閉。開啟該功能後,則系統將通過公網Endpoint訪問Kyuubi。否則預設通過內網Endpoint訪問Kyuubi。
Kyuubi 配置
填寫Kyuubi配置資訊,預設以空格符分隔,例如:
kyuubi.engine.pool.size 1。僅支援以下Kyuubi配置。
kyuubi.engine.pool.size kyuubi.engine.pool.size.threshold kyuubi.engine.share.level kyuubi.engine.single.spark.session kyuubi.session.engine.idle.timeout kyuubi.session.engine.initialize.timeout kyuubi.engine.security.token.max.lifetime kyuubi.session.engine.check.interval kyuubi.session.idle.timeout kyuubi.session.engine.request.timeout kyuubi.session.engine.login.timeout kyuubi.backend.engine.exec.pool.shutdown.timeout kyuubi.backend.server.exec.pool.shutdown.timeout kyuubi.backend.server.exec.pool.keepalive.time kyuubi.frontend.thrift.login.timeout kyuubi.operation.status.polling.timeout kyuubi.engine.pool.selectPolicy kyuubi.authentication kyuubi.kinit.principal kyuubi.kinit.keytab kyuubi.authentication.ldap.* kyuubi.hadoop.proxyuser.hive.hosts kyuubi.hadoop.proxyuser.hive.groups kyuubi.hadoop.proxyuser.kyuubi.hosts kyuubi.hadoop.proxyuser.kyuubi.groups kyuubi.ha.*Spark 配置
填寫Spark配置資訊,預設以空格符分隔。除
spark.kubernetes.*類型的參數外,其他參數均支援。例如:spark.sql.catalog.paimon.metastore dlf。在Kyuubi Gateway頁面,單擊已建立Kyuubi Gateway操作列的啟動。
管理Token
在Kyuubi Gateway頁面,單擊目標Gateway操作列的Token管理。
單擊建立Token。
在建立Token對話方塊中,配置以下資訊,單擊確定。
參數
說明
名稱
建立Token的名稱。
到期時間
設定該Token的到期時間。設定的天數應大於或等於1。預設情況下為開啟狀態,365天后到期。
指派至
在下拉框中,選擇您在存取控制中添加的RAM使用者或者RAM角色。
指定分配Token的RAM使用者或RAM角色,用於在串連Kyuubi Gateway提交Spark任務時訪問DLF。
複製Token資訊。
重要Token建立完成後,請務必立即複製新Token的資訊,後續不支援查看。如果您的Token到期或遺失,請選擇建立Token或重設Token。
串連Kyuubi Gateway
在串連Kyuubi Gateway時,請根據您的實際情況替換JDBC URL中的資訊:
<endpoint>:您在總覽頁簽擷取的Endpoint資訊。<port>:連接埠號碼。使用外網網域名稱訪問時連接埠號碼為443,使用內網網域名稱訪問時連接埠號碼為80。<token>:您在Token管理頁簽複製的Token資訊。<tokenname>:Token名稱。您可以在Token管理頁簽擷取。<UserName/RoleName>:您在存取控制中添加的RAM使用者或RAM角色。
使用Beeline串連
在串連Kyuubi Gateway時,請確保您使用的Beeline版本與Kyuubi服務端版本相容。如果您未安裝Beeline,詳情請參見Getting Started - Apache Kyuubi。
請根據資料目錄頁面Catalog的預設使用方式,選擇以下對應的操作方式。
使用DLF(之前稱為DLF 2.5)
beeline -u "jdbc:hive2://<endpoint>:<port>/;transportMode=http;user=<UserName/RoleName>;httpPath=cliservice/token/<token>"使用其他Catalog
beeline -u "jdbc:hive2://<endpoint>:<port>/;transportMode=http;httpPath=cliservice/token/<token>"使用Beeline串連時支援修改會話參數,例如beeline -u "jdbc:hive2://<endpoint>:<port>/;transportMode=http;httpPath=cliservice/token/<token>;#spark.sql.shuffle.partitions=100;spark.executor.instances=2;"。
使用Java串連
更新pom.xml。
使用適當版本的依賴項以替換
hadoop-common和hive-jdbc。<dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>2.3.9</version> </dependency> </dependencies>編寫Java代碼,串連Kyuubi Gateway。
請根據資料目錄頁面Catalog的預設使用方式,選擇以下對應的操作方式。
使用DLF(之前稱為DLF 2.5)
import org.apache.hive.jdbc.HiveStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; public class Main { public static void main(String[] args) throws Exception { String url = "jdbc:hive2://<endpoint>:<port>/;transportMode=http;httpPath=cliservice/token/<token>;user=<UserName/RoleName>"; Class.forName("org.apache.hive.jdbc.HiveDriver"); Connection conn = DriverManager.getConnection(url); HiveStatement stmt = (HiveStatement) conn.createStatement(); String sql = "select * from students;"; System.out.println("Running " + sql); ResultSet res = stmt.executeQuery(sql); ResultSetMetaData md = res.getMetaData(); String[] columns = new String[md.getColumnCount()]; for (int i = 0; i < columns.length; i++) { columns[i] = md.getColumnName(i + 1); } while (res.next()) { System.out.print("Row " + res.getRow() + "=["); for (int i = 0; i < columns.length; i++) { if (i != 0) { System.out.print(", "); } System.out.print(columns[i] + "='" + res.getObject(i + 1) + "'"); } System.out.println(")]"); } conn.close(); } }使用其他Catalog
import org.apache.hive.jdbc.HiveStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; public class Main { public static void main(String[] args) throws Exception { String url = "jdbc:hive2://<endpoint>:<port>/;transportMode=http;httpPath=cliservice/token/<token>"; Class.forName("org.apache.hive.jdbc.HiveDriver"); Connection conn = DriverManager.getConnection(url); HiveStatement stmt = (HiveStatement) conn.createStatement(); String sql = "select * from students;"; System.out.println("Running " + sql); ResultSet res = stmt.executeQuery(sql); ResultSetMetaData md = res.getMetaData(); String[] columns = new String[md.getColumnCount()]; for (int i = 0; i < columns.length; i++) { columns[i] = md.getColumnName(i + 1); } while (res.next()) { System.out.print("Row " + res.getRow() + "=["); for (int i = 0; i < columns.length; i++) { if (i != 0) { System.out.print(", "); } System.out.print(columns[i] + "='" + res.getObject(i + 1) + "'"); } System.out.println(")]"); } conn.close(); } }
使用Python串連
執行以下命令,安裝PyHive和Thrift包。
pip3 install pyhive thrift編寫Python指令碼,串連Kyuubi Gateway。
以下是一個Python指令碼樣本,展示如何串連到Kyuubi Gateway並顯示資料庫列表。
請根據資料目錄頁面Catalog的預設使用方式,選擇以下對應的操作方式。
使用DLF(之前稱為DLF 2.5)
from pyhive import hive if __name__ == '__main__': cursor = hive.connect('<endpoint>', port="<port>", scheme='http', username='<UserName/RoleName>', password='<token>').cursor() cursor.execute('show databases') print(cursor.fetchall()) cursor.close()使用其他Catalog
from pyhive import hive if __name__ == '__main__': cursor = hive.connect('<endpoint>', port="<port>", scheme='http', username='<tokenname>', password='<token>').cursor() cursor.execute('show databases') print(cursor.fetchall()) cursor.close()
使用REST API串連
Kyuubi Gateway提供了開源相容的REST API,支援通過HTTP協議與Kyuubi服務進行互動。目前僅支援以下API路徑:
/api/v1/sessions/*/api/v1/operations/*/api/v1/batches/*
本文通過以下樣本為您介紹如何使用REST API串連Kyuubi Gateway。
樣本1:啟動Session並進行SQL查詢。
建立Session並指定Spark配置。
請根據資料目錄頁面Catalog的預設使用方式,選擇以下對應的操作方式。
說明spark.emr.serverless.kyuubi.engine.queue用於指定Spark任務運行時所使用的隊列。請根據實際情況替換<dev_queue>為具體的隊列名。<UserName/Rolename>:替換為實際的使用者名稱或角色名稱。<password>:僅作為預留位置,可填寫任意值。
使用DLF(之前稱為DLF 2.5)
curl -X 'POST' \ 'http://<endpoint>:<port>/api/v1/sessions/token/<token>' \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -u '<UserName/Rolename>:<password>' \ -d '{ "configs": { "set:hivevar:spark.emr.serverless.kyuubi.engine.queue": "<dev_queue>" } }'使用其他Catalog
curl -X 'POST' \ 'http://<endpoint>:<port>/api/v1/sessions/token/<token>' \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "configs": { "set:hivevar:spark.emr.serverless.kyuubi.engine.queue": "<dev_queue>" } }'返回如下類似資訊。其中,
identifier表示Kyuubi的Session Handle,用於唯一標識一個會話。本文中將以<sessionHandle>指代該值。{"identifier":"619e6ded-xxxx-xxxx-xxxx-c2a43f6fac46","kyuubiInstance":"0.0.0.0:10099"}建立Statement。
使用DLF(之前稱為DLF 2.5)
curl -X 'POST' \ 'http://<endpoint>:<port>/api/v1/sessions/<sessionHandle>/operations/statement/token/<token>' \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -u '<UserName/RoleName>:<password>' \ -d '{ "statement": "select * from test;", "runAsync": true, "queryTimeout": 0, "confOverlay": { "additionalProp1": "string", "additionalProp2": "string" } }'使用其他Catalog
curl -X 'POST' \ 'http://<endpoint>:<port>/api/v1/sessions/<sessionHandle>/operations/statement/token/<token>' \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "statement": "select * from test;", "runAsync": true, "queryTimeout": 0, "confOverlay": { "additionalProp1": "string", "additionalProp2": "string" } }'返回如下類似資訊。這裡的
identifier表示Kyuubi的Operation Handle,用於唯一標識一個具體的操作。本文中將以<operationHandle>指代該值。{"identifier":"a743e8ff-xxxx-xxxx-xxxx-a66fec66cfa4"}擷取Statement狀態。
使用DLF(之前稱為DLF 2.5)
curl --location -X 'GET' \ 'http://<endpoint>:<port>/api/v1/operations/<operationHandle>/event/token/<token>' \ -H 'accept: application/json' \ -u '<UserName/RoleName>:<password>'使用其他Catalog
curl --location -X 'GET' \ 'http://<endpoint>:<port>/api/v1/operations/<operationHandle>/event/token/<token>' \ -H 'accept: application/json'擷取Statement結果。
使用DLF(之前稱為DLF 2.5)
curl --location -X 'GET' \ 'http://<endpoint>:<port>/api/v1/operations/<operationHandle>/rowset/token/<token>/?maxrows=100&fetchorientation=FETCH_NEXT' \ -H 'accept: application/json' \ -u '<UserName/RoleName>:<password>'使用其他Catalog
curl --location -X 'GET' \ 'http://<endpoint>:<port>/api/v1/operations/<operationHandle>/rowset/token/<token>/?maxrows=100&fetchorientation=FETCH_NEXT' \ -H 'accept: application/json'
樣本2:使用batches介面提交批作業。
通過REST API提交一個Spark批處理任務到Kyuubi Gateway。Kyuubi Gateway會根據請求中的參數啟動一個Spark應用程式,並執行指定的任務。
在本樣本中,除過替換
<endpoint>、<port>、<token>等資訊外,還需單擊spark-examples_2.12-3.3.1.jar,直接下載測試JAR包。說明該JAR包是Spark內建的一個簡單樣本,用於計算圓周率π的值。
使用DLF(之前稱為DLF 2.5)
curl --location \ --request POST 'http://<endpoint>:<port>/api/v1/batches/token/<token>' \ --user '<UserName/RoleName>:<password>' \ --form 'batchRequest="{ \"batchType\": \"SPARK\", \"className\": \"org.apache.spark.examples.SparkPi\", \"name\": \"kyuubi-spark-pi\", \"resource\": \"oss://bucket/path/to/spark-examples_2.12-3.3.1.jar\" }";type=application/json'使用其他Catalog
curl --location \ --request POST 'http://<endpoint>:<port>/api/v1/batches/token/<token>' \ --form 'batchRequest="{ \"batchType\": \"SPARK\", \"className\": \"org.apache.spark.examples.SparkPi\", \"name\": \"kyuubi-spark-pi\", \"resource\": \"oss://bucket/path/to/spark-examples_2.12-3.3.1.jar\" }";type=application/json'
配置並串連高可用Kyuubi Gateway
打通網路連接。
參見EMR Serverless Spark與其他VPC間網路互連打通網路連接,確保您的用戶端能夠訪問目標VPC內的Zookeeper叢集。例如,阿里雲MSE或EMR on ECS的Zookeeper組件。
啟用Kyuubi Gateway的高可用。
在建立或者編輯Kyuubi Gateway時,開啟了服務高可用並配置了相關參數,並且網路連接選擇了已打通的網路連接。
串連高可用Kyuubi Gateway。
完成上述配置後,Kyuubi Gateway將通過Zookeeper實現高可用。您可以通過REST API或JDBC串連來驗證其可用性。
在串連Kyuubi Gateway時,請根據您的實際情況替換JDBC URL中的資訊:
<endpoint>:您在總覽頁簽擷取的Endpoint資訊。<port>:連接埠號碼。使用外網網域名稱訪問時連接埠號碼為443,使用內網網域名稱訪問時連接埠號碼為80。<token>:您在Token管理頁簽複製的Token資訊。<tokenname>:Token名稱。您可以在Token管理頁簽擷取。<UserName/RoleName>:您在存取控制中添加的RAM使用者或RAM角色。
通過以下樣本為您介紹如何串連高可用Kyuubi Gateway。
使用Beeline串連
單擊kyuubi-hive-jdbc-1.9.2.jar,下載JDBC Driver JAR。
替換JDBC Driver JAR。
備份並移動原有的JDBC Driver JAR包。
mv /your_path/apache-kyuubi-1.9.2-bin/beeline-jars /bak_path說明如果您使用的是EMR on ECS,則Kyuubi的預設路徑為
/opt/apps/KYUUBI/kyuubi-1.9.2-1.0.0/beeline-jars。如果不確定Kyuubi的安裝路徑,可以通過env | grep KYUUBI_HOME命令尋找。替換為新的JDBC Driver JAR包。
cp /download/serverless-spark-kyuubi-hive-jdbc-1.9.2.jar /your_path/apache-kyuubi-1.9.2-bin/beeline-jars
使用Beeline串連。
/your_path/apache-kyuubi-1.9.2-bin/bin/beeline -u 'jdbc:hive2://<endpoint>:<port>/;transportMode=http;httpPath=cliservice/token/<token>'
使用Java串連
單擊serverless-spark-kyuubi-hive-jdbc-shaded-1.9.2.jar,下載shaded包。
安裝JDBC Driver到Maven倉庫。
執行以下命令,將Serverless Spark提供的JDBC Driver安裝到本地Maven倉庫。
mvn install:install-file \ -Dfile=/download/serverless-spark-kyuubi-hive-jdbc-shaded-1.9.2.jar \ -DgroupId=org.apache.kyuubi \ -DartifactId=kyuubi-hive-jdbc-shaded \ -Dversion=1.9.2-ss \ -Dpackaging=jar修改
pom.xml檔案。在專案的
pom.xml中添加以下依賴。<dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>org.apache.kyuubi</groupId> <artifactId>kyuubi-hive-jdbc-shaded</artifactId> <version>1.9.2-ss</version> </dependency> </dependencies>編寫Java範例程式碼。
import org.apache.kyuubi.jdbc.hive.KyuubiStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; public class Main { public static void main(String[] args) throws Exception { String url = "jdbc:hive2://<endpoint>:<port>/;transportMode=http;httpPath=cliservice/token/<token>"; Class.forName("org.apache.kyuubi.jdbc.KyuubiHiveDriver"); Connection conn = DriverManager.getConnection(url); KyuubiStatement stmt = (KyuubiStatement) conn.createStatement(); String sql = "select * from test;"; ResultSet res = stmt.executeQuery(sql); ResultSetMetaData md = res.getMetaData(); String[] columns = new String[md.getColumnCount()]; for (int i = 0; i < columns.length; i++) { columns[i] = md.getColumnName(i + 1); } while (res.next()) { System.out.print("Row " + res.getRow() + "=["); for (int i = 0; i < columns.length; i++) { if (i != 0) { System.out.print(", "); } System.out.print(columns[i] + "='" + res.getObject(i + 1) + "'"); } System.out.println(")]"); } conn.close(); } }
查看Kyuubi提交的Spark工作清單
通過Kyuubi提交的Spark任務,您可以在任務歷史功能表列的Kyuubi Application頁簽中查看詳細的任務資訊,包括應用ID、應用程式名稱、Application 狀態以及啟動時間等。這些資訊可以協助您快速瞭解和管理Kyuubi提交的Spark任務。
在Kyuubi Gateway頁面,單擊目標Kyuubi Gateway的名稱。
單擊右上方Application 列表。

在該頁面,您可以查看通過該Kyuubi提交的所有Spark任務的詳細資料。其中,應用ID(spark-xxxx)由Spark引擎產生,與Kyuubi用戶端串連時輸出的Application ID完全一致,用於唯一標識任務執行個體。
