次の方法で共有


Microsoft Fabric のインテリジェント キャッシュ

インテリジェント キャッシュ機能はバックグラウンドでシームレスに動作し、データをキャッシュして、ショートカットを使用して OneLake または Azure Data Lake Storage (ADLS) Gen2 ストレージから読み取る場合に、Microsoft Fabric での Apache Spark ジョブの実行を高速化します。 また、基になるファイルへの変更が自動的に検出され、キャッシュ内のファイルが自動的に更新され、最新のデータが提供されます。 キャッシュ サイズが上限に達すると、キャッシュは読み取りが最も少ないデータを自動的に解放して、より新しいデータ用の領域を作成します。 この機能により、使用可能なキャッシュに格納されているファイルの後続の読み取りで最大 60% のパフォーマンスが向上し、総保有コストが削減されます。

Microsoft Fabric の Apache Spark エンジンは、レイクハウスからファイルまたはテーブルに対してクエリを実行すると、リモート ストレージを呼び出して基になるファイルを読み取ります。 同じデータを読み取るクエリ要求ごとに、Spark エンジンは毎回リモート ストレージを呼び出す必要があります。 この冗長プロセスにより、合計処理時間に待機時間が追加されます。 Spark には、待機時間を最小限に抑え、全体的なパフォーマンスを向上させるために、キャッシュを手動で設定して解放する必要があるキャッシュ要件があります。 ただし、基になるデータが変更されると、この要件によって古いデータが発生する可能性があります。

インテリジェント キャッシュは、SSD にデータ ファイルがキャッシュされる各 Spark ノード上の割り当てられたキャッシュ ストレージ領域内の各読み取りを自動的にキャッシュすることで、プロセスを簡略化します。 ファイルの各要求は、ファイルがローカル ノード キャッシュに存在するかどうかを確認し、リモート ストレージからのタグを比較して、ファイルが古くなっているかどうかを判断します。 ファイルが存在しない場合、またはファイルが古い場合は、Spark によってファイルが読み取られ、キャッシュに格納されます。 キャッシュがいっぱいになると、最も古い最終アクセス時間を持つファイルがキャッシュから削除され、より新しいファイルが許可されます。

インテリジェント キャッシュは、ノードごとに 1 つのキャッシュです。 中規模のノードを使用し、その 1 つのノードで 2 つの小さな Executor で実行する場合、2 つの Executor は同じキャッシュを共有します。 また、このデータ ファイル レベルのキャッシュにより、複数のクエリが同じデータまたはデータ ファイルにアクセスしている場合に、同じキャッシュを使用できるようになります。

動作方法

Microsoft Fabric (ランタイム 1.1 および 1.2) では、キャッシュ サイズが 50%のすべてのワークスペースのすべての Spark プールに対して、インテリジェント キャッシュが既定で有効になります。 使用可能なストレージの実際のサイズと各ノードのキャッシュ サイズは、ノード ファミリとノード サイズによって異なります。

インテリジェント キャッシュを使用するタイミング

この機能は、次の場合にメリットがあります。

  • ワークロードでは、同じファイルを複数回読み取る必要があり、ファイル サイズはキャッシュに収まります。

  • ワークロードでは、Delta Lake テーブル、Parquet、または CSV ファイル形式が使用されます。

次の場合、インテリジェント キャッシュの利点は表示されません。

  • キャッシュ サイズを超えるファイルを読み取っています。 その場合、ファイルの先頭を削除することができ、後続のクエリではリモート ストレージからデータを再フェッチする必要があります。 この場合、インテリジェント キャッシュの利点は見られないので、キャッシュ サイズやノード サイズを増やしたい場合があります。

  • ワークロードでは大量のシャッフルが必要です。 インテリジェント キャッシュを無効にすると、ストレージ領域が不足しているためにジョブが失敗するのを防ぐために、使用可能な領域が解放されます。

インテリジェント キャッシュの有効化と無効化

ノートブックで次のコードを実行するか、ワークスペースまたは 環境 項目レベルでこの構成を設定することで、セッション内でインテリジェント キャッシュを無効または有効にすることができます。

spark.conf.set("spark.synapse.vegas.useCache", "false/true")