VM のメモリ不足エラーのトラブルシューティング

OOM 効果

Compute Engine VM 上の Dataproc でメモリ不足(OOM)エラーが発生した場合:

  • マスター VM とワーカー VM が一定期間フリーズします。

  • マスター VM の OOM エラーにより、ジョブが「タスク未取得」というエラーで失敗します。

  • ワーカー VM の OOM エラーにより、YARN HDFS 上のノードが失われ、Dataproc ジョブの実行が遅れます。

yarn メモリ制御

Yarn には、次の 3 種類のメモリ制御が用意されています。

  1. ポーリング ベース(レガシー)
  2. Strict
  3. 柔軟性

デフォルトでは、Dataproc は YARN メモリ制御を有効にするように yarn.nodemanager.resource.memory.enabled を設定しません。理由は次のとおりです。

  • コンテナサイズが正しく構成されていない場合、厳格なメモリ制御により、十分なメモリがあるときにコンテナが終了することがあります。
  • Elastic メモリ制御の要件は、ジョブの実行に悪影響を与える可能性があります。
  • YARN メモリ制御は、プロセスが積極的にメモリを消費する場合に OOM エラーを防止できない場合があります。

Dataproc のメモリ保護

Dataproc クラスタ VM がメモリ不足の状態になると、OOM 状態が削除されるまで Dataproc メモリ保護はプロセスまたはコンテナを終了します。

Dataproc のメモリ保護は、次のクラスタノードで次の Dataproc on Compute Engine イメージ バージョンで提供されます。

ロール 1.5 2.0 2.1
マスター VM 1.5.74+ 2.0.48+ すべて
ワーカー VM 利用不可 2.0.76+ 2.1.24+
ドライバプール VM 利用不可 2.0.76+ 2.1.24+

Dataproc のメモリ保護の終了を特定する方法

  • Dataproc のメモリ保護が 137 または 143 で終了するプロセス。
  • ワーカーノードの終了:
    • Dataproc は dataproc.googleapis.com/node/problem_count 累積指標を増分し、reasonProcessKilledDueToMemoryPressure に設定します。
    • Cloud Logging が有効になっている場合、Dataproc は「A process is killed due to memory pressure: [process name].」というログを google.dataproc.oom-killer に書き込みます。
    • YARN コンテナが終了すると、Dataproc は YARN リソース マネージャーに「[container id] exited with code 137, which potentially signifies a memory pressure on [node id]」というメッセージを書き込みます。
  • マスターまたはドライバプール ノードの終了: ジョブドライバは Driver received SIGTERM/SIGKILL signal and exited with [INT] code で失敗します。

OOM ソリューション

このセクションでは、OOM の問題に起因するジョブとコンテナの終了に関する推奨事項を示します。

ジョブが「Driver received SIGTERM/SIGKILL signal and exited with [INT] code」というエラーで失敗する

推奨:

  • クラスタにドライバプールがある場合は、driver-required-memory-mb を増やしてジョブのメモリ使用量を減らします。
  • クラスタにドライバプールがない場合は、クラスタを再作成します。同時実行ジョブの最大数は、(total master memory in MB - 3584MB) / driver-size-mb として計算されます。この数は次の方法で減らすことができます。
    • dataproc:dataproc.scheduler.max-concurrent-jobs を設定する
    • dataproc:dataproc.scheduler.driver-size-mb を大きい数値に設定します(デフォルトは 1024MB)。
  • 追加のメモリを搭載したマスターノードのマシンタイプの使用を検討してください。

コンテナが終了コード 137 または 143 で終了した

推奨:

  • Dataproc のメモリ保護がコンテナを終了した場合(Dataproc のメモリ保護の終了を特定する方法をご覧ください):

    • コンテナのサイズが正しく構成されていることを確認します。
    • yarn.nodemanager.resource.memory-mb を下げることを検討してください。このプロパティは、YARN コンテナのスケジューリングに使用されるメモリの量を制御します。
    • ジョブコンテナが一貫して失敗する場合は、データスキューにより、特定のコンテナの使用量が増加していないかどうかを確認します。その場合は、ジョブを再パーティショニングするか、追加のメモリ要件に合わせてワーカーサイズを増やしてください。