使用 Lightning Engine

Lightning Engine 是新一代的 Apache Spark 效能,提供專屬強化功能,可大幅提升效能、成本效益和運作穩定性。

優點

Lightning Engine 的優點包括:

  • 加快資料作業速度:透過雲端儲存空間互動最佳化 (包括中繼資料處理、寫入工作負載和向量化 I/O),大幅提升效能並節省成本。

  • 智慧查詢執行:運用進階最佳化工具的強化功能,動態減少掃描的資料、最佳化資料處理作業,以及產生更有效率的執行計畫,以加快查詢速度並降低成本。

  • 簡化 AI 和機器學習工作負載:縮短 GPU 工作負載的叢集啟動時間,並使用原生 AI 和機器學習映像檔,簡化安全環境中的部署作業。

雖然 Lightning Engine 可大幅提升效能,但具體影響會因工作負載而異。這個引擎最適合使用 Spark DataFrame API、Spark Dataset API 和 Spark SQL 查詢的運算密集型工作,而非受 I/O 限制的作業。

與標準引擎的比較

Lightning Engine 是標準引擎的替代方案,可用於在 Managed Service for Apache Spark 叢集上執行 Spark 工作。下表比較 Lightning Engine 與標準引擎的啟用屬性、工作負載適用性和主要優點。

功能 標準引擎 Lightning Engine
啟用屬性 --engine=default 或取消設定標記 --engine=lightning
最佳用途 一般用途工作、開發和測試 需要大幅加速的企業級工作負載
主要福利 基準效能 最佳化雲端儲存空間互動、智慧查詢執行

需求條件

Lightning Engine 功能須符合下列規定:

  • 映像檔版本:Lightning Engine 必須搭配 Managed Service for Apache Spark 映像檔版本 2.3.3 以上版本使用。
  • 支援的工作:支援 Spark、PySpark、SparkSQL 和 SparkR。標準引擎會執行提交至 Lightning Engine 叢集的其他工作類型。

原生查詢執行

原生查詢執行 (NQE) 是 Lightning Engine 的選用元件,可為特定工作提供更深層的加速功能。這是以 Apache GlutenVelox 為基礎的原生引擎,專為 Google 硬體產品最佳化,可將部分 Spark 查詢移出 JVM 執行,進而提升效能。

建議使用 NQE 的情況
運用 Spark DataFrame API、Spark Dataset API 和 Spark SQL 查詢,從 Parquet 和 ORC 檔案讀取資料,執行運算密集型工作 (而非 I/O 繫結作業)。輸出檔案格式不會影響效能。
不建議使用 NQE 的情況
大量使用彈性分散式資料集 (RDD)、使用者定義函式 (UDF) 或大多數 Spark 機器學習 (ML) 程式庫的工作。

需求條件

原生查詢執行功能須符合下列條件:

  • 執行引擎:只有在建立叢集時啟用 Lightning 引擎,才能在叢集上使用 NQE。

  • 作業系統:僅支援 Debian-12 圖片。如果啟用 NQE 的作業使用其他 OS,就會失敗。

  • 支援的工作:支援 Spark、PySpark、SparkSQL 和 SparkR。提交至 Lightning Engine 叢集的其他工作類型,將會執行標準引擎 (不含 NQE)。

  • 機器類型:僅支援使用 Intel 或 AMD 處理器的機器系列。使用 ARM 處理器的 NQE 啟用工作會失敗 (但可受益於 Lightning Engine,無須 NQE)。

  • 沒有 GPU 和加速器:在 GPU 加速器上提交的 NQE 啟用工作會失敗 (但可透過 Lightning Engine 獲益,不需使用 NQE)。

  • 資料類型:不支援下列資料類型的輸入:

    • Byte:ORC 和 Parquet
    • 結構體、陣列、對應:Parquet

定價

如需定價資訊,請參閱 Compute Engine 上的 Managed Service for Apache Spark 定價

建立 Lightning Engine 叢集

本節說明如何建立 Managed Service for Apache Spark 叢集,並在提交至叢集的 Spark 工作中啟用 Lightning Engine。

您也可以在建立叢集時啟用叢集的原生查詢執行 (NQE) 功能,或稍後為提交至叢集的特定 Spark 作業啟用 NQE。

事前準備

  1. 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that you have the permissions required to complete this guide.

  4. Verify that billing is enabled for your Google Cloud project.

  5. Enable the Dataproc API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  6. 安裝 Google Cloud CLI。

  7. 若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

  8. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  9. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  10. Verify that you have the permissions required to complete this guide.

  11. Verify that billing is enabled for your Google Cloud project.

  12. Enable the Dataproc API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  13. 安裝 Google Cloud CLI。

  14. 若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

  15. 執行下列指令,初始化 gcloud CLI:

    gcloud init

必要的角色

您必須具備特定 IAM 角色,才能建立 Managed Service for Apache Spark 叢集,並將工作提交至該叢集。視組織政策而定,這些角色可能已獲授權。如要檢查角色授予情形,請參閱「是否需要授予角色?」一節。

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

使用者角色

如要取得建立 Managed Service for Apache Spark 叢集所需的權限,請要求管理員授予您下列 IAM 角色:

服務帳戶角色

為確保 Compute Engine 預設服務帳戶具備建立 Managed Service for Apache Spark 叢集所需的權限,請要求管理員將Managed Service for Apache Spark Worker (roles/dataproc.worker) IAM 角色授予專案的 Compute Engine 預設服務帳戶。

建立叢集

下列範例說明如何使用 Google Cloud 控制台、Google Cloud CLI、Dataproc API、Python 或 Terraform 建立 Lightning Engine 叢集。您也可以使用 GoJavaNode.js 用戶端程式庫,建立已啟用 Lightning Engine 的 Managed Service for Apache Spark 叢集。

控制台

  1. 在 Google Cloud 控制台,前往「Create an Apache Spark cluster on Compute Engine」(在 Compute Engine 上建立 Apache Spark 叢集)。詳情請參閱「使用 Google Cloud 控制台建立叢集」。

    前往「在 Compute Engine 建立 Apache Spark 叢集」

  2. 在「定義叢集」下方,勾選「啟用 Lightning Engine」核取方塊,建立已啟用 Lightning Engine 的叢集。

  3. 選用:如要預設為 Spark 作業啟用原生執行階段,請勾選「Enable Native Execution」(啟用原生執行作業) 核取方塊。

  4. 視需要設定其他叢集設定。

  5. 點選「建立」

gcloud CLI

  1. 如要建立啟用 Lightning Engine 的叢集,請執行 gcloud dataproc clusters create 指令並加上 --engine=lightning 旗標。 詳情請參閱「使用 gcloud CLI 建立叢集」。

    gcloud dataproc clusters create CLUSTER_NAME \
        --region=REGION \
        --engine=lightning \
        --image-version=2.3
    
  2. 選用:如要預設為 Spark 工作啟用原生執行階段,請加入 spark:spark.dataproc.lightningEngine.runtime=native 屬性。

    gcloud dataproc clusters create CLUSTER_NAME \
        --region=REGION \
        --engine=lightning \
        --image-version=2.3 \
        --properties='spark:spark.dataproc.lightningEngine.runtime=native'
    

API

如要建立啟用 Lightning Engine 的叢集,請傳送 clusters.create 要求。詳情請參閱使用 REST API 建立叢集

  1. 在要求主體中,將 engine 欄位設為 LIGHTNING

    {
      "projectId": "PROJECT_ID",
      "clusterName": "CLUSTER_NAME",
      "config": {
        "gceClusterConfig": {},
        "softwareConfig": {
          "imageVersion": "2.3"
        }
      },
      "engine": "LIGHTNING"
    }
    
  2. 選用:如要為所有作業預設啟用原生執行階段,請加入 spark:spark.dataproc.lightningEngine.runtime 屬性。

    {
      "projectId": "PROJECT_ID",
      "clusterName": "CLUSTER_NAME",
      "config": {
        "gceClusterConfig": {},
        "softwareConfig": {
          "imageVersion": "2.3",
          "properties": {
            "spark:spark.dataproc.lightningEngine.runtime": "native"
          }
        }
      },
      "engine": "LIGHTNING"
    }
    

Python

  1. 如要建立啟用 Lightning Engine 的叢集,請使用 create_cluster 方法,並將叢集設定中的 engine 欄位設為 LIGHTNING。詳情請參閱「使用 Python 建立叢集」。

    from google.cloud import dataproc_v1
    
    def create_lightning_cluster(project_id, region, cluster_name):
        client_options = {"api_endpoint": f"{region}-dataproc.googleapis.com:443"}
        cluster_client = dataproc_v1.ClusterControllerClient(client_options=client_options)
    
        cluster = {
            "project_id": project_id,
            "cluster_name": cluster_name,
            "config": {
                "engine": "LIGHTNING",
                "software_config": {
                    "image_version": "2.3-debian12",
                },
            }
        }
    
        operation = cluster_client.create_cluster(
            project_id=project_id,
            region=region,
            cluster=cluster
        )
        result = operation.result()
        print(f"Cluster created successfully: {result.cluster_name}")
    
  2. 選用:如要預設為 Spark 作業啟用原生執行階段,請加入 spark:spark.dataproc.lightningEngine.runtime 屬性。

    from google.cloud import dataproc_v1
    
    def create_lightning_native_cluster(project_id, region, cluster_name):
        client_options = {"api_endpoint": f"{region}-dataproc.googleapis.com:443"}
        cluster_client = dataproc_v1.ClusterControllerClient(client_options=client_options)
    
        cluster = {
            "project_id": project_id,
            "cluster_name": cluster_name,
            "config": {
                "engine": "LIGHTNING",
                "software_config": {
                    "image_version": "2.3-debian12",
                    "properties": {
                        "spark:spark.dataproc.lightningEngine.runtime": "native"
                    }
                }
            }
        }
    
        operation = cluster_client.create_cluster(
            project_id=project_id,
            region=region,
            cluster=cluster
        )
        result = operation.result()
        print(f"Cluster created successfully: {result.cluster_name}")
    

Terraform

  1. google_dataproc_cluster 資源設定中,將 engine 引數設為 LIGHTNING
  2. 如要瞭解詳情和進階選項,請參閱 google_dataproc_cluster 資源的 Terraform 官方說明文件。

驗證叢集引擎

控制台

  1. 前往 Google Cloud 控制台的「叢集詳細資料」頁面。
  2. 確認「引擎」欄位中列出 Lightning Engine 值。
  3. 如果已啟用原生查詢執行作業,請確認「原生執行作業」欄位中列出 native

gcloud

  1. 如要驗證引擎和 NQE (如果已啟用),請執行 gcloud dataproc clusters describe 指令:

    gcloud dataproc clusters describe CLUSTER_NAME --project=PROJECT_ID --region=REGION
    
  2. 檢查輸出內容的 enginelightningEngine.runtime 屬性:

    clusterName: lightning-engine-cluster
    engine: lightningEngine
    lightningEngine.runtime: native
    

使用 Lightning Engine 提交工作

建立 Lightning Engine 叢集後,將 Spark 工作提交至叢集時,系統會自動為工作啟用 Lightning Engine。

為工作啟用原生查詢執行作業

如果您在建立 Lightning Engine 叢集時啟用 Native Query Execution (NQE),除非針對特定工作停用 NQE,否則所有 Spark 工作都會啟用 NQE。

如果您在建立 Lightning Engine 叢集時未啟用 NQE,可以在提交工作時為特定工作啟用 NQE,如下列範例所示。

gcloud

如要在提交 Spark 工作時啟用原生查詢執行,請加入 spark.dataproc.lightningEngine.runtime=native 屬性:

```none
gcloud dataproc jobs submit spark \
    --cluster=CLUSTER_NAME \
    --region=REGION \
    --properties=spark.dataproc.lightningEngine.runtime=native \
    -- ...
```

API

如要在提交 Spark 工作時啟用原生查詢執行功能,請在要求中加入 spark.dataproc.lightningEngine.runtime 屬性:

```json
{
  "job":{
    "placement":{
      "clusterName": ...
    },
    "sparkJob":{
      "mainClass": ...,
      "properties":{
         "spark.dataproc.lightningEngine.runtime":"native"
      }
    }
  }
}
```

停用工作的原生查詢執行作業

如果您在建立 Lightning Engine 叢集時啟用原生查詢執行 (NQE),除非您對特定工作停用 NQE,否則所有 Spark 工作都會啟用 NQE。

提交特定 Spark 工作時,您可以停用 NQE,如下列範例所示。

gcloud

如要提交 Spark 工作時停用原生查詢執行,請將 spark.dataproc.lightningEngine.runtime=default 屬性加入 Lightning Engine 叢集:

```shell
gcloud dataproc jobs submit spark \
    --cluster=CLUSTER_NAME \
    --region=REGION \
    --properties=spark.dataproc.lightningEngine.runtime=default \
    -- ...
```

API

如要停用原生查詢執行功能,請在將 Spark 工作提交至 Lightning Engine 叢集時,加入 spark.dataproc.lightningEngine.runtime=default 屬性:

```json
{
  "job":{
    "placement":{
      "clusterName": ...
    },
    "sparkJob":{
      "mainClass": ...,
      "properties":{
         "spark.dataproc.lightningEngine.runtime":"default"
      }
    }
  }
}
```

驗證作業的原生查詢執行作業

將工作提交至 Lightning Engine 叢集後,您可以確認該工作是否已啟用原生查詢執行功能。

控制台

  1. 前往 Google Cloud 控制台的「Job Details」(工作詳細資料) 頁面。
  2. 確認「Native Execution」欄位中列出 native

gcloud

  1. 執行 gcloud dataproc jobs describe 指令:

    gcloud dataproc clusters describe JOB_ID --project=PROJECT_ID --region=REGION
    
  2. 在「屬性」部分檢查 lightningEngine.runtime 的輸出內容:

    lightningEngine.runtime: native
    

設定參數

下表總結 Lightning Engine 和原生查詢執行的主要設定參數。

參數名稱 說明 適用的引擎 預設值 預設值 (Lightning 引擎) 使用者可覆寫 (工作層級) 範圍
--engine 叢集層級設定,可在建立叢集時選取引擎。 叢集範圍 default lightning 叢集
spark:spark.dataproc.lightningEngine.runtime 叢集層級設定,可在建立叢集時選取 Lightning 引擎執行階段。 僅限 Lightning default default 叢集
spark.dataproc.lightningEngine.runtime 在 Lightning 引擎中啟用或停用原生查詢執行 (NQE) 功能。 僅限 Lightning default default 可以。可設為 nativedefault 工作

限制

在下列情況啟用原生查詢執行功能可能會導致例外狀況、Spark 不相容,或工作負載回退至預設的 Spark 引擎。

備用廣告

在下列情況下,原生查詢執行作業可能會導致工作負載回退至 Spark 執行引擎:

  • ANSI:如果啟用 ANSI 模式,執行作業會改回使用 Spark。
  • 區分大小寫模式:原生查詢執行僅支援 Spark 預設的不區分大小寫模式。如果啟用區分大小寫模式,可能會出現錯誤結果。
  • 分區資料表掃描:只有在路徑包含分區資訊時,原生查詢執行作業才會支援分區資料表掃描。否則,工作負載會改用 Spark 執行引擎。

不相容的行為

在下列情況下使用原生查詢執行作業時,可能會發生不相容的行為或產生錯誤結果:

  • JSON 函式:原生查詢執行作業支援以雙引號括住的字串,不支援單引號。使用單引號會導致結果不正確。在路徑中使用 *get_json_object 函式會傳回 NULL
  • Parquet 讀取設定
    • 即使設為 true,原生查詢執行作業也會將 spark.files.ignoreCorruptFiles 視為設為預設 false 值。
    • 原生查詢執行會忽略 spark.sql.parquet.datetimeRebaseModeInRead,只傳回 Parquet 檔案內容。系統不會考量舊版混合日曆與前置格里高里曆的差異。Spark 結果可能有所不同。
  • NaN:不支援。舉例來說,在數值比較中使用 NaN 時,可能會發生非預期的結果。
  • Spark 欄狀讀取:Spark 欄狀向量與原生查詢執行不相容,因此可能會發生嚴重錯誤。
  • 溢出:如果將隨機重組分區設為較大的數字,溢出至磁碟功能可能會觸發 OutOfMemoryException。如果發生這種情況,減少分區數量即可消除這項例外狀況。

後續步驟