Lightning Engine を使用する

Lightning Engine は次世代の Apache Spark パフォーマンスであり、パフォーマンス、費用対効果、運用の安定性を大幅に向上させるように設計された独自の機能強化が導入されています。

利点

Lightning Engine には次のようなメリットがあります。

  • データ オペレーションの高速化: メタデータの処理、書き込みワークロード、ベクトル化された I/O など、クラウド ストレージのインタラクションを最適化することで、パフォーマンスを大幅に向上させ、コストを削減します。

  • インテリジェントなクエリ実行: スキャンされるデータを動的に削減し、データ処理を最適化し、より効率的な実行プランを生成して、より高速で費用対効果の高いクエリを実現する高度なオプティマイザーの機能強化を活用します。

  • AI ワークロードと ML ワークロードの効率化: GPU ベースのワークロードのクラスタ起動時間を短縮し、AI 向けに最適化されたイメージを使用して安全な環境でのデプロイを簡素化します。

Lightning Engine はパフォーマンスを大幅に向上させますが、具体的な効果はワークロードによって異なります。I/O の制約を受けるオペレーションよりも、Spark Dataframe API、Spark Dataset API、Spark SQL クエリを活用するコンピューティング負荷の高いタスクに最適です。

標準エンジンとの比較

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 以降の 2.3 サブマイナー イメージ バージョン リリース、または 3.0.2 以降の 3.0 サブマイナー イメージ バージョン リリース(debian13 イメージと ubuntu24 イメージ)で使用する必要があります。
  • サポートされているジョブ: Spark、PySpark、SparkSQL、SparkR がサポートされています。標準エンジンは、Lightning Engine クラスタに送信された他のジョブタイプで実行されます。

ネイティブ クエリ実行

ネイティブ クエリ実行(NQE)は、Lightning Engine のオプション コンポーネントであり、特定のジョブに対する高速化をより高いレベルで実現します。これは、Apache Gluten と Velox に基づくネイティブ エンジンで、Google ハードウェア向けに最適化されています。Spark クエリの一部を JVM の外部で実行することで、パフォーマンスを向上させます。

NQE は次のような場合に推奨されます。
Spark Dataframe API と Spark Dataset API を活用するコンピューティング負荷の高いタスク、および Parquet、ORC、Apache Iceberg、Delta Lake のファイルとテーブルからデータを読み取る Spark SQL クエリ。出力ファイル形式はパフォーマンスに影響しません。
NQE は次の用途にはおすすめしません。
Resilient Distributed Datasets(RDD)、ユーザー定義関数(UDF)、ほとんどの Spark Machine Learning(ML)ライブラリ、ストレージ アクセスによる遅延を伴う I/O バウンド オペレーションに大きく依存するジョブ。

ARM でのネイティブ クエリ実行

Managed Service for Apache Spark は、2.3-ubuntu22-arm イメージを使用して、ARM アーキテクチャの Lightning Engine 内でネイティブ クエリ実行をサポートします。これは、C4A ARM VM 上の Google Axion プロセッサ向けに特別に最適化されています(Managed Service for Apache Spark でサポートされている ARM マシンタイプをご覧ください)。Google Axion C4A インスタンスは、ARM Neoverse V2 コア上に構築された ARM ベースの VM であり、費用対効果を大幅に向上させます。

Google Axion ARM インスタンスで NQE を実行すると、ハードウェア レベルの費用対効果とコアあたりの高メモリ帯域幅がソフトウェア レベルのネイティブ ベクトル化クエリ アクセラレーションと組み合わされ、クエリの実行時間と総所有コスト(TCO)が大幅に削減されます。

ARM の主なメリットは次のとおりです。

  • オープンソースの Spark と比較して 2.5 ~ 4 倍の高速化: 分析ワークロードで、オープンソースの Apache Spark と比較して 2.5 ~ 4 倍のパフォーマンス向上を実現します。
  • 費用の最適化: Google Axion C4A インスタンスの費用対効果を最大限に高めます(同等の x86 インスタンスと比較して、費用対効果が最大 65% 向上)。
  • オペレーターと形式の完全なパリティ: x86 NQE オペレーターとの完全なパリティ。Cloud Storage Parquet、Apache Iceberg、Delta Lake の各テーブル形式のネイティブ アクセラレーション。
  • コード変更なし: Spark アプリケーション コードを変更せずに、標準の構成フラグを使用して ARM クラスタでシームレスに有効化できます。

要件

ネイティブ クエリ実行機能には、次の要件が適用されます。

  • 実行エンジン: NQE は、クラスタの作成時に Lightning Engine が有効になっているクラスタでのみ使用できます。

  • サポートされているジョブ: Spark、PySpark、SparkSQL、SparkR がサポートされています。標準エンジンは、Lightning Engine クラスタに送信された他のジョブタイプで(NQE なしで)実行されます。

  • GPU とアクセラレータなし: GPU アクセラレータで送信された NQE 対応ジョブは失敗します(ただし、NQE なしで Lightning Engine を利用できます)。

  • データ型: 次のデータ型の入力はサポートされていません。

    • Byte: ORC と Parquet
    • 構造体、配列、マップ: Parquet

アーキテクチャとシステム要件

NQE の要件は、プロセッサ アーキテクチャによって異なります。

アーキテクチャ サポートされているマシンタイプ サポートされているオペレーティング システムとイメージ
x86 Intel と AMD のマシン ファミリー Debian-12 と Ubuntu-22(イメージ バージョン 2.3.3 以降の 2.3 リリース)、Debian-13 と Ubuntu-24(イメージ バージョン 3.0.2 以降の 3.0 リリース)
ARM C4A マシンシリーズ(Google Axion ARM VM) 2.3-ubuntu22-arm イメージ(バージョン 2.3.3 以降の 2.3 リリース)

料金

料金については、Managed Service for Apache Spark の料金をご覧ください。

Lightning Engine クラスタを作成する

このセクションでは、クラスタに送信された Spark ジョブで Lightning Engine を有効にする Managed Service for Apache Spark クラスタを作成する方法について説明します。

クラスタの作成時にクラスタでネイティブ クエリ実行(NQE)を有効にすることも、クラスタに送信される特定の Spark ジョブに対して後で NQE を有効にすることもできます。

始める前に

  1. Google Cloud アカウントにログインします。 Google Cloudを初めて使用する場合は、 アカウントを作成して、実際のシナリオで Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $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, if it is not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the API

  6. Install the Google Cloud CLI.

  7. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  8. To initialize the gcloud CLI, run the following command:

    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, if it is not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the API

  13. Install the Google Cloud CLI.

  14. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  15. To initialize the gcloud CLI, run the following command:

    gcloud init

必要なロール

Managed Service for Apache Spark クラスタを作成してクラスタにジョブを送信するには、特定の Identity and Access Management(IAM)ロールが必要です。組織のポリシーによっては、クラウド プロジェクトのオーナーまたはサービス管理者が、これらのロールをユーザーまたはサービス アカウントにすでに付与している場合があります。ロールの付与を確認するには、ロールを付与する必要がありますか?をご覧ください。

ロールの付与の詳細については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

ユーザーロール

Managed Service for Apache Spark クラスタの作成に必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。

サービス アカウントのロール

Compute Engine のデフォルト サービス アカウントに Managed Service for Apache Spark クラスタを作成するために必要な権限を付与するには、プロジェクトに対する Dataproc ワーカー (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 を有効にしたクラスタを作成することもできます。

コンソール

  1. [クラスタの作成] ページを開きます。
  2. [追加の構成] をクリックして、セクションを開きます。
  3. [カスタマイズとその他] を編集します。
  4. 表示されたパネルで、[Lightning Engine を有効にする] チェックボックスがオンになっていることを確認します。
  5. 省略可: Spark ジョブでネイティブ実行ランタイムをデフォルトで有効にするには、[ネイティブ実行を有効にする] チェックボックスをオンにします。
  6. [保存] をクリックします。
  7. 必要に応じて、他のクラスタ設定を構成します。
  8. [クラスタを作成] をクリックします。

ARM クラスタを作成します。

Google Axion とネイティブ クエリ実行を使用して ARM クラスタを作成するには:

  1. [ワーカーの構成] で、C4A マシンシリーズを選択し、ARM マシンタイプを選択します。
  2. [画像] で、2.3-ubuntu22-arm 画像を選択します。
  3. [追加の構成] > [カスタマイズとその他] で、[Lightning Engine を有効にする] と [ネイティブ実行を有効にする] が選択されていることを確認します。
  4. [クラスタを作成] をクリックします。

gcloud

  1. Lightning Engine を有効にしてクラスタを作成するには、--engine=lightning フラグを指定して gcloud dataproc clusters create コマンドを実行します。詳細については、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'
    
  3. NQE を使用して ARM クラスタを作成する: Google Axion C4A ARM ノードと NQE が有効になっている Managed Service for Apache Spark クラスタを作成するには:

    gcloud dataproc clusters create CLUSTER_NAME \
        --region=REGION \
        --image-version=2.3-ubuntu22-arm \
        --master-machine-type=c4a-standard-16 \
        --worker-machine-type=c4a-standard-16 \
        --engine=lightning \
        --properties='spark:spark.dataproc.lightningEngine.runtime=native'
    

API

Lightning Engine を有効にしてクラスタを作成するには、clusters.create リクエストを送信します。詳細については、REST API を使用してクラスタを作成するをご覧ください。

  1. リクエストの本文で、engine フィールドを LIGHTNING に設定します。

    {
      "projectId": "PROJECT_ID",
      "clusterName": "CLUSTER_NAME",
      "config": {
        "engine": "LIGHTNING",
        "gceClusterConfig": {},
        "softwareConfig": {
          "imageVersion": "2.3"
        }
      }
    }
    
  2. 省略可: すべてのジョブでネイティブ実行ランタイムをデフォルトで有効にするには、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

  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. 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 クラスタにジョブを送信した後、ジョブでネイティブ クエリ実行が有効になっていることを確認できます。

コンソール

  1. Google Cloud コンソールで、[ジョブ] ページに移動します。
  2. ジョブ ID をクリックして、[ジョブの詳細] ページを開きます。
  3. [ネイティブ実行] フィールドに native が表示されていることを確認します。

gcloud

  1. gcloud dataproc jobs describe コマンドを実行します。

    gcloud dataproc jobs describe JOB_ID --project=PROJECT_ID --region=REGION
    
  2. [プロパティ] セクションで 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 読み取り構成:
    • ネイティブ クエリ実行では、spark.files.ignoreCorruptFiles が true に設定されている場合でも、デフォルトの false 値に設定されているものとして扱われます。
    • ネイティブ クエリ実行は spark.sql.parquet.datetimeRebaseModeInRead を無視し、Parquet ファイルの内容のみを返します。従来のハイブリッド カレンダーと先発グレゴリオ暦の違いは考慮されません。Spark の結果は異なる場合があります。
  • NaN: 対象外です。たとえば、数値の比較で NaN を使用すると、予期しない結果が生じることがあります。
  • Spark カラム型読み取り: Spark カラム型ベクトルがネイティブ クエリ実行と互換性がないため、致命的なエラーが発生することがあります。
  • スピル: シャッフル パーティションを大きな数に設定すると、ディスクへのスピル機能が OutOfMemoryException をトリガーすることがあります。この例外が発生した場合は、パーティションの数を減らすことで例外を解消できます。

次のステップ