次の方法で共有


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 と比較して最大 4 倍のパフォーマンスを実現する、驚くべき速度向上を実現します。 エンジンは、ルーチン データ インジェスト、バッチ ジョブ、ETL (抽出、変換、読み込み) タスクから複雑なデータ サイエンス分析や応答性の高い対話型クエリまでの、さまざまなデータ処理シナリオの管理に熟達しています。 ユーザーは、処理時間の短縮、スループットの向上、リソース使用率の最適化の恩恵を受けます。

ネイティブ実行エンジンは、2 つの主要な OSS コンポーネントに基づいています。Meta によって導入された C++ データベース アクセラレーション ライブラリである Velox と、Intel によって導入されたネイティブ エンジンに JVM ベースの SQL エンジンの実行をオフロードする中間層である Apache Gluten (incubating) です。

ネイティブ実行可能ファイルエンジンは、現在、パブリック プレビュー段階にあります。 詳細については、現在の制限事項に関する記事を参照してください。 追加コストなしでワークロードでネイティブ実行エンジンを有効にすることをお勧めします。 より多くの支払いをすることなく、より高速なジョブ実行のメリットを得ることができます。事実上、同じ作業に対する支払いが少なくなります。

ネイティブ実行エンジンを使用するタイミング

ネイティブ実行エンジンでは、大規模なデータ セットに対してクエリを実行するためのソリューションを提供します。基になるデータ ソースのネイティブ機能を使用してパフォーマンスを最適化し、従来の 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 にアップグレードすることをお勧めします。 ランタイム 1.2 でネイティブ実行エンジンを使用している場合、ネイティブ アクセラレーションはすぐに無効になります。

環境レベルで有効にする

パフォーマンスの向上を確実に統一するには、環境に関連付けられているジョブとノートブックすべてでネイティブ実行エンジンを有効にします。

  1. 環境設定に移動します。

  2. [Spark コンピューティング] に移動します。

  3. [アクセラレーション] タブに移動します。

  4. [ネイティブ実行エンジンを有効にする] のラベルが付いたボックスをオンにします。

  5. 変更を保存して発行します。

    環境項目内でネイティブ実行エンジンを有効にする方法を表示するスクリーンショット。

環境レベルで有効にする場合、後続のすべてのジョブとノートブックが設定を継承します。 この継承で、環境内で作成された新しいセッションまたはリソースは、拡張された実行機能の恩恵を自動的に受けることができます。

重要

以前は、ネイティブ実行エンジンは、環境内の Spark 設定を使用して有効にされていました。 環境設定の [高速化 ] タブのトグルを使用して、ネイティブ実行エンジンをより簡単に有効にできるようになりました。 引き続き使用するには、[ アクセラレーション ] タブに移動し、トグルをオンにします。 必要に応じて、Spark プロパティを使用して有効にすることもできます。

ノートブックまたは Spark ジョブ定義を有効にする

単一のノートブックまたは Spark ジョブ定義に対してネイティブ実行エンジンを有効にすることもできます。実行スクリプトの先頭に必要な構成を組み込む必要があります。

%%configure 
{ 
   "conf": {
       "spark.native.enabled": "true", 
   } 
} 

ノートブックの場合、最初のセルに必要な構成コマンドを挿入します。 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 履歴サーバーにアクセスして、検査する必要のあるクエリを見つけます。 Spark Web UI にアクセスするには、Spark ジョブ定義に移動して実行します。 [実行] タブで、[アプリケーション名] の横にある ... を選択し、[Open Spark Web UI] 選択します。 ワークスペースの Monitor タブから Spark UI にアクセスすることもできます。 ノートブックまたはパイプラインを選択します。監視ページには、アクティブなジョブの Spark UI への直接リンクがあります。

Spark Web UI に移動する方法を示すスクリーンショット。

Spark UI インターフェイス内に表示されるクエリ プランで、サフィックス Transformer、*NativeFileScan、または VeloxColumnarToRowExecで終わるノード名を探します。 サフィックスは、ネイティブ実行エンジンが操作を実行したことを表示します。 たとえば、ノードには RollUpHashAggregateTransformerProjectExecTransformerBroadcastHashJoinExecTransformerShuffledHashJoinExecTransformerBroadcastNestedLoopJoinExecTransformer などのラベルが付けられます。

サフィックス Transformer で終わる DAG 視覚化をチェックする方法を表示するスクリーンショット。

DataFrame の説明

または、ノートブックでコマンドを df.explain() 実行して実行プランを表示することもできます。 出力内で、同じ Transformer、*NativeFileScan、または VeloxColumnarToRowExec サフィックスを探します。 このメソッドは、特定の操作がネイティブ実行エンジンによって処理されているかどうかを簡単に確認する方法を提供します。

クエリの物理プランをチェックして、クエリがネイティブ実行エンジンによって実行されたことを確認する方法を表示するスクリーンショット。

フォールバック メカニズム

サポートされていない機能などの理由によって、ネイティブ実行エンジンがクエリを実行できない場合があります。 このような場合は、操作は従来の Spark エンジンにフォールバックします。 この自動フォールバック メカニズムにより、ワークフローが中断されることがなくなります。

フォールバック メカニズムを表示するスクリーンショット。

フォールバック メカニズムに関連付けられているログをチェックする方法を表示するスクリーンショット。

エンジンによって実行されるクエリとデータフレームを監視する

ネイティブ実行エンジンが SQL クエリと DataFrame 操作にどのように適用されるかを理解し、ステージと演算子レベルにドリルダウンするには、Spark UI と Spark History Server を参照してネイティブ エンジンの実行に関する詳細を参照してください。

[ネイティブ実行エンジン] タブ

新しい [Gluten SQL/ DataFrame] タブに移動すると、Gluten のビルド情報とクエリ実行の詳細を表示できます。 [クエリ] テーブルには、ネイティブ エンジンで実行されているノードの数と、クエリごとに JVM にフォールバックするノードの数に関する分析情報が表示されます。

ネイティブ実行エンジン タブを示すスクリーンショット。

クエリの実行グラフ

Apache Spark クエリ実行プランの視覚化のクエリの説明を選択することもできます。 実行グラフには、ステージとそれぞれの操作にわたるネイティブ実行の詳細が表示されます。 背景色で実行エンジンを区別できます。緑色はネイティブ実行エンジンを表し、水色は操作が既定の JVM エンジンで実行されていることを示します。

クエリの実行グラフを示すスクリーンショット。

制限事項

Microsoft Fabric のネイティブ実行エンジン (NEE) は Apache Spark ジョブのパフォーマンスを大幅に向上させますが、現在、次の制限があります。

既存の制限事項

  • 互換性のない Spark 機能: ネイティブ実行エンジンは現在、ユーザー定義関数 (UDF)、 array_contains 関数、または構造化ストリーミングをサポートしていません。 これらの関数またはサポートされていない機能が直接またはインポートされたライブラリを介して使用されている場合、Spark は既定のエンジンに戻ります。

  • サポートされていないファイル形式: JSONXML、および CSV 形式に対するクエリは、ネイティブ実行エンジンによって高速化されません。 これらは既定で、実行のために通常の Spark JVM エンジンに戻ります。

  • ANSI モードはサポートされていません。ネイティブ実行エンジンは ANSI SQL モードをサポートしていません。 有効にすると、実行はバニラ Spark エンジンにフォールバックします。

  • 日付フィルターの種類の不一致: ネイティブ実行エンジンの高速化のメリットを得るために、日付比較の両側がデータ型で一致していることを確認します。 たとえば、 DATETIME 列と文字列リテラルを比較する代わりに、次に示すように明示的にキャストします。

    CAST(order_date AS DATE) = '2024-05-20'
    

その他の考慮事項と制限事項

  • 10 進数から浮動小数点数へのキャストの不一致: DECIMAL から FLOATにキャストする場合、Spark は文字列に変換して解析することで精度を維持します。 NEE (Velox 経由) は、内部のint128_t表現から直接変換を行うため、丸め誤差が生じる可能性があります。

  • タイムゾーンの構成エラー : Spark で認識できないタイムゾーンを設定すると、ジョブは NEE で失敗しますが、Spark JVM では正常に処理されます。 例えば次が挙げられます。

    "spark.sql.session.timeZone": "-08:00"  // May cause failure under NEE
    
  • 一貫性のない丸め動作: round() 関数は、Spark の丸めロジックをレプリケートしない std::roundに依存しているため、NEE で動作が異なります。 これにより、結果の丸めで数値の不整合が発生する可能性があります。

  • map()関数に重複するキー チェックがありません: spark.sql.mapKeyDedupPolicyEXCEPTION に設定されている場合、Spark は重複するキーのエラーをスローします。 NEE は現在、このチェックをスキップし、クエリが正しく成功しません。
    例:

    SELECT map(1, 'a', 1, 'b'); -- Should fail, but returns {1: 'b'}
    
  • 並べ替えによる collect_list() の順序の差異: DISTRIBUTE BYSORT BYを使用する場合、Spark は要素の順序を collect_list()で保持します。 NEE は、シャッフルの違いにより異なる順序で値を返す場合があり、順序指定に依存するロジックに対する期待が一致しない可能性があります。

  • collect_list() / collect_set()の中間型の不一致: Spark では、これらの集計の中間型としてBINARYが使用されますが、NEE ではARRAYが使用されます。 この不一致により、クエリの計画または実行中に互換性の問題が発生する可能性があります。