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

このページでは、Dataproc on Compute Engine VM のメモリ不足(OOM)エラーに関する情報と、トラブルシューティングおよび OOM エラーを解決するために実行可能な手順について説明します。

OOM エラーの影響

Dataproc on Compute Engine VM でメモリ不足(OOM)エラーが発生すると、次の条件が発生します。

  • マスター VM とワーカー VM が一時的にフリーズします。

  • マスター VM の OOM エラーにより、ジョブが「タスクが取得されませんでした」エラーで失敗します。

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

YARN メモリ制御

Apache YARN には、次のタイプのメモリ制御が用意されています。

  • ポーリング ベース(従来版)
  • Strict
  • Elastic

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

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

Dataproc メモリ保護

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

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

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

メモリ保護の終了を特定して確認する

次の情報を使用することで、メモリ圧力によるジョブの終了を特定して確認できます。

プロセスの終了

  • Dataproc のメモリ保護によって終了するプロセスは、コード 137 または 143 で終了します。

  • Dataproc がメモリ不足のためにプロセスを終了すると、次のアクションまたは状態が発生する可能性があります。

    • Dataproc は、dataproc.googleapis.com/node/problem_count 累積指標をインクリメントし、reasonProcessKilledDueToMemoryPressure に設定します。Dataproc リソース指標の収集をご覧ください。
    • Dataproc は、"A process is killed due to memory pressure: process name というメッセージを含む google.dataproc.oom-killer ログを書き込みます。これらのメッセージを表示するには、Logging を有効にして、次のログフィルタを使用します。
      resource.type="cloud_dataproc_cluster"
      resource.labels.cluster_name="CLUSTER_NAME"
      resource.labels.cluster_uuid="CLUSTER_UUID"
      jsonPayload.message:"A process is killed due to memory pressure:"
      

マスターノードまたはドライバノードプールのジョブの終了

  • メモリ不足が原因で Dataproc マスターノードまたはドライバノードプールのジョブが終了すると、ジョブはエラー Driver received SIGTERM/SIGKILL signal and exited with INT コードで失敗します。これらのメッセージを表示するには、Logging を有効にして、次のログフィルタを使用します。

    resource.type="cloud_dataproc_cluster"
    resource.labels.cluster_name="CLUSTER_NAME"
    resource.labels.cluster_uuid="CLUSTER_UUID"
    jsonPayload.message:"Driver received SIGTERM/SIGKILL signal and exited with"
        

    • google.dataproc.oom-killer ログまたは dataproc.googleapis.com/node/problem_count を確認して、Dataproc メモリ保護がジョブを終了したことを確認します(プロセスの終了をご覧ください)。

    解決策:

    • クラスタにドライバプールがある場合は、実際のジョブメモリ使用量に合わせて driver-required-memory-mb を増やします。
    • クラスタにドライバプールがない場合は、クラスタを再作成して、クラスタで実行される同時実行ジョブの最大数を減らします。
    • メモリ容量の大きいマスターノード マシンタイプを使用します。

ワーカーノードの YARN コンテナの終了

  • Dataproc は YARN リソース マネージャーに container id exited with code EXIT_CODE というメッセージを書き込みます。これらのメッセージを表示するには、Logging を有効にして、次のログフィルタを使用します。

    resource.type="cloud_dataproc_cluster"
    resource.labels.cluster_name="CLUSTER_NAME"
    resource.labels.cluster_uuid="CLUSTER_UUID"
    jsonPayload.message:"container" AND "exited with code" AND "which potentially signifies memory pressure on NODE
    
  • コンテナが code INT で終了した場合は、google.dataproc.oom-killer ログまたは dataproc.googleapis.com/node/problem_count を確認して、Dataproc メモリ保護がジョブを終了したことを確認します(プロセスの終了をご覧ください)。

    解決策:

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