Lightning Engine を使用する
Lightning Engine は、Apache Spark の次世代のパフォーマンスであり、パフォーマンス、費用対効果、運用安定性を大幅に向上させるように設計された独自の機能強化が導入されています。
利点
Lightning Engine のメリットは次のとおりです。
データ オペレーションの高速化: メタデータの処理、書き込みワークロード、ベクトル化された I/O など、クラウド ストレージのインタラクションを最適化することで、パフォーマンスを大幅に向上させ、コストを削減します。
インテリジェントなクエリ実行: 高度なオプティマイザーの機能強化を活用して、スキャンされるデータを動的に削減し、データ処理を最適化し、より効率的な実行プランを生成して、より高速で費用対効果の高いクエリを実現します。
AI ワークロードと ML ワークロードの効率化: GPU ベースのワークロードのクラスタ起動時間を短縮し、ネイティブの AI イメージと ML イメージを使用して安全な環境でのデプロイを簡素化します。
Lightning Engine はパフォーマンスを大幅に向上させますが、具体的な効果はワークロードによって異なります。I/O の制約を受けるオペレーションよりも、Spark Dataframe API、Spark Dataset API、Spark SQL クエリを活用するコンピューティング負荷の高いタスクに最適です。
標準エンジンとの比較
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 Gluten と Velox に基づくネイティブ エンジンで、Google ハードウェア向けに最適化されています。このエンジンは、Spark クエリの一部を JVM の外部で実行することでパフォーマンスを向上させます。
- NQE が推奨されるのは次の場合です。
- Spark Dataframe API、Spark Dataset API、Parquet ファイルと ORC ファイルからデータを読み取る Spark SQL クエリを活用する、コンピューティング負荷の高いタスク(I/O の制約を受けるオペレーションではなく)。出力ファイル形式はパフォーマンスに影響しません。
- NQE は次の用途には推奨されません:
- Resilient Distributed Datasets(RDD)、ユーザー定義関数(UDF)、またはほとんどの Spark 機械学習(ML)ライブラリに大きく依存するジョブ。
要件
ネイティブ クエリ実行機能には、次の要件が適用されます。
実行エンジン: NQE は、クラスタの作成時に Lightning エンジンが有効になっているクラスタでのみ使用できます。
オペレーティング システム:
Debian-12イメージのみがサポートされています。他の OS を使用する NQE 対応ジョブは失敗します。サポートされているジョブ: Spark、PySpark、SparkSQL、SparkR がサポートされています。標準エンジンは、Lightning Engine クラスタに送信された他のジョブタイプで(NQE なしで)実行されます。
マシンタイプ: Intel または AMD プロセッサを使用するマシン ファミリーのみがサポートされています。ARM プロセッサを使用する NQE 対応ジョブは失敗します(ただし、NQE なしで Lightning Engine を利用できます)。
GPU とアクセラレータなし: GPU アクセラレータで送信された NQE 対応ジョブは失敗します(ただし、NQE なしで Lightning Engine を利用できます)。
データ型: 次のデータ型の入力はサポートされていません。
- Byte: ORC と Parquet
- 構造体、配列、マップ: Parquet
料金
料金については、Managed Service for Apache Spark on Compute Engine の料金をご覧ください。
Lightning Engine クラスタを作成する
このセクションでは、クラスタに送信された Spark ジョブで Lightning Engine を有効にする Managed Service for Apache Spark クラスタを作成する方法について説明します。
クラスタの作成時にクラスタでネイティブ クエリ実行(NQE)を有効にすることも、後で特定の Spark ジョブをクラスタに送信して NQE を有効にすることもできます。
始める前に
- Google Cloud アカウントにログインします。 Google Cloudを初めて使用する場合は、 アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $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 をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して 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 をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init
必要なロール
Managed Service for Apache Spark クラスタを作成してクラスタにジョブを送信するには、特定の IAM ロールが必要です。組織のポリシーによっては、これらのロールがすでに付与されている場合があります。ロール付与を確認するには、ロールを付与する必要がありますか?をご覧ください。
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
ユーザーロール
Managed Service for Apache Spark クラスタの作成に必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。
-
プロジェクトに対する Managed Service for Apache Spark 編集者 (
roles/dataproc.editor) -
Compute Engine のデフォルトのサービス アカウントに対するサービス アカウント ユーザー (
roles/iam.serviceAccountUser)
サービス アカウントのロール
Compute Engine のデフォルトのサービス アカウントに Managed Service for Apache Spark クラスタを作成するために必要な権限を付与するには、プロジェクトに対する Managed Service for Apache Spark ワークフロー (roles/dataproc.worker)IAM ロールを Compute Engine のデフォルトのサービス アカウントに付与するよう管理者に依頼してください。
クラスタを作成する
次の例は、 Google Cloud コンソール、Google Cloud CLI、Dataproc API、Python、または Terraform を使用して Lightning Engine クラスタを作成する方法を示しています。Go、Java、Node.js のクライアント ライブラリを使用して、Lightning Engine を有効にした Managed Service for Apache Spark クラスタを作成することもできます。
コンソール
Google Cloud コンソールで、Compute Engine で Apache Spark クラスタを作成するに移動します。詳細については、 Google Cloud コンソールでクラスタを作成するをご覧ください。
[クラスタを定義する] で、[Lightning Engine を有効にする] チェックボックスをオンにして、Lightning Engine が有効になっているクラスタを作成します。
省略可: Spark ジョブでネイティブ実行ランタイムをデフォルトで有効にするには、[ネイティブ実行を有効にする] チェックボックスをオンにします。
必要に応じて、他のクラスタ設定を構成します。
[作成] をクリックします。
gcloud CLI
Lightning Engine が有効なクラスタを作成するには、
--engine=lightningフラグを指定してgcloud dataproc clusters createコマンドを実行します。詳細については、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": { "gceClusterConfig": {}, "softwareConfig": { "imageVersion": "2.3" } }, "engine": "LIGHTNING" }省略可: すべてのジョブでネイティブ実行ランタイムをデフォルトで有効にするには、
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
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 プロパティを含めます。
```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 ジョブを送信するときに Lightning Engine クラスタでネイティブ クエリ実行を無効にするには、spark.dataproc.lightningEngine.runtime=default プロパティを含めます。
```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 クラスタにジョブを送信したら、ジョブでネイティブ クエリ実行が有効になっていることを確認できます。
コンソール
- Google Cloud コンソールで、[ジョブの詳細] ページに移動します。
- [ネイティブ実行] フィールドに
nativeが表示されていることを確認します。
gcloud
gcloud dataproc jobs describeコマンドを実行します。gcloud dataproc clusters 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 Engine 内でネイティブ クエリ実行(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をトリガーする可能性があります。この場合は、パーティションの数を減らすことで、この例外を解消できます。