このドキュメントでは、Lightning Engine を有効にして、Managed Service for Apache Spark のバッチ ワークロードとインタラクティブ セッションを高速化する方法について説明します。
概要
Lightning Engine は、クエリや実行の最適化などの従来の最適化手法と、ファイル システムレイヤやデータアクセス コネクタでのキュレートされた最適化を実行するマルチレイヤ最適化エンジンを搭載した、高パフォーマンスのクエリ アクセラレータです。
次の図に示すように、Lightning Engine は、TPC-H のようなワークロード(10 TB データセット サイズ)で Spark クエリの実行パフォーマンスを高速化します。
詳細については、Lightning Engine のご紹介 - Apache Spark を次世代のパフォーマンスにをご覧ください。
Lightning Engine の可用性
Lightning Engine とネイティブ クエリ実行は、Managed Service for Apache Spark ランタイム
2.3で使用できます。Lightning Engine とネイティブ クエリ実行は、3.0ランタイムでは使用できません。Lightning Engine は、Managed Service for Apache Spark のプレミアム料金ティアでのみ使用できます。
バッチ ワークロード: Lightning Engine は、プレミアム ティアのバッチ ワークロードに対して自動的に有効になります。このため、ご対応は不要です。
インタラクティブ セッション: Lightning Engine は、インタラクティブ セッションではデフォルトで有効になっていません。有効にするには、Lightning Engine を有効にするをご覧ください。
ランタイム プロファイル(セッション テンプレート): Google Cloud コンソールでランタイム プロファイルを作成すると、デフォルトで [プレミアム] ティアと [Lightning Engine を有効にしてパフォーマンスを高速化する] が選択されます。Google Cloud CLI または Dataproc API を使用してセッション テンプレートを作成する場合、Lightning Engine はデフォルトで有効になりません。有効化または構成するには、Lightning Engine を有効にするをご覧ください。
Lightning Engine を有効にする
以降のセクションでは、Managed Service for Apache Spark のバッチ ワークロード、ランタイム プロファイル(セッション テンプレート)、インタラクティブ セッションで Lightning Engine を有効にする方法について説明します。
バッチ ワークロード
バッチ ワークロードで Lightning Engine を有効にする
Google Cloud コンソール、Google Cloud CLI、または Dataproc API を使用して、バッチ ワークロードで Lightning Engine を有効にできます。
コンソール
Google Cloud コンソールを使用して、バッチ ワークロードで Lightning Engine を有効にします。
Google Cloud コンソールで、Managed Service for Apache Spark の [ジョブ] ページに移動します。
[ジョブを送信] をクリックして、[ジョブを送信] ページを開きます。
[ジョブのコンピュート タイプの選択] で、[サーバーレス Spark] が選択されていることを確認します。
[サーバーレス ジョブの詳細] セクションで、次の操作を行います。
- [ランタイム プロファイル] を選択するか、リージョンの [デフォルトのサービス構成] をそのまま使用します。[概要] カードで [構成] をクリックするか、[ランタイム プロファイル] メニューで [新しいプロファイルを作成] をクリックして、ランタイム プロファイル構成パネルを開きます。
ティア: [プレミアム] を選択します。これにより、[Lightning Engine を有効にしてパフォーマンスを向上させる] が自動的に有効になり、オンになります。
プレミアム ティアを選択すると、ドライバとエグゼキュータのコンピューティング ティアが
Premiumに設定されます。これらの自動的に設定されたプレミアム ティアのコンピューティング設定は、3.0より前のランタイムを使用するバッチではオーバーライドできません。追加構成:
- ランタイム構成: [編集] をクリックし、[Spark ランタイム バージョン] で
2.3を選択して、[保存] をクリックします。 - エグゼキュータとドライバの構成: 省略可: [編集] をクリックして、[ドライバ ディスク] と [エグゼキュータ ディスク] を [プレミアム(SSD)] に構成するか、デフォルトの [標準(HDD)] 値のままにして、[保存] をクリックします。プレミアム ディスク階層を選択する場合は、ディスクサイズを選択する必要があります。詳細については、リソース割り当てプロパティをご覧ください。
- ランタイム構成: [編集] をクリックし、[Spark ランタイム バージョン] で
[設定を使用](または [新しいプロファイルを保存])をクリックします。
[ジョブの実行とプロパティ] セクションの [Spark プロパティ](または、[追加構成] > [その他のカスタマイズ] > [Spark プロパティ] のランタイム プロファイル構成パネル)で、必要に応じて [プロパティを追加] をクリックし、ネイティブ クエリ実行ランタイムを選択する場合は、次のキー(プロパティ名)と値のペアを入力します。
キー 値 spark.dataproc.lightningEngine.runtime先住民 [ジョブの送信] ページで、[ファイルとアーティファクト] とその他のバッチ ワークロードの設定を入力します。Spark バッチ ワークロードを送信するをご覧ください。
[送信] をクリックして、Spark バッチ ワークロードを実行します。
gcloud
次の gcloud CLI gcloud dataproc batches submit spark コマンドフラグを設定して、バッチ ワークロードで Lightning Engine を有効にします。
gcloud dataproc batches submit spark \ --project=PROJECT_ID \ --region=REGION \ --version=2.3 \ --properties=dataproc.tier=premium \ OTHER_FLAGS_AS_NEEDED
注:
- PROJECT_ID: 実際の Google Cloud プロジェクト ID。プロジェクト ID は、 Google Cloud コンソールのダッシュボードの [プロジェクト情報] セクションに表示されます。
- REGION: ワークロードを実行できる利用可能な Compute Engine リージョン。
--properties=dataproc.tier=premium。プレミアム ティアを設定すると、バッチ ワークロードに次のプロパティが自動的に設定されます。spark.dataproc.engine=lightningEngineは、バッチ ワークロードに Lightning Engine を選択します。spark.dataproc.driver.compute.tierとspark.dataproc.executor.compute.tierはpremiumに設定されます(リソース割り当てプロパティをご覧ください)。これらの自動的に設定されたプレミアム ティアのコンピューティング設定は、3.0より前のランタイムを使用するバッチではオーバーライドできません。
その他のプロパティ
ネイティブ クエリ エンジン:
spark.dataproc.lightningEngine.runtime=nativeネイティブ クエリ実行ランタイムを選択する場合は、このプロパティを追加します。ディスク階層とサイズ: デフォルトでは、ドライバとエグゼキュータのディスクサイズは
standardの階層とサイズに設定されています。プロパティを追加して、premiumディスク階層とサイズ(375 GiBの倍数)を選択できます。
詳細については、リソース割り当てプロパティをご覧ください。
OTHER_FLAGS_AS_NEEDED: Spark バッチ ワークロードを送信するをご覧ください。
API
バッチ ワークロードで Lightning Engine を有効にするには、batches.create リクエストの一部として次の操作を行います。
- RuntimeConfig.version を
2.3に設定します。 RuntimeConfig.properties に "dataproc.tier":"premium" を追加します。プレミアム ティアを設定すると、バッチ ワークロードに次のプロパティが自動的に設定されます。
spark.dataproc.engine=lightningEngineは、バッチ ワークロードに Lightning Engine を選択します。spark.dataproc.driver.compute.tierとspark.dataproc.executor.compute.tierはpremiumに設定されます(リソース割り当てプロパティをご覧ください)。これらの自動的に設定されたプレミアム ティアのコンピューティング設定は、3.0より前のランタイムを使用するバッチではオーバーライドできません。
その他 RuntimeConfig.properties:
ネイティブ クエリエンジン:
spark.dataproc.lightningEngine.runtime:native。ネイティブ クエリ実行ランタイムを選択する場合は、このプロパティを追加します。ディスク階層とサイズ: デフォルトでは、ドライバとエグゼキュータのディスクサイズは
standardの階層とサイズに設定されています。プロパティを追加して、premiumのティアとサイズ(375 GiBの倍数)を選択できます。
詳細については、リソース割り当てプロパティをご覧ください。
他のバッチ ワークロード API フィールドを設定するには、Spark バッチ ワークロードを送信するをご覧ください。
ランタイム プロファイル
ランタイム プロファイル(セッション テンプレート)で Lightning Engine を有効にする
Google Cloud コンソール、Google Cloud CLI、または Dataproc API を使用して、Jupyter または Spark Connect セッションのランタイム プロファイル(セッション テンプレート)で Lightning Engine を有効にできます。
コンソール
Google Cloud コンソールを使用して、ランタイム プロファイル(セッション テンプレート)で Lightning Engine を有効にします。
Google Cloud コンソールで、Managed Service for Apache Spark の [サーバーレス ランタイム プロファイル] ページに移動します。
[作成] をクリックして、[ランタイム プロファイルを作成する] ページを開きます。
次のフィールドを選択して入力します。
ティア: [プレミアム](デフォルト)が選択されていることを確認し、[Lightning Engine を有効にしてパフォーマンスを高速化する](デフォルトで選択され、
spark.dataproc.engine=lightningEngineが設定されます)が選択されていることを確認します。追加の構成: 次のランタイムと Spark プロパティの設定を構成します。
ランタイム構成: [編集] をクリックし、[Spark ランタイム バージョン] が
2.3に設定されていることを確認して、[保存] をクリックします。その他のカスタマイズ:(省略可)ネイティブ クエリ実行ランタイムを選択するには、[編集] をクリックし、[Spark プロパティ] の [プロパティを追加] をクリックして、次のキー(プロパティ名)と値のペアを入力し、[保存] をクリックします。
キー 値 spark.dataproc.lightningEngine.runtimenative
他のランタイム プロファイル設定を入力、選択、または確認します。ランタイム プロファイルの設定の詳細については、ランタイム プロファイルを作成するをご覧ください。
[作成] をクリックします。
gcloud
gcloud CLI を使用して Managed Service for Apache Spark セッション テンプレート(ランタイム プロファイル)を直接作成することはできません。代わりに、gcloud beta dataproc session-templates import コマンドを使用して既存のセッション テンプレートをインポートし、インポートしたテンプレートを編集して Lightning Engine と、必要に応じてネイティブ クエリ ランタイムを有効にしてから、gcloud beta dataproc session-templates export コマンドを使用して編集したテンプレートをエクスポートします。
API
セッション テンプレート(ランタイム プロファイル)で Lightning Engine を有効にするには、sessionTemplates.create リクエストの一部として次の操作を行います。
- RuntimeConfig.version を
2.3に設定します。 - RuntimeConfig.properties に「dataproc.tier」:「premium」と「spark.dataproc.engine」:「lightningEngine」を追加します。
その他 RuntimeConfig.properties:
- ネイティブ クエリ エンジン:
spark.dataproc.lightningEngine.runtime:native: このプロパティを RuntimeConfig.properties に追加して、ネイティブ クエリ実行ランタイムを選択します。
他のセッション テンプレート API フィールドの設定の詳細については、ランタイム プロファイル(セッション テンプレート)を作成するをご覧ください。
インタラクティブ セッション
インタラクティブ セッションで Lightning Engine を有効にする
Google Cloud CLI または Dataproc API を使用して、Managed Service for Apache Spark インタラクティブ セッションで Lightning Engine を有効にできます。BigQuery Studio ノートブックのインタラクティブ セッションで Lightning Engine を有効にすることもできます。
gcloud
次の gcloud CLI gcloud beta dataproc sessions create spark コマンドフラグを設定して、インタラクティブ セッションで Lightning Engine を有効にします。
gcloud beta dataproc sessions create spark \ --project=PROJECT_ID \ --location=REGION \ --version=2.3 \ --properties=dataproc.tier=premium,spark.dataproc.engine=lightningEngine \ OTHER_FLAGS_AS_NEEDED
注:
- PROJECT_ID: 実際の Google Cloud プロジェクト ID。プロジェクト ID は、 Google Cloud コンソールのダッシュボードの [プロジェクト情報] セクションに表示されます。
- REGION: ワークロードを実行できる利用可能な Compute Engine リージョン。
--properties=dataproc.tier=premium,spark.dataproc.engine=lightningEngine。これらのプロパティにより、セッションで Lightning Engine が有効になります。その他のプロパティ:
- ネイティブ クエリエンジン:
spark.dataproc.lightningEngine.runtime=native: このプロパティを追加して、ネイティブ クエリ実行ランタイムを選択します。
- ネイティブ クエリエンジン:
OTHER_FLAGS_AS_NEEDED: インタラクティブ セッションを作成するをご覧ください。
API
セッションで Lightning Engine を有効にするには、sessions.create リクエストの一部として次の操作を行います。
- RuntimeConfig.version を
2.3に設定します。 - RuntimeConfig.properties に「dataproc.tier」:「premium」と「spark.dataproc.engine」:「lightningEngine」を追加します。
その他 RuntimeConfig.properties:
- ネイティブ クエリ エンジン:
spark.dataproc.lightningEngine.runtime:native: ネイティブ クエリ実行ランタイムを選択する場合は、このプロパティを RuntimeConfig.properties に追加します。
他のセッション テンプレート API フィールドを設定するには、インタラクティブ セッションを作成するをご覧ください。
BigQuery ノートブック
Lightning Engine は、BigQuery Studio PySpark ノートブックでセッションを作成するときに有効にできます。
from google.cloud.dataproc_spark_connect import DataprocSparkSession
from google.cloud.dataproc_v1 import Session
session = Session()
# Enable Lightning Engine.
session.runtime_config.properties["version"] = "2.3"
session.runtime_config.properties["dataproc.tier"] = "premium"
session.runtime_config.properties["spark.dataproc.engine"] = "lightningEngine"
# Enable THE Native Query Execution runtime.
session.runtime_config.properties["spark.dataproc.lightningEngine.runtime"] = "native"
# Create the Spark session.
spark = (
DataprocSparkSession.builder
.appName("APP_NAME")
.dataprocSessionConfig(session)
.getOrCreate())
# Add Spark application code here:
Lightning Engine の設定を確認する
Google Cloud コンソール、Google Cloud CLI、または Dataproc API を使用して、バッチ ワークロード、ランタイム プロファイル(セッション テンプレート)、またはインタラクティブ セッションで Lightning Engine の設定を確認できます。
バッチ ワークロード
バッチのティアが
premiumに設定され、エンジンがLightning Engineに設定されていることを確認するには:- Google Cloud コンソール: [ジョブ] ページで、[サーバーレス Spark] タブを選択してバッチの [ティア] 列を表示し、バッチの [ジョブ ID] をクリックして、バッチの [ジョブの詳細] ページの [概要] タブで [ティア] と [エンジン] の両方の設定を表示します。
- gcloud CLI:
gcloud dataproc batches describeコマンドを実行します。 - API:
batches.getリクエストを発行します。
ランタイム プロファイル
ランタイム プロファイル(セッション テンプレート)で engine が
Lightning Engineに設定されていることを確認するには:Google Cloud コンソール: [サーバーレス ランタイム プロファイル] ページで、ランタイム プロファイル名をクリックして、ランタイム プロファイルの詳細ページで設定を表示します。
gcloud CLI:
gcloud beta dataproc session-templates describeコマンドを実行します。API:
sessionTemplates.getリクエストを発行します。
インタラクティブ セッション
インタラクティブ セッションで engine が
Lightning Engineに設定されていることを確認するには:Google Cloud コンソール: [セッション] ページで、セッションの [エンジン] 列を確認します。[セッション ID] をクリックすると、セッションの詳細ページでこの設定を表示することもできます。
gcloud CLI:
gcloud beta dataproc sessions describeコマンドを実行します。API:
sessions.getリクエストを発行します。
ネイティブ クエリ実行
ネイティブ クエリ実行(NQE)は、Lightning Engine のオプション機能です。Google ハードウェア向けに設計された Apache Gluten と Velox に基づくネイティブ実装により、パフォーマンスを向上させます。
ネイティブ クエリ実行ランタイムには、既存の Spark 構成を変更することなく、オフヒープ メモリとオンヒープ メモリを動的に切り替えるための統合メモリ管理が含まれています。NQE は、演算子、関数、Spark データ型への対応を拡張しているほか、ネイティブ エンジンを活用してオペレーションのプッシュダウンを最適化する機会を自動的に特定するインテリジェンスも備えています。
ネイティブ クエリ実行ワークロードを特定する
ネイティブ クエリ実行は、次のようなシナリオで使用します。
Parquet ファイルと ORC ファイルからデータを読み取る Spark Dataframe API、Spark Dataset API、Spark SQL クエリ。出力ファイルの形式は、ネイティブ クエリの実行パフォーマンスに影響しません。
ネイティブ クエリ実行認定ツールで推奨されるワークロード。
次のデータ型の入力を含むワークロードでは、ネイティブ クエリの実行はおすすめしません。
- バイト: ORC と Parquet
- タイムスタンプ: ORC
- 構造体、配列、マップ: Parquet
ネイティブ クエリ実行の制限事項
次のシナリオでネイティブ クエリ実行を有効にすると、例外、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がトリガーされることがあります。この問題が発生した場合は、パーティションの数を減らすことで、この例外を回避できます。