Amazon EMR の「java.lang.OutOfMemoryError:GC overhead limit exceeded」例外を解決する方法を教えてください。

最終更新日: 2019 年 10 月 10 日

Amazon EMR の NameNode サービスが「java.lang.OutOfMemoryError:GC overhead limit exceeded」という例外で失敗します。

簡単な説明

NameNode サービスは、メモリを使用して、HDFS に保存されたファイルの名前空間オブジェクトとメタデータを保存します。HDFS 内のファイルが多いほど、NameNode が使用するメモリが増えます。「java.lang.OutOfMemoryError:GC overhead limit exceeded」エラーは、NameNode ヒープサイズがクラスター内の HDFS データの量に対して不十分であることを示しています。メモリ不足による例外の発生を防ぐために、ヒープサイズを増やします。

解決方法

ログを確認してエラーを確認します

1.    SSH を使用してマスターノードに接続します

2.    マスターノードで次のコマンドを実行して、NameNode サービスのステータスを確認します。

initctl list

次の出力は、NameNode サービスが停止したことを示します。

hadoop-hdfs-namenode stop/waiting

3.    次のパスにある NameNode ログをチェックして、OutofMemory 例外を確認します: /var/log/hadoop-hdfs/hadoop-hdfs-namenode-ip-xxxx.outxxxx にはマスターノードのプライベート IP アドレスを指定します (例: /var/log/hadoop-hdfs/hadoop-hdfs-namenode-ip-10-0-1-109.out)。

次のような出力は、OutOfMemory 例外のために NameNode サービスが失敗したことを示しています。

# java.lang.OutOfMemoryError: GC overhead limit exceeded
# -XX:OnOutOfMemoryError="kill -9 %p
kill -9 %p

NameNode のヒープサイズを増やす

重要: この設定変更では、NameNode サービスを再起動する必要があります。変更中には、HDFS の読み取りまたは書き込み処理が実行されないようにしてください。

Amazon EMR リリースバージョン 5.21.0 以降の場合:

ヒープサイズを増やすには、 実行中のクラスターのインスタンスグループhadoop-env 設定オブジェクトを指定します。または、新しいクラスターを起動するときに、設定オブジェクトを追加します。次の設定オブジェクトは、ヒープサイズを 1 GB から 2 GB に増やします。ワークロードに適したサイズを選択します。

[
  {
    "Classification": "hadoop-env",
    "Properties": {
      
    },
    "Configurations": [
      {
        "Classification": "export",
        "Properties": {
          "HADOOP_NAMENODE_HEAPSIZE": "2048"
        },
        "Configurations": [
          
        ]
      }
    ]
  }
]

Amazon EMR は新しい設定を適用し、NameNode プロセスを適切に再開します。

Amazon EMR リリースバージョン 5.20.0 以前の場合:

1.    SSH を使用してマスターノードに接続します

2.    /etc/hadoop/conf/hadoop-env.sh ファイルで、NameNode ヒープサイズを増やします。ワークロードに適したサイズを選択します。例:

export HADOOP_NAMENODE_HEAPSIZE=2048

3.    変更を保存します。

4.    NameNode サービスを再起動します。

sudo stop hadoop-hdfs-namenode
sudo start hadoop-hdfs-namenode

5.    NameNode プロセスが実行されていることを確認します。

initctl list

正常な出力は次のようになります。

hadoop-hdfs-namenode start/running, process 6324

6.    HDFS コマンドが機能していることを確認します。

hdfs dfs -ls /

正常な出力は次のようになります。

Found 4 items
drwxr-xr-x   - hdfs hadoop          0 2019-09-26 14:02 /apps
drwxrwxrwt   - hdfs hadoop          0 2019-09-26 14:03 /tmp
drwxr-xr-x   - hdfs hadoop          0 2019-09-26 14:02 /user
drwxr-xr-x   - hdfs hadoop          0 2019-09-26 14:02 /var