Spark Thrift Server是Apache Spark提供的一種服務,支援通過JDBC或ODBC串連並執行SQL查詢,從而便捷地將Spark環境與現有的商業智慧(BI)工具、資料視覺化工具及其他資料分析工具整合。本文主要為您介紹如何建立並串連Spark Thrift Server。
前提條件
已建立工作空間,詳情請參見管理工作空間。
建立Spark Thrift Server會話
Spark Thrift Server建立完成後,您可以在建立Spark SQL類型任務時選擇此會話。
進入會話管理頁面。
在左側導覽列,選擇。
在Spark頁面,單擊目標工作空間名稱。
在EMR Serverless Spark頁面,單擊左側導覽列中的會話管理。
在會話管理頁面,單擊Spark Thrift Server會話頁簽。
單擊建立Spark Thrift Server會話。
在建立Spark Thrift Server會話頁面,配置以下資訊,單擊建立。
參數
說明
名稱
建立Spark Thrift Server的名稱。
長度限制為1~64個字元,僅支援字母、數字、短劃線(-)、底線(_)和空格。
部署隊列
請選擇合適的開發隊列部署會話。僅支援選擇開發或者開發和生產共用的隊列。
隊列更多資訊,請參見管理資源隊列。
引擎版本
當前會話使用的引擎版本。引擎版本號碼含義等詳情請參見引擎版本介紹。
使用Fusion加速
Fusion可加速Spark負載的運行並降低任務的總成本。有關計費資訊,請參見產品計費。有關Fusion引擎介紹,請參見Fusion引擎。
自動停止
預設開啟。45分鐘不活動後自動停止Spark Thrift Server會話。
網路連接
選擇已建立的網路連接,以便直接存取VPC內的資料來源或外部服務。有關建立網路連接的具體操作,請參見EMR Serverless Spark與其他VPC間網路互連。
Spark Thrift Server連接埠
使用外網網域名稱訪問時連接埠號碼為443,使用內網網域名稱訪問時連接埠號碼為80。
訪問憑證
僅支援Token方式。
spark.driver.cores
用於指定Spark應用程式中Driver進程所使用的CPU核心數量。預設值為1 CPU。
spark.driver.memory
用於指定Spark應用程式中Driver進程可以使用的記憶體量。預設值為3.5 GB。
spark.executor.cores
用於指定每個Executor進程可以使用的CPU核心數量。預設值為1 CPU。
spark.executor.memory
用於指定每個Executor進程可以使用的記憶體量。預設值為3.5 GB。
spark.executor.instances
Spark分配的執行器(Executor)數量。預設值為2。
動態資源分派
預設關閉。開啟後,需要配置以下參數:
executors數量下限:預設為2。
executors數量上限:如果未設定spark.executor.instances,則預設值為10。
更多記憶體配置
spark.driver.memoryOverhead:每個Driver可利用的非堆記憶體。如果未設定該參數,Spark會根據預設值自動分配,預設值為
max(384MB, 10% × spark.driver.memory)。spark.executor.memoryOverhead:每個Executor可利用的非堆記憶體。如果未設定該參數,Spark會根據預設值自動分配,預設值為
max(384MB, 10% × spark.executor.memory)。spark.memory.offHeap.size:Spark可用的堆外記憶體大小。預設值為1 GB。
僅在
spark.memory.offHeap.enabled設定為true時生效。預設情況下,當採用Fusion Engine時,該功能將處於啟用狀態,其非堆記憶體預設設定為1 GB。
Spark配置
填寫Spark配置資訊,預設以空格符分隔,例如,
spark.sql.catalog.paimon.metastore dlf。擷取Endpoint資訊。
在Spark Thrift Server會話頁簽,單擊新增的Spark Thrift Server的名稱。
在總覽頁簽,複製Endpoint資訊。
根據網路環境的不同,可以選擇以下兩種Endpoint:
外網Endpoint:適用於通過公網訪問EMR Serverless Spark的情境,例如本地開發機、外部網路或跨雲環境的訪問。此方式可能會產生流量費用,請確保採取必要的安全措施。
內網Endpoint:適用於同地區的阿里雲ECS執行個體通過內網訪問EMR Serverless Spark的情境。內網訪問免費且更加安全,但僅限同一地區的阿里雲內網環境使用。
建立Token
在Spark Thrift Server會話頁簽,單擊新增的Spark Thrift Server會話的名稱。
單擊Token管理頁簽。
單擊建立Token。
在建立Token對話方塊中,配置以下資訊,單擊確定。
參數
說明
名稱
建立Token的名稱。
到期時間
設定該Token的到期時間。設定的天數應大於或等於1。預設情況下為開啟狀態,365天后到期。
複製Token資訊。
重要Token建立完成後,請務必立即複製新Token的資訊,後續不支援查看。如果您的Token到期或遺失,請選擇建立Token或重設Token。
串連Spark Thrift Server
在串連Spark Thrift Server時,請根據您的實際情況替換以下資訊:
<endpoint>:您在總覽頁簽擷取的Endpoint(外網)或Endpoint(內網)資訊。如果使用內網Endpoint,訪問Spark Thrift Server限於同一VPC內的資源。
<port>:連接埠號碼。使用外網網域名稱訪問時連接埠號碼為443,使用內網網域名稱訪問時連接埠號碼為80。<username>:您在Token管理頁簽建立的Token的名稱。<token>:您在Token管理頁簽複製的Token資訊。
使用Python串連Spark Thrift Server
執行以下命令,安裝PyHive和Thrift包。
pip install pyhive thrift編寫Python指令碼,串連Spark Thrift Server。
以下是一個Python指令碼樣本,展示如何串連到Hive並顯示資料庫列表。根據網路環境的不同(外網或內網),您可以選擇適合的串連方式。
使用外網網域名稱串連
from pyhive import hive if __name__ == '__main__': # 替換<endpoint>、<username>和<token>為您的實際資訊。 cursor = hive.connect('<endpoint>', port=443, scheme='https', username='<username>', password='<token>').cursor() cursor.execute('show databases') print(cursor.fetchall()) cursor.close()使用內網網域名稱串連
from pyhive import hive if __name__ == '__main__': # 替換<endpoint>、<username>和<token>為您的實際資訊。 cursor = hive.connect('<endpoint>', port=80, scheme='http', username='<username>', password='<token>').cursor() cursor.execute('show databases') print(cursor.fetchall()) cursor.close()
使用Java串連Spark Thrift Server
請在您的
pom.xml中引入以下Maven依賴。<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.1.0</version> </dependency> </dependencies>說明當前Serverless Spark內建的Hive版本為2.x,因此僅支援hive-jdbc 2.x版本。
編寫Java代碼,串連Spark Thrift Server。
以下是一個Sample Java代碼,用於串連到Spark Thrift Server,並查詢資料庫列表。
使用外網網域名稱串連
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import org.apache.hive.jdbc.HiveStatement; public class Main { public static void main(String[] args) throws Exception { String url = "jdbc:hive2://<endpoint>:443/;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 = "show databases"; 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(); } }使用內網網域名稱串連
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import org.apache.hive.jdbc.HiveStatement; public class Main { public static void main(String[] args) throws Exception { String url = "jdbc:hive2://<endpoint>:80/;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 = "show databases"; 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(); } }
通過Spark Beeline串連Spark Thrift Server
如果您使用的是自建叢集,需先進入Spark的
bin目錄,然後使用beeline串連Spark Thrift Server。使用外網網域名稱串連
cd /opt/apps/SPARK3/spark-3.4.2-hadoop3.2-1.0.3/bin/ ./beeline -u "jdbc:hive2://<endpoint>:443/;transportMode=http;httpPath=cliservice/token/<token>"使用內網網域名稱串連
cd /opt/apps/SPARK3/spark-3.4.2-hadoop3.2-1.0.3/bin/ ./beeline -u "jdbc:hive2://<endpoint>:80/;transportMode=http;httpPath=cliservice/token/<token>"說明代碼中的
/opt/apps/SPARK3/spark-3.4.2-hadoop3.2-1.0.3是以EMR on ECS 叢集的Spark安裝路徑為例,實際應根據用戶端的Spark安裝路徑進行相應調整。如果您不確定Spark的安裝路徑,可以通過env | grep SPARK_HOME命令尋找。如果您使用的是EMR on ECS 叢集,可以直接使用Spark Beeline用戶端串連到Spark Thrift Server。
使用外網網域名稱串連
spark-beeline -u "jdbc:hive2://<endpoint>:443/;transportMode=http;httpPath=cliservice/token/<token>"使用內網網域名稱串連
spark-beeline -u "jdbc:hive2://<endpoint>:80/;transportMode=http;httpPath=cliservice/token/<token>"
在使用Hive Beeline串連Serverless Spark Thrift Server時,如果出現以下報錯,通常是由於Hive Beeline的版本與Spark Thrift Server不相容導致。因此,建議使用Hive 2.x版本的Beeline。
24/08/22 15:09:11 [main]: ERROR jdbc.HiveConnection: Error opening session
org.apache.thrift.transport.TTransportException: HTTP Response code: 404配置Apache Superset以串連Spark Thrift Server
Apache Superset是一個現代資料探索和可視化平台,具有豐富的從簡單的折線圖到高度詳細的地理空間圖表的圖表形態。更多Superset資訊,請參見Superset。
安裝依賴。
請確保您已經安裝了0.20.0版本的
thrift包。如未安裝,您可以使用以下命令安裝。pip install thrift==0.20.0啟動Superset,進入Superset介面。
更多啟動操作資訊,請參見Superset文檔。
在頁面右上方單擊DATABASE,進入Connect a database頁面。
在Connect a database頁面,選擇Apache Spark SQL。

填寫連接字串,然後配置相關資料來源參數。
使用外網網域名稱串連
hive+https://<username>:<token>@<endpoint>:443/<db_name>使用內網網域名稱串連
hive+http://<username>:<token>@<endpoint>:80/<db_name>單擊FINISH,以確認成功串連和驗證。
配置Hue以串連Spark Thrift Server
Hue是一個流行的開源Web介面,可用於與Hadoop生態系統進行互動。關於Hue的更多介紹,請參見Hue官方文檔。
安裝依賴。
請確保您已經安裝了0.20.0版本的
thrift包。如未安裝,您可以使用以下命令安裝。pip install thrift==0.20.0在Hue的設定檔中添加Spark SQL串連串。
請找到Hue的設定檔(通常位於
/etc/hue/hue.conf),並在檔案中添加以下內容。使用外網網域名稱串連
[[[sparksql]]] name = Spark Sql interface=sqlalchemy options='{"url": "hive+https://<username>:<token>@<endpoint>:443/"}'使用內網網域名稱串連
[[[sparksql]]] name = Spark Sql interface=sqlalchemy options='{"url": "hive+http://<username>:<token>@<endpoint>:80/"}'重啟Hue。
修改配置後,您需要執行以下命令重啟Hue服務以使更改生效。
sudo service hue restart驗證串連。
成功重啟後,訪問Hue介面,找到Spark SQL選項。如果配置正確,您應能夠成功串連到Spark Thrift Server並執行SQL查詢。

使用DataGrip串連Spark Thrift Server
DataGrip是面向開發人員的資料庫管理環境,旨在便捷地進行資料庫的查詢、建立和管理。資料庫可運行於本地、伺服器或雲端。如需瞭解更多關於DataGrip的資訊,請參見DataGrip。
安裝DataGrip,詳情請參見Install DataGrip。
本文樣本中的DataGrip版本為2025.1.2。
開啟DataGrip用戶端,進入DataGrip介面。
建立專案。
單擊
,選擇。
在New Project對話方塊中,輸入專案名,例如
Spark,單擊OK。
單擊Database Explorer功能表列的
表徵圖。選擇。
在Data Sources and Drivers對話方塊,配置如下參數。

頁簽
參數
說明
General
Name
自訂的串連名稱。例如,spark_thrift_server。
Authentication
選擇鑒權方式。本文選擇的No auth。
在生產環境中,請選擇User & Password,確保只有授權使用者能夠提交SQL任務,提高系統的安全性。
Driver
單擊Apache Spark,然後單擊Go to Driver ,確認Driver版本為
ver. 1.2.2。說明由於當前Serverless Spark引擎的版本為3.x,為確保系統的穩定性和功能的相容性,Driver版本必須選擇1.2.2。

URL
串連Spark Thrift Server的URL。根據網路環境的不同(外網或內網),您可以選擇適合的串連方式。
使用外網網域名稱串連
jdbc:hive2://<endpoint>:443/;transportMode=http;httpPath=cliservice/token/<token>使用內網網域名稱串連
jdbc:hive2://<endpoint>:80/;transportMode=http;httpPath=cliservice/token/<token>
Options
Run keep-alive query
該參數為可選配置。勾選該參數可防止逾時自動斷開。
單擊Test Connection,確認資料來源配置成功。

單擊OK,完成配置。
使用DataGrip管理Spark Thrift Server。
DataGrip成功串連Spark Thrift Server後,您可以進行資料開發,更多資訊請參見DataGrip協助文檔。
例如,您可以在建立的串連下,在目標表上右鍵,選擇,並在右側SQL編輯器中編寫並運行SQL指令碼,即可查看錶資料資訊。

使用Redash串連Spark Thrift Server
Redash是一款開源的BI工具,提供了基於Web的資料庫查詢和資料視覺效果功能。如需瞭解更多關於Redash的資訊,請參見Redash官方文檔。
安裝Redash,詳情請參見Redash官方文檔。
安裝依賴。
請確保您已經安裝了0.20.0版本的
thrift包。如未安裝,您可以使用以下命令安裝。pip install thrift==0.20.0登入Redash。
在左側導覽列單擊Settings,並在Data Sources頁簽下單擊+New Data Source。
在彈出的對話方塊中配置以下參數,然後單擊Create。

參數
說明
Type Selection
資料來源類型。在搜尋方塊中尋找並選擇Hive(HTTP)。
Configuration
Name
資料來源名稱。您可以自訂。
Host
Spark Thrift Server的Endpoint地址。
您可以在總覽頁簽擷取的Endpoint(外網)或Endpoint(內網)資訊。
Port
如果使用外網網域名稱訪問,連接埠號碼為443。
如果使用內網網域名稱訪問,連接埠號碼為80。
HTTP Path
固定填寫為
/cliservice。Username
使用者名稱。可以任意填寫,例如
root。Password
填寫您建立的Token資訊。
HTTP Scheme
如果使用外網網域名稱訪問,填寫為
https。如果使用內網網域名稱訪問,填寫為
http。
在頁面上方選擇,您可以在頁面的編輯框中編寫SQL語句。

查看運行記錄
在資料開發工作單位執行完成後,您可以通過會話管理頁面查看任務的運行記錄。具體操作步驟如下:
在會話列表頁面,單擊會話名稱。
單擊運行記錄頁簽。
在該頁面中,您可以查看任務的詳細運行資訊,包括運行ID,啟動時間,Spark UI等資訊。
