Azure Synapse Analytics の Apache Spark の主要な概念
Apache Spark は、ビッグデータ分析アプリケーションのパフォーマンスを向上させるメモリ内処理をサポートする並列処理フレームワークです。 Azure Synapse Analytics の Apache Spark は、Apache Spark を Microsoft がクラウドに実装したものです。
Azure Synapse では、Spark の機能を Azure に簡単に作成して構成することができます。 Azure Synapse には異なる Spark 機能の実装が備わっており、このドキュメントではそれらの機能について取り上げています。
Spark プール
サーバーレス Apache Spark プールは Azure portal で作成します。 インスタンス化時、データを処理する Spark インスタンスの作成には、Spark プールの定義が使用されます。 作成した Spark プールはメタデータとしてのみ存在します。リソースが消費されたり実行されたりすることはなく、課金されることもありません。 Spark プールには、Spark インスタンスの特性を制御する一連のプロパティがあります。 そのような特性には、名前、サイズ、拡大縮小動作、有効期限がありますがそれらに限定されません。
Spark プールは、その作成に関して料金もリソース コストも発生しないので、異なる構成でいくつでも作成することができます。 Spark プールにアクセス許可を適用することで、ユーザーが利用できる Spark プールを限定することもできます。
ベスト プラクティスとして、開発とデバッグ用に作成する Spark プールは小さく、運用環境のワークロードの実行用に作成する Spark プールは大きくすることをお勧めします。
Spark プールの作成方法とそのすべてのプロパティは、Azure Synapse Analytics の Spark プールの概要に関するページでご覧いただけます。
Spark インスタンス
Spark インスタンスは、Spark プールに接続してセッションを作成し、ジョブを実行するときに作成されます。 1 つの Spark プールを複数のユーザーが利用するときは、接続するユーザーごとに新しい Spark インスタンスが作成されます。
2 つ目のジョブの送信時にプールに容量がある場合は、既存の Spark にも容量があります。 その後、既存のインスタンスによってジョブが処理されます。 そうでない場合、プール レベルで容量が利用できるなら、新しい Spark インスタンスが作成されます。
インスタンスに対する課金は、Azure VM の起動時に開始されます。 Spark プール インスタンスに対する課金は、プール インスタンスが終了に変わると停止します。 Azure VM の起動方法、割り当て解除の詳細については、「Azure Virtual Machines の状態と課金状態」を参照してください。
例
例 1
- SP1 という Spark プールを作成します。このプールのクラスター サイズは中規模ノード 20 で固定です
- 10 ノードを使用するノートブック ジョブ、J1 を送信すると、そのジョブを処理する Spark インスタンス、SI1 が作成されます
- プールにまだ容量があり、インスタンス J2 が SI1 によって処理されるため、10 ノードを使用する別のジョブ J2 を送信します
- J2 が 11 ノードを要求していた場合は、SP1 にも SI1 にも容量はありません。 その場合、J2 がノートブックからのものであればジョブは拒否され、J2 がバッチ ジョブからのものであればジョブはキューに格納されます。
- 課金はノートブック ジョブ J1 の送信から開始されます。
- Spark プールは、それぞれ 8 個の仮想コアを持つ 20 の中規模ノードでインスタンス化され、通常は開始までに約 3 分かかります。 20 x 8 = 160 の仮想コア。
- Spark プールの正確な起動時間、アイドル タイムアウト、および 2 つのノートブック ジョブの実行時間に応じて、プールは 18 から 20 分 (Spark プールのインスタンス化時間 + ノートブック ジョブの実行時間 + アイドル タイムアウト) の間で実行される可能性があります。
- 実行時間を 20 分と仮定すると、160 x 0.3 時間 = 48 仮想コア時間となります。
- 注: 仮想コア時間は 1 分あたりに課金されます。仮想コアの料金は Azure リージョンによって異なります。 詳細については、「Azure Synapse の価格」を参照してください
例 2
- Spark プール呼び出し SP2 を作成します。これは最小 10 から最大 20 の中規模ノードで自動スケールが有効になっています
- 10 ノードを使用するノートブック ジョブ J1 を送信すると、そのジョブを処理する Spark インスタンス SI1 が作成されます
- ここで、10 ノードを使用する別のジョブ J2 を送信すると、そのプールとインスタンスにはまだ容量があるため、インスタンスは自動的に 20 ノードにスケーリングされ、そこで J2 が処理されます。
- 課金はノートブック ジョブ J1 の送信から開始されます。
- Spark プールは、それぞれ 8 個の仮想コアを持つ 10 の中規模ノードでインスタンス化され、通常は開始までに約 3 分かかります。 10 x 8、80 の仮想コア。
- J2 が送信されると、プールにはさらに 10 個の中規模ノードが追加され、自動スケーリングされます。通常、自動スケーリングには 4 分かかります。 10 x 8、80 個の仮想コアを追加して、合計 160 個の仮想コアになります。
- Spark プールの起動時間、最初のノートブック ジョブ J1 の実行時間、プールのスケールアップ時間、2 番目のノートブックの実行時間、最後にアイドル タイムアウトに応じて、プールは 22 分から 24 分 (Spark プールのインスタンス化時間 + J1 ノートブック ジョブの実行時間はすべて 80 仮想コア) + (Spark プールの自動スケールアップ時間 + J2 ノートブック ジョブの実行時間 + アイドル タイム アウトはすべて 160 仮想コア) の間に実行される可能性があります。
- 4 分間の 80 仮想コア + 20 分間の 160 仮想コア = 58.67 仮想コア時間。
- 注: 仮想コア時間は 1 分あたりに課金されます。仮想コアの料金は Azure リージョンによって異なります。 詳細については、「Azure Synapse の価格」を参照してください
例 3
- SP1 という Spark プールを作成します。このプールのクラスター サイズは 20 ノード固定です。
- 10 ノードを使用するノートブック ジョブ J1 を送信すると、そのジョブを処理する Spark インスタンス SI1 が作成されます。
- 別のユーザー U2 が、10 ノードを使用するジョブ J3 を作成すると、そのジョブを処理するための新しい Spark インスタンス SI2 が作成されます。
- ここで、最初のユーザーが 10 ノードを使用する別のジョブ J2 を送信した場合、プールとインスタンスにはまだ容量があるため、J2 は SI1 によって処理されます。
- 課金はノートブック ジョブ J1 の送信から開始されます。
- Spark プール SI1 は、それぞれ 8 個の仮想コアを持つ 20 の中規模ノードでインスタンス化され、通常は開始までに約 3 分かかります。 20 x 8、160 の仮想コア。
- Spark プールの正確な起動時間、最初と 3 番目のノートブック ジョブのアイドル タイムアウトと実行時間に応じて、SI1 プールは 18 分から 20 分 (Spark プールのインスタンス化時間 + ノートブック ジョブの実行時間 + アイドル タイムアウト) の間で実行される可能性があります。
- 別の Spark プール SI2 は、それぞれ 8 個の仮想コアを持つ 20 の中規模ノードでインスタンス化され、通常は開始までに約 3 分かかります。 20 x 8、160 の仮想コア
- Spark プールの正確な起動時間、最初のノートブック ジョブのアイドル タイムアウトと実行時間に応じて、SI2 プールは 18 分から 20 分 (Spark プールのインスタンス化時間 + ノートブック ジョブの実行時間 + アイドル タイムアウト) の間で実行される可能性があります。
- 2 つのプールがそれぞれ 20 分間実行されると仮定すると、160 x .03 x 2 = 96 仮想コア時間となります。
- 注: 仮想コア時間は 1 分あたりに課金されます。仮想コアの料金は Azure リージョンによって異なります。 詳細については、「Azure Synapse の価格」を参照してください
Apache Spark for Azure Synapse におけるクォータとリソースの制約
ワークスペースレベル
Azure Synapse ワークスペースにはそれぞれ、Spark に使用できる既定の仮想コア クォータが割り当てられています。 ユーザー クォータとデータフロー クォータのどちらの使用パターンもワークスペース内の仮想コアをすべて使い尽くしてしまうことのないよう、クォータは、その両者間で分け合うようになっています。 クォータはサブスクリプションの種類によって異なりますが、ユーザーとデータフローとの間で均等に割り当てられます。 ただし、ワークスペースの残り以上の仮想コアを要求した場合は、次のエラーが発生します。
Failed to start session: [User] MAXIMUM_WORKSPACE_CAPACITY_EXCEEDED
Your Spark job requested 480 vCores.
However, the workspace only has xxx vCores available out of quota of yyy vCores.
Try reducing the numbers of vCores requested or increasing your vCore quota. Click here for more information - https://go.microsoft.com/fwlink/?linkid=213499
メッセージ内のリンク先は、この記事です。
ワークスペースの仮想コア クォータ引き上げを要求する方法については、以下の記事で説明されています。
- サービスの種類として "Azure Synapse Analytics" を選択します。
- [クォータの詳細] ウィンドウで、[Apache Spark (vCore) per workspace](ワークスペースごとの Apache Spark (仮想コア)) を選択します。
Azure portal でキャパシティの引き上げを要求する
Spark プール レベル
Spark プールを定義するときには、実質的に、そのプールのユーザーごとのクォータを定義することになります。複数のノートブックやジョブ、またはその両方を組み合わせて実行すると、プールのクォータを使い果たす可能性があります。 実行すると、エラーメッセージが生成されます
Failed to start session: Your Spark job requested xx vCores.
However, the pool is consuming yy vCores out of available zz vCores.Try ending the running job(s) in the pool, reducing the numbers of vCores requested, increasing the pool maximum size or using another pool
この問題を解決するには、ノートブックやジョブを実行して新しいリソース要求を出す前に、プール リソースの使用量を減らす必要があります。