Spark ドライバーが過負荷になりました
ドライバーは、クラスター上のすべての作業を調整します。すべてのコマンドを解釈し、各クエリーを計画し、エグゼキューターでタスクをスケジューリングします。ドライバーが過負荷になっていると、作業を十分に速く割り当てることができないため、エグゼキューターはアイドル状態のまま、料金だけが請求されます。これは通常、ジョブのタイムラインに長いギャップがあり、ワーカーがビジー状態でない場合でもクラスターが低速または無応答であるとして現れます。
このページは、ワーカーではなくクラスターメトリクスでドライバーの負荷が高くなっていることを確認した後に使用します。これを確認するには、ドライバーが過負荷になっていますを参照してください。ドライバーの負荷が高くない場合、ギャップには別の原因があります。Spark ジョブ間のギャップの他の原因を確認し、このガイドの他のページを使用して問題を診断します。Spark UI を使用したコストとパフォーマンスの問題の診断を参照してください。
一般的な原因
ドライバーが過負荷になるのは、通常、次のいずれかの理由によるものです。
- 並列操作が多すぎます。 クラスタ上で同時にランされる Stream、クエリー、または Spark ジョブが多すぎます。たとえば、一部のワークロードではスレッドを使用して多数の Spark ジョブを同時に実行しています。これは最も一般的な原因です。
- 非Sparkコード。 ネイティブPython関数を呼び出すPythonループなど、Sparkを使用しないコードは、ドライバーで実行され、ワーカーがアイドル状態の間にドライバーをビジー状態に保ちます。コードがSparkで実行されるかどうかを確認するには、非Sparkコードの実行を参照してください。
- 多数の接続されたノートブック。 ドライバーノードは、クラスターに接続されているすべてのノートブックの状態情報を保持します。接続されているノートブックが多いと、コマンドを実行していなくてもドライバーへの負荷が増大します。
過負荷のドライバーを修正する
ドライバーへの負荷を軽減するには、次のアプローチを試してください:
-
ドライバーサイズを大きくします。 ドライバーノードタイプのdefaultは、ワーカーノードタイプと同じです。コンピュート構成の 高度なパフォーマンス セクションで、より大きなドライバータイプを選択します。Databricksでは、まずはドライバーサイズを倍にして、それがジョブにどのように影響するかを確認することをお勧めします。ドライバーのタイプを参照してください。
-
同時実行性を減らしてください。 同時にランするオペレーションが多すぎる場合は、クラスター上でランするStream、クエリー、またはスレッド化されたSparkジョブの数を減らしてください。
-
複数のクラスターに負荷を分散します。 並列ワークロードの一部を別のコンピュートに移動して、各ドライバーが調整する作業を減らします。
-
非Sparkコードを移動します。 ドライバーが非Spark コードを実行していてビジー状態の場合、より大きなドライバーを使ってもアイドル状態のワーカーには役立ちません。コードを書き換えてSparkを使用するか、アイドル時間に対して料金が発生しないServerless コンピュートで実行してください。コードを書き換えるには:
- Spark を初めて使用する場合は、チュートリアル: Apache Spark DataFrames を使用したデータの読み込みと変換を参照してください。
- コードでPythonが使用されている場合は、PySparkの基本を参照してください。
- コードで pandas が使用されている場合は、pandas API on Spark を使用してください。
-
未使用のノートブックをデタッチします。 使用していないノートブックをクラスターからデタッチして、ドライバーが管理する状態を減らします。