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.    /var/log/hadoop-hdfs/hadoop-hdfs-namenode-ip-xxxx.out 경로에 있는 NameNode 로그에서 OutofMemory 예외를 확인합니다. xxxx는 마스터 노드의 프라이빗 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 구성 객체를 제공합니다. 또는 새 클러스터를 시작할 때 구성 객체를 추가합니다. 다음 구성 객체는 힙 크기를 1GB에서 2GB로 늘립니다. 워크로드에 적합한 크기를 선택합니다.

[
  {
    "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