全部產品
Search
文件中心

E-MapReduce:管理Spark Thrift Server會話

更新時間:Apr 21, 2026

Spark Thrift Server是Apache Spark提供的一種服務,支援通過JDBC或ODBC串連並執行SQL查詢,從而便捷地將Spark環境與現有的商業智慧(BI)工具、資料視覺化工具及其他資料分析工具整合。本文主要為您介紹如何建立並串連Spark Thrift Server

前提條件

已建立工作空間,詳情請參見管理工作空間

建立Spark Thrift Server會話

Spark Thrift Server建立完成後,您可以在建立Spark SQL類型任務時選擇此會話。

  1. 進入會話管理頁面。

    1. 登入E-MapReduce控制台

    2. 在左側導覽列,選擇EMR Serverless > Spark

    3. Spark頁面,單擊目標工作空間名稱。

    4. EMR Serverless Spark頁面,單擊左側導覽列中的會話管理

  2. 会话管理頁面,單擊Spark Thrift Server 会话頁簽。

  3. 單擊创建 Spark Thrift Server 会话

  4. 创建 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

  5. 擷取Endpoint資訊。

    1. Spark Thrift Server 会话頁簽,單擊新增的Spark Thrift Server的名稱。

    2. 总览頁簽,複製Endpoint資訊。

      根據網路環境的不同,可以選擇以下兩種Endpoint:

      • 外網Endpoint:適用於通過公網訪問EMR Serverless Spark的情境,例如本地開發機、外部網路或跨雲環境的訪問。此方式可能會產生流量費用,請確保採取必要的安全措施。

      • 內網Endpoint:適用於同地區的阿里雲ECS執行個體通過內網訪問EMR Serverless Spark的情境。內網訪問免費且更加安全,但僅限同一地區的阿里雲內網環境使用。

建立Token

  1. Spark Thrift Server 会话頁簽,單擊新增的Spark Thrift Server會話的名稱。

  2. 單擊Token 管理頁簽。

  3. 單擊创建 Token

  4. 创建 Token對話方塊中,配置以下資訊,單擊确定

    參數

    說明

    名称

    建立Token的名稱。

    过期时间

    設定該Token的到期時間。設定的天數應大於或等於1。預設情況下為開啟狀態,365天后到期。

  5. 複製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

  1. 執行以下命令,安裝PyHive和Thrift包。

    pip install pyhive thrift
  2. 編寫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

  1. 請在您的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版本。

  2. 編寫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

  1. 安裝依賴。

    請確保您已經安裝了0.20.0版本的 thrift 包。如未安裝,您可以使用以下命令安裝。

    pip install thrift==0.20.0
  2. 啟動Superset,進入Superset介面。

    更多啟動操作資訊,請參見Superset文檔

  3. 在頁面右上方單擊DATABASE,進入Connect a database頁面。

  4. Connect a database頁面,選擇Apache Spark SQL

    image

  5. 填寫連接字串,然後配置相關資料來源參數。

    使用外網網域名稱串連

    hive+https://<username>:<token>@<endpoint>:443/<db_name>

    使用內網網域名稱串連

    hive+http://<username>:<token>@<endpoint>:80/<db_name>
  6. 單擊FINISH,以確認成功串連和驗證。

配置Hue以串連Spark Thrift Server

Hue是一個流行的開源Web介面,可用於與Hadoop生態系統進行互動。關於Hue的更多介紹,請參見Hue官方文檔

  1. 安裝依賴。

    請確保您已經安裝了0.20.0版本的 thrift 包。如未安裝,您可以使用以下命令安裝。

    pip install thrift==0.20.0
  2. 在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/"}'
  3. 重啟Hue。

    修改配置後,您需要執行以下命令重啟Hue服務以使更改生效。

    sudo service hue restart
  4. 驗證串連。

    成功重啟後,訪問Hue介面,找到Spark SQL選項。如果配置正確,您應能夠成功串連到Spark Thrift Server並執行SQL查詢。

    image

使用DataGrip串連Spark Thrift Server

DataGrip是面向開發人員的資料庫管理環境,旨在便捷地進行資料庫的查詢、建立和管理。資料庫可運行於本地、伺服器或雲端。如需瞭解更多關於DataGrip的資訊,請參見DataGrip

  1. 安裝DataGrip,詳情請參見Install DataGrip

    本文樣本中的DataGrip版本為2025.1.2。

  2. 開啟DataGrip用戶端,進入DataGrip介面。

  3. 建立專案。

    1. 單擊image,選擇New

      image

    2. New Project對話方塊中,輸入專案名,例如Spark,單擊OK

  4. 單擊Database Explorer功能表列的 建立串連表徵圖。選擇Data Source > Other > Apache Spark

    image

  5. Data Sources and Drivers對話方塊,配置如下參數。

    image

    頁簽

    參數

    說明

    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。

    image

    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

    該參數為可選配置。勾選該參數可防止逾時自動斷開。

  6. 單擊Test Connection,確認資料來源配置成功。

    image

  7. 單擊OK,完成配置。

  8. 使用DataGrip管理Spark Thrift Server。

    DataGrip成功串連Spark Thrift Server後,您可以進行資料開發,更多資訊請參見DataGrip協助文檔

    例如,您可以在建立的串連下,在目標表上右鍵,選擇New,並在右側SQL編輯器中編寫並運行SQL指令碼,即可查看錶資料資訊。

    image

使用Redash串連Spark Thrift Server

Redash是一款開源的BI工具,提供了基於Web的資料庫查詢和資料視覺效果功能。如需瞭解更多關於Redash的資訊,請參見Redash官方文檔

  1. 安裝Redash,詳情請參見Redash官方文檔

  2. 安裝依賴。

    請確保您已經安裝了0.20.0版本的thrift包。如未安裝,您可以使用以下命令安裝。

    pip install thrift==0.20.0
  3. 登入Redash。

  4. 在左側導覽列單擊Settings,並在Data Sources頁簽下單擊+New Data Source

  5. 在彈出的對話方塊中配置以下參數,然後單擊Create

    image

    參數

    說明

    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

  6. 在頁面上方選擇,您可以在頁面的編輯框中編寫SQL語句。

    image

使用dbt串連Spark Thrift Server

dbt(data build tool)是一個資料轉換工具,它允許資料分析師和工程師使用SQL編寫資料轉換邏輯,並以軟體工程的最佳實務(如版本控制、測試、文檔)來管理和部署這些轉換。如需瞭解更多關於dbt的資訊,請參見dbt官方文檔

  1. 安裝dbt。

    pip install dbt-spark

    如果您需要使用Hive連接器,也可以安裝:

    pip install dbt-spark[HIVE]
  2. 建立dbt專案。

    dbt init my_spark_project
    cd my_spark_project
  3. 配置dbt profile。

    ~/.dbt/profiles.yml檔案中配置Spark Thrift Server串連資訊:

    使用外網網域名稱串連

    my_spark_project:
      target: dev
      outputs:
        dev:
          type: spark
          method: thrift
          host: <endpoint>
          port: 443
          user: <username>
          password: <token>
          schema: default
          connect_retries: 5
          connect_timeout: 60
          retry_all: true
          use_ssl: true
          server_side_parameters:
            "hive.exec.dynamic.partition": "true"
            "hive.exec.dynamic.partition.mode": "nonstrict"

    使用內網網域名稱串連

    my_spark_project:
      target: dev
      outputs:
        dev:
          type: spark
          method: thrift
          host: <endpoint>
          port: 80
          user: <username>
          password: <token>
          schema: default
          connect_retries: 5
          connect_timeout: 60
          retry_all: true
          use_ssl: false
          server_side_parameters:
            "hive.exec.dynamic.partition": "true"
            "hive.exec.dynamic.partition.mode": "nonstrict"
  4. 測試連接。

    dbt debug

    如果串連成功,您將看到類似以下的輸出:

    Connection test: [OK connection ok]
  5. 建立dbt模型。

    models/目錄下建立SQL檔案,例如models/example_model.sql

    {{ config(materialized='table') }} select col1, col2, current_timestamp() as created_at from {{ ref('source_table') }} where col1 is not null
  6. 運行dbt專案。

    # 運行所有模型
    dbt run
    
    # 運行特定模型
    dbt run --models example_model
    
    # 運行測試
    dbt test
    
    # 產生文檔
    dbt docs generate
    dbt docs serve
  7. 配置源表和測試。

    models/schema.yml檔案中定義源表和測試:

    version: 2
    
    sources:
      - name: raw_data
        description: "Raw data from source systems"
        tables:
          - name: source_table
            description: "Source table containing raw data"
            columns:
              - name: col1
                description: "Primary identifier"
                tests:
                  - not_null
                  - unique
              - name: col2
                description: "Data column"
    
    models:
      - name: example_model
        description: "Transformed data model"
        columns:
          - name: col1
            description: "Primary identifier"
            tests:
              - not_null
              - unique
          - name: col2
            description: "Processed data column"
          - name: created_at
            description: "Record creation timestamp"

注意事項:

  • 確保您的dbt版本與Spark Thrift Server相容。建議使用dbt-spark 1.3.0或更高版本。

  • 在生產環境中,建議將敏感資訊(如Token)通過環境變數進行配置,而不是直接寫在設定檔中。

  • 如果遇到連線逾時問題,可以適當調整connect_timeoutconnect_retries參數。

  • 對於大型資料集,建議使用增量模型以提高效能:

{{ config(
    materialized='incremental',
    unique_key='id',
    incremental_strategy='merge'
) }} select * from source_table {% if is_incremental() %} where updated_at > (select max(updated_at) from {{ this }}) {% endif %}

通過以上配置,您就可以使用dbt串連到Spark Thrift Server,並利用dbt的強大功能進行資料轉換和管理。

查看運行記錄

在資料開發工作單位執行完成後,您可以通過會話管理頁面查看任務的運行記錄。具體操作步驟如下:

  1. 在會話列表頁面,單擊會話名稱。

  2. 單擊運行記錄頁簽。

    在該頁面中,您可以查看任務的詳細運行資訊,包括運行ID,啟動時間,Spark UI等資訊。

    image