使用 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 |
|---|---|---|
| CLI 旗標 | --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 Gluten 和 Velox 為基礎的原生引擎,專為 Google 硬體產品 最佳化,可將部分 Spark 查詢作業移出 JVM 執行,進而提升效能。
- 建議使用 NQE 的情況:
- 運用 Spark DataFrame API 和 Spark Dataset API 的運算密集型工作,以及從 Parquet 和 ORC 檔案讀取資料的 Spark SQL 查詢。輸出檔案格式不會影響效能。
- 不建議使用 NQE 的情況:
- 大量依賴彈性分散式資料集 (RDD)、使用者定義函式 (UDF)、大多數 Spark 機器學習 (ML) 程式庫,以及因儲存空間存取而延遲的 I/O 繫結作業。
需求條件
原生查詢執行功能須符合下列條件:
執行引擎:只有在建立叢集時啟用 Lightning 引擎,才能在叢集上使用 NQE。
作業系統:僅支援
Debian-12和Ubuntu-22作業系統。如果啟用 NQE 的工作使用其他作業系統,就會失敗。支援的工作:支援 Spark、PySpark、SparkSQL 和 SparkR。提交至 Lightning Engine 叢集的其他工作類型,將會執行標準引擎 (不含 NQE)。
機器類型:僅支援使用 Intel 或 AMD 處理器的機器系列。使用 ARM 處理器的 NQE 啟用工作會失敗 (但可從 Lightning Engine 獲益,無須 NQE)。
沒有 GPU 和加速器:在 GPU 加速器上提交的 NQE 啟用工作會失敗 (但可透過 Lightning Engine 獲益,不需使用 NQE)。
資料類型:不支援下列資料類型的輸入:
- 位元組:ORC 和 Parquet
- 結構體、陣列、對應:Parquet
定價
如需定價資訊,請參閱 Managed Service for Apache Spark 定價。
建立 Lightning Engine 叢集
本節說明如何建立 Managed Service for Apache Spark 叢集,在提交至叢集的 Spark 工作中啟用 Lightning Engine。
您也可以在建立叢集時啟用叢集的原生查詢執行 (NQE) 功能,或稍後為提交至叢集的特定 Spark 作業啟用 NQE。
事前準備
- 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
-
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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that you have the permissions required to complete this guide.
-
Verify that billing is enabled for your Google Cloud project.
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 theserviceusage.services.enablepermission. Learn how to grant roles.-
安裝 Google Cloud CLI。
-
若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI。
-
執行下列指令,初始化 gcloud CLI:
gcloud init -
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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that you have the permissions required to complete this guide.
-
Verify that billing is enabled for your Google Cloud project.
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 theserviceusage.services.enablepermission. Learn how to grant roles.-
安裝 Google Cloud CLI。
-
若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI。
-
執行下列指令,初始化 gcloud CLI:
gcloud init
必要的角色
您必須具備特定 IAM 角色,才能建立 Managed Service for Apache Spark 叢集,並將工作提交至叢集。視機構政策而定,雲端專案擁有者或服務管理員可能已將這些角色授予您或服務帳戶。如要檢查角色授權,請參閱「是否需要授予角色?」一節。
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
使用者角色
如要取得建立 Managed Service for Apache Spark 叢集所需的權限,請要求管理員授予您下列 IAM 角色:
-
全部:
- 專案的 Dataproc 編輯者 (
roles/dataproc.editor) - Compute Engine 預設服務帳戶的「服務帳戶使用者」 (
roles/iam.serviceAccountUser)
- 專案的 Dataproc 編輯者 (
服務帳戶角色
為確保 Compute Engine 預設服務帳戶具備建立 Managed Service for Apache Spark 叢集的必要權限,請要求管理員在專案中,將 Dataproc Worker (roles/dataproc.worker) IAM 角色授予 Compute Engine 預設服務帳戶。
建立叢集
下列範例說明如何使用 Google Cloud 控制台、Google Cloud CLI、Dataproc API、Python 適用的 Cloud 用戶端程式庫或 Terraform,建立 Lightning Engine 叢集。您也可以使用 Go、Java 和 Node.js 適用的 Cloud 用戶端程式庫,建立已啟用 Lightning Engine 的叢集。
控制台
在 Google Cloud 控制台,前往「Create an Apache Spark cluster on Compute Engine」(在 Compute Engine 上建立 Apache Spark 叢集)。詳情請參閱使用Google Cloud 控制台建立叢集。
在「定義叢集」下方,勾選「啟用 Lightning Engine」核取方塊。
選用:如要預設為 Spark 作業啟用原生執行階段,請勾選「Enable Native Execution」(啟用原生執行作業) 核取方塊。
視需要設定其他叢集設定。
點選「建立」。
gcloud CLI
如要建立啟用 Lightning Engine 的叢集,請執行
gcloud dataproc clusters create指令並加上--engine=lightning標記。詳情請參閱使用 gcloud CLI 建立叢集。gcloud dataproc clusters create CLUSTER_NAME \ --region=REGION \ --engine=lightning \ --image-version=2.3選用:如要預設為 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 建立叢集。
在要求主體中,將
engine欄位設為LIGHTNING。{ "projectId": "PROJECT_ID", "clusterName": "CLUSTER_NAME", "config": { "engine": "LIGHTNING", "gceClusterConfig": {}, "softwareConfig": { "imageVersion": "2.3" } } }選用:如要為所有作業預設啟用原生執行階段,請加入
spark:spark.dataproc.lightningEngine.runtime屬性。{ "projectId": "PROJECT_ID", "clusterName": "CLUSTER_NAME", "config": { "engine": "LIGHTNING", "gceClusterConfig": {}, "softwareConfig": { "imageVersion": "2.3", "properties": { "spark:spark.dataproc.lightningEngine.runtime": "native" } } } }
Python
如要建立啟用 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}")選用:如要預設為 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
- 在
google_dataproc_cluster資源設定中,將engine引數設為LIGHTNING。 - 如要瞭解詳情和進階選項,請參閱
google_dataproc_cluster資源的 Terraform 官方說明文件。
驗證叢集引擎
控制台
- 前往 Google Cloud 控制台的「叢集詳細資料」頁面。
- 確認「引擎」欄位中列出
Lightning Engine值。 - 如果已啟用原生查詢執行作業,請確認
native列於「原生執行作業」欄位中。
gcloud
如要驗證引擎和 NQE (如果已啟用),請執行
gcloud dataproc clusters describe指令:gcloud dataproc clusters describe CLUSTER_NAME --project=PROJECT_ID --region=REGION檢查輸出內容的
engine和lightningEngine.runtime屬性:clusterName: lightning-engine-cluster engine: lightningEngine lightningEngine.runtime: native
使用 Lightning Engine 提交工作
如果您在建立叢集時啟用 Lightning Engine,將 Spark 工作提交至叢集時,系統預設會為工作啟用 Lightning Engine。
為工作啟用原生查詢執行作業
如果您在建立 Lightning Engine 叢集時啟用原生查詢執行 (NQE),除非在特定工作上停用 NQE,否則所有 Spark 工作都會啟用 NQE。
如果在建立 Lightning Engine 叢集時未啟用 NQE,您可以在提交工作時啟用 NQE,如下列範例所示。
gcloud
如要在提交 Spark 工作時啟用原生查詢執行作業,請加入 spark.dataproc.lightningEngine.runtime=native 屬性:
gcloud dataproc jobs submit spark \
--cluster=CLUSTER_NAME \
--region=REGION \
--properties=spark.dataproc.lightningEngine.runtime=native \
-- ...
API
如要在提交 Spark 工作時啟用原生查詢執行作業,請在要求中加入 spark.dataproc.lightningEngine.runtime 屬性:
{
"job":{
"placement":{
"clusterName": ...
},
"sparkJob":{
"mainClass": ...,
"properties":{
"spark.dataproc.lightningEngine.runtime":"native"
}
}
}
}
停用工作的原生查詢執行作業
如果您在建立 Lightning Engine 叢集時啟用原生查詢執行 (NQE),除非您在特定工作上停用 NQE,否則所有 Spark 工作都會啟用 NQE。
提交工作時,您可以停用特定 Spark 工作的 NQE,如下列範例所示。
gcloud
如要在將 Spark 工作提交至 Lightning Engine 叢集時停用原生查詢執行功能,請加入 spark.dataproc.lightningEngine.runtime=default 屬性:
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 屬性:
{
"job":{
"placement":{
"clusterName": ...
},
"sparkJob":{
"mainClass": ...,
"properties":{
"spark.dataproc.lightningEngine.runtime":"default"
}
}
}
}
驗證作業的原生查詢執行
將工作提交至 Lightning Engine 叢集後,您可以確認該工作是否已啟用原生查詢執行功能。
控制台
- 前往 Google Cloud 控制台的「Job Details」(工作詳細資料) 頁面。
- 確認「原生執行」欄位中列出
native。
gcloud
執行
gcloud dataproc jobs describe指令:gcloud dataproc jobs describe JOB_ID --project=PROJECT_ID --region=REGION在「屬性」部分中,檢查
lightningEngine.runtime的輸出內容:lightningEngine.runtime: native
設定參數
下表總結 Lightning Engine 和原生查詢執行的主要設定參數。
| 參數名稱 | 說明 | 適用的引擎 | 預設值 | 預設值 (Lightning Engine) | 使用者可覆寫 (工作層級) | 範圍 |
|---|---|---|---|---|---|---|
--engine |
叢集層級設定,可在建立叢集時選取引擎。 | 叢集範圍 | default |
lightning |
否 | 叢集 |
spark:spark.dataproc.lightningEngine.runtime |
叢集層級設定,可在建立叢集時選取 Lightning 引擎執行階段。 | 僅限 Lightning | default |
default |
否 | 叢集 |
spark.dataproc.lightningEngine.runtime |
在 Lightning 引擎中啟用或停用原生查詢執行 (NQE) 功能。 | 僅限 Lightning | default |
default |
可以。可設為 native 或 default。 |
工作 |
限制
在下列情況下啟用原生查詢執行功能可能會導致例外狀況、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。如果發生這種情況,減少分區數量即可消除這項例外狀況。