Fabric Spark のネイティブ実行エンジン
ネイティブ実行エンジンは、Microsoft Fabric での Apache Spark ジョブ実行の画期的な機能強化です。 このベクター化されたエンジンでは、Lakehouse インフラストラクチャで直接実行することで、Spark クエリのパフォーマンスと効率を最適化します。 エンジンのシームレスな統合は、コードの変更を必要とせず、ベンダーのロックインが回避されます。 Apache Spark API をサポートし、Runtime 1.3 (Apache Spark 3.5) と互換性があり、Parquet 形式と Delta 形式の両方で動作します。 OneLake 内のデータの場所に関係なく、またはショートカットを使用してデータにアクセスする場合でも、ネイティブ実行エンジンは効率とパフォーマンスが最大化します。
ネイティブ実行エンジンは、運用コストを最小限に抑えながら、クエリのパフォーマンスが大幅に向上します。 TPC-DS 1 TB (テラバイト) ベンチマークで検証された従来の OSS (オープンソース ソフトウェア) Spark と比較して最大 四倍のパフォーマンスを実現し、顕著な速度向上が実現します。 エンジンは、ルーチン データ インジェスト、バッチ ジョブ、ETL (抽出、変換、読み込み) タスクから複雑なデータ サイエンス分析や応答性の高い対話型クエリまでの、さまざまなデータ処理シナリオの管理に熟達しています。 ユーザーは、処理時間の短縮、スループットの向上、リソース使用率の最適化の恩恵を受けます。
ネイティブ実行エンジンは、2 つの主要な OSS コンポーネントに基づいています。Meta によって導入された C++ データベース アクセラレーション ライブラリである Velox と、Intel によって導入されたネイティブ エンジンに JVM ベースの SQL エンジンの実行をオフロードする中間層である Apache Gluten (incubating) です。
Note
ネイティブ実行可能ファイルエンジンは、現在、パブリック プレビュー段階にあります。 詳細については、現在の制限事項に関する記事を参照してください。 追加コストなしでワークロードでネイティブ実行エンジンを有効にすることをお勧めします。 より多くの支払いをすることなく、より高速なジョブ実行のメリットを得ることができます。事実上、同じ作業に対する支払いが少なくなります。
ネイティブ実行エンジンを使用するタイミング
ネイティブ実行エンジンでは、大規模なデータ セットに対してクエリを実行するためのソリューションを提供します。基になるデータ ソースのネイティブ機能を使用してパフォーマンスを最適化し、従来の Spark 環境でのデータ移動とシリアル化に通常関連するオーバーヘッドを最小限に抑えます。 エンジンは、ロールアップ ハッシュ集計、ブロードキャスト入れ子ループ結合 (BNLJ)、正確なタイムスタンプ形式など、さまざまな演算子とデータ型のサポートをしています。 ただし、エンジンの機能を最大限に活用するには、最適なユース ケースを検討することが必要です。
- エンジンは、Parquet 形式とデルタ形式のデータを操作する場合に効果的であり、ネイティブかつ効率的に処理ができます。
- 複雑な変換と集計を伴うクエリは、エンジンの縦棒処理とベクター化機能により大きなメリットを得られます。
- パフォーマンスの向上は、サポートされていない機能や式を回避してクエリがフォールバック メカニズムをトリガーしないシナリオで最も顕著です。
- エンジンは、単純または I/O バインドではなく、計算負荷の高いクエリに適しています。
ネイティブ実行エンジンでサポートされる演算子と関数の詳細については、Apache Gluten のドキュメントを参照してください。
ネイティブ実行エンジンを有効にする
プレビュー フェーズ中にネイティブ実行エンジンのすべての機能を使用するには、特定の構成が必要となります。 次の手順では、ノートブック、Spark ジョブ定義、および環境全体に対してこの機能をアクティブ化する方法が示されます。
重要
ネイティブ実行エンジンは、最新の GA ランタイム バージョンである Runtime 1.3 (Apache Spark 3.5、Delta Lake 3.2) をサポートしています。 Runtime 1.3 のネイティブ実行エンジンのリリースに伴い、以前のバージョンである Runtime 1.2 (Apache Spark 3.4、Delta Lake 2.4) のサポートは中止されました。 すべてのお客様に、最新の Runtime 1.3 にアップグレードすることをお勧めします。 Runtime 1.2 でネイティブ実行エンジンを使用している場合、ネイティブ アクセラレーションは間もなく無効になることに注意してください。
環境レベルで有効にする
パフォーマンスの向上を確実に統一するには、環境に関連付けられているジョブとノートブックすべてでネイティブ実行エンジンを有効にします。
環境設定に移動します。
[Spark コンピューティング] に移動します。
[アクセラレーション] タブに移動します。
[ネイティブ実行エンジンを有効にする] のラベルが付いたボックスをオンにします。
変更を保存して発行します。
環境レベルで有効にする場合、後続のすべてのジョブとノートブックが設定を継承します。 この継承で、環境内で作成された新しいセッションまたはリソースは、拡張された実行機能の恩恵を自動的に受けることができます。
重要
以前は、環境構成内の Spark 設定でネイティブ実行エンジンが有効にされていました。 最新の更新プログラム (現在ロールアウト中) では、環境設定の [高速化] タブにトグル ボタンを導入することでこれが簡略化されました。 新しいトグルを使用してネイティブ実行エンジンを再度有効にします。ネイティブ実行エンジンを引き続き使用するには、環境設定の [高速化] タブに移動し、トグル ボタンで有効にしてください。 UI の新しいトグル設定は、以前の Spark プロパティ構成よりも優先されるようになりました。 以前に Spark 設定を通じてネイティブ実行エンジンを有効にしていた場合は、UI 切り替えで再度有効にするまで無効になります。
感謝祭とブラック フライデーの休暇中の Microsoft の Azure デプロイ凍結ポリシーに合わせて、米国中北部 (NCUS) リージョンへのロールアウトを 12 月 6 日に、米国東部リージョンを 12 月 9 日に再スケジュールしました。 この繁忙期間中については、ご理解およびご辛抱いただけるようお願いいたします。
ノートブックまたは Spark ジョブ定義を有効にする
ひとつのノートブックまたは Spark ジョブ定義に対してネイティブ実行エンジンを有効にするには、実行スクリプトの先頭に必要な構成を組み込む必要があります。
%%configure
{
"conf": {
"spark.native.enabled": "true",
}
}
ノートブックの場合、最初のセルに必要な構成コマンドを挿入します。 Spark ジョブ定義の場合は、Spark ジョブ定義の最前線に構成が含まれます。 ネイティブ実行エンジンはライブ プールと統合されるため、、新しいセッションを開始しなくても、機能を有効にするとすぐに有効になります。
重要
ネイティブ実行エンジンの構成は、Spark セッションの開始前に行うことが必要です。 Spark セッション開始後は、spark.shuffle.manager
設定は変更不可になり、変更できなくなります。 これらの構成が、ノートブックのブロック内 %%configure
、または Spark ジョブ定義の Spark セッション ビルダーで設定されていることを確認します。
クエリ レベルでの制御
テナント、ワークスペース、環境の各レベルでネイティブ実行エンジンを有効にするメカニズムは、UI とシームレスに統合され、開発が進められています。 その間、特定のクエリ、特に現在サポートされていない演算子を含むクエリについては、ネイティブ実行エンジンを無効にすることができます (「制限事項」を参照)。 無効にするには、クエリなど特定のセルに対して Spark 構成 spark.native.enabled を false に設定します。
%%sql
SET spark.native.enabled=FALSE;
ネイティブ実行エンジンが無効になっているクエリを実行した後、spark.native.enabled を true に設定して、後続のセルに対して再度有効にすることが必要です。 Spark はコード セルを順番に実行するために、この手順が必要です。
%%sql
SET spark.native.enabled=TRUE;
エンジンによって実行される操作を識別
Apache Spark ジョブのオペレーターがネイティブ実行エンジンを使用して処理されたかどうかの判断には、いくつかの方法があります。
Spark UI と Spark 履歴サーバー
Spark UI または Spark 履歴サーバーにアクセスして、検査する必要のあるクエリを見つけます。 インターフェイス内に表示されるクエリ プランで、サフィックス Transformer、NativeFileScan または VeloxColumnarToRowExec で終わるノード名を探します。 サフィックスは、ネイティブ実行エンジンが操作を実行したことを表示します。 たとえば、ノードには RollUpHashAggregateTransformer、ProjectExecTransformer、BroadcastHashJoinExecTransformer、ShuffledHashJoinExecTransformer、BroadcastNestedLoopJoinExecTransformer などのラベルが付けられます。
DataFrame の説明
または、ノートブックでコマンドを df.explain()
実行して実行プランを表示することもできます。 出力内で、同じ Transformer、NativeFileScan または VeloxColumnarToRowExec サフィックスを探します。 このメソッドは、特定の操作がネイティブ実行エンジンによって処理されているかどうかを簡単に確認する方法を提供します。
フォールバック メカニズム
サポートされていない機能などの理由によって、ネイティブ実行エンジンがクエリを実行できない場合があります。 このような場合は、操作は従来の Spark エンジンにフォールバックします。 この自動フォールバック メカニズムにより、ワークフローが中断されることがなくなります。
エンジンによって実行されるクエリとデータフレームを監視する
ネイティブ実行エンジンが SQL クエリと DataFrame 操作にどのように適用されるかを理解し、ステージと演算子レベルにドリルダウンするには、Spark UI と Spark History Server を参照してネイティブ エンジンの実行に関する詳細を参照してください。
[ネイティブ実行エンジン] タブ
新しい [Gluten SQL/ DataFrame] タブに移動すると、Gluten のビルド情報とクエリ実行の詳細を表示できます。 [クエリ] テーブルには、ネイティブ エンジンで実行されているノードの数と、クエリごとに JVM にフォールバックするノードの数に関する分析情報が表示されます。
クエリの実行グラフ
Apache Spark クエリ実行プランの視覚化のクエリの説明をクリックすることもできます。 実行グラフには、ステージとそれぞれの操作にわたるネイティブ実行の詳細が表示されます。 背景色で実行エンジンを区別できます。緑色はネイティブ実行エンジンを表し、水色は操作が既定の JVM エンジンで実行されていることを示します。
制限事項
ネイティブ実行エンジンは Apache Spark ジョブのパフォーマンスを向上させますが、現在の制限事項に注意してください。
- マージ操作、チェックポイント スキャン、削除ベクトルなど、一部のデルタ固有の操作はサポートされていません (現在積極的に取り組んでいます)。
- 特定の Spark の
array_contains
機能と式は、ユーザー定義関数 (UDF) や関数などのネイティブ実行エンジンおよび Spark 構造化ストリーミングと互換性がありません。 インポートされたライブラリの一部としてこれらの互換性のない操作または関数を使用すると、Spark エンジンへのフォールバックも発生します。 - プライベート エンドポイントを利用するストレージ ソリューションからのスキャンはサポートされていません (現在積極的に取り組んでいます)。
- エンジンは ANSI モードをサポートしていないため、検索を行い、ANSI モードが有効になると、自動的にバニラ Spark にフォールバックします。
クエリで日付フィルターを使用する場合、パフォーマンスの問題を回避するために、比較の両側のデータ型が一致していることを確認する必要があります。 データ型が一致しない場合、クエリ実行がブーストされず、明示的なキャストが必要になることがあります。 一致しない型は常に自動的にキャストされるとは限らないので、比較の左側 (LHS) と右側 (RHS) のデータ型が同一であることを常に確認してください。 型の不一致が避けられない場合、明示的なキャストを使用してデータ型に一致させます。次に例を示 CAST(order_date AS DATE) = '2024-05-20'
します。 キャストが必要なデータ型が一致しないクエリはネイティブ実行エンジンによって高速化されないため、パフォーマンスの維持には型の一貫性メイン確保することが重要です。 たとえば、order_date
と DATETIME
および文字列 DATE
の order_date = '2024-05-20'
代わりに明示的にキャスト order_date
して、一貫性のあるデータ型を DATE
確保し、パフォーマンスを向上させます。