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 GlutenVelox に基づくネイティブ エンジンで、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 を有効にすることもできます。

始める前に

  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.

    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. 外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して 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. 外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。

  15. gcloud CLI を初期化するには、次のコマンドを実行します。

    gcloud init

必要なロール

Managed Service for Apache Spark クラスタを作成してクラスタにジョブを送信するには、特定の IAM ロールが必要です。組織のポリシーによっては、これらのロールがすでに付与されている場合があります。ロール付与を確認するには、ロールを付与する必要がありますか?をご覧ください。

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

ユーザーロール

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

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

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 クラスタを作成する方法を示しています。GoJavaNode.js のクライアント ライブラリを使用して、Lightning Engine を有効にした Managed Service for Apache Spark クラスタを作成することもできます。

コンソール

  1. Google Cloud コンソールで、Compute Engine で Apache Spark クラスタを作成するに移動します。詳細については、 Google Cloud コンソールでクラスタを作成するをご覧ください。

    Compute Engine で Apache Spark クラスタを作成するに移動

  2. [クラスタを定義する] で、[Lightning Engine を有効にする] チェックボックスをオンにして、Lightning Engine が有効になっているクラスタを作成します。

  3. 省略可: Spark ジョブでネイティブ実行ランタイムをデフォルトで有効にするには、[ネイティブ実行を有効にする] チェックボックスをオンにします。

  4. 必要に応じて、他のクラスタ設定を構成します。

  5. [作成] をクリックします。

gcloud CLI

  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'
    

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

コンソール

  1. Google Cloud コンソールで、[ジョブの詳細] ページに移動します。
  2. [ネイティブ実行] フィールドに 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) ユーザーによるオーバーライド可能(ジョブレベル) 範囲
--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 をトリガーする可能性があります。この場合は、パーティションの数を減らすことで、この例外を解消できます。

次のステップ