Spark メモリの問題
エグゼキューターのメモリが不足すると、Spark はエグゼキューターを削除し、そのタスクを再試行します。ジョブの処理速度が低下し、失敗を繰り返した後、ステージとジョブが失敗します。
ジョブが失敗した場合やエグゼキューターが削除された場合に、コンピュートのイベントLogsにスポットインスタンスやプリエンプティブルインスタンスの喪失またはオートスケールが表示されない場合は、このページを使用します。イベントLogsを確認するには、 ジョブの失敗またはエグゼキューターの削除 を参照してください。ステージが完了しても低速でspillが表示される場合は、 スキューとspill を参照してください。
メモリの問題の検証中
メモリの問題により、次のようなエラーが発生することがよくあります。
Output
SparkException: Job aborted due to stage failure: Task 3 in stage 0.0 failed 4 times, most recent failure: Lost task 3.3 in stage 0.0 (TID 30) (10.139.64.114 executor 4): ExecutorLostFailure (executor 4 exited caused by one of the running tasks) Reason: Remote RPC client disassociated. Likely due to containers exceeding thresholds, or network issues. Check driver logs for WARN messages.
これらのエラーは多くの場合、汎用的なものであり、他の問題が原因である可能性があります。メモリの問題が疑われる場合は、コアあたりのメモリを2倍にして、問題が解決するかどうかを確認してください。
たとえば、ワーカータイプのコア数が4でメモリが16 GBの場合、コア数が4でメモリが32 GBのワーカータイプに切り替えてください。これにより、4 GBではなく、1コアあたり8 GBになります。重要なのはメモリとコアの比率であり、メモリの合計量ではありません。ジョブが失敗するまでに時間がかかる場合、またはまったく失敗しない場合は、メモリが原因である可能性があります。
より多くのメモリで問題が解決した場合は、より大きなワーカータイプのままにします。解決しない場合、または追加コストが高すぎる場合は、次のセクションで考えられる原因を確認してください。
考えられる原因
メモリの問題には、多くの潜在的な原因があります。まずはこれらの一般的な原因から確認してください:
- シャッフルパーティションが少なすぎる。
spark.sql.shuffle.partitionsをautoに設定して、Spark がシャッフルパーティションの数を選択できるようにします。AQEの構成を参照してください。 - 大規模なブロードキャスト。 大きなテーブルのブロードキャスト結合ヒントを確認し、ランタイムの threshold を確認します。AQE の構成を参照してください。
- UDF。 UDFを実行する各タスクは、パーティション内のすべてのデータをメモリに読み込む場合があります。UDF をネイティブ関数を使用して書き換えるか、適用する前に再パーティション化してください。実行速度の遅い UDFを参照してください。
PARTITION BYなしのウィンドウ関数。 ウィンドウがデータセット全体に及ばないように、PARTITION BY節を追加してください。タスクが1つだけの長いSparkステージを参照してください。- スキュー。 ステージの サマリーメトリクス でスキューを確認してください。スキューを参照してください。結合については、スキュー結合を動的に処理するを参照してください。
- ストリーミング状態 ストリーミング状態を保持するクエリーでは、RocksDB状態ストアを使用し、そのメモリ使用量を制限します。RocksDBメモリ使用量の制限を参照してください。