내용으로 건너뛰기

Amazon EMR에서 "java.lang.OutOfMemoryError: GC overhead limit exceeded" 예외를 해결하려면 어떻게 해야 합니까?

3분 분량
0

Amazon EMR에서 "java.lang.OutOfMemoryError: GC overhead limit exceeded." 예외를 해결하고 싶습니다.

간략한 설명

NameNode 서비스는 메모리를 사용하여 Hadoop 분산 파일 시스템(HDFS)에 저장된 파일의 네임스페이스 객체 및 메타데이터를 저장합니다. HDFS에 파일이 많이 있을수록 NameNode가 더 많은 메모리를 사용합니다.

NameNode 힙 크기가 클러스터의 HDFS 데이터 양에 비해 작을 경우 "java.lang.OutOfMemoryError: GC overhead limit exceeded" 오류가 표시됩니다. 메모리 부족 예외를 방지하려면 힙 크기를 늘리십시오.

해결 방법

로그를 확인하여 오류 확인

다음 단계를 완료하십시오.

  1. SSH를 사용하여 프라이머리 노드에 연결합니다.

  2. NameNode 서비스의 상태를 확인하려면 프라이머리 노드에서 다음 명령을 실행합니다.

    initctl list

    NameNode 서비스가 중지되면 다음과 같은 출력이 표시됩니다.

    hadoop-hdfs-namenode stop/waiting
  3. OutofMemory 예외를 확인하려면 var/log/hadoop-hdfs/hadoop-hdfs-namenode-ip-####.out에서 NameNode 로그를 확인하십시오.
    참고: **####**을 프라이머리 노드의 프라이빗 IP 주소로 바꾸십시오.
    OutofMemory 예외로 인해 NameNode 서비스가 실패하면 다음 예시와 유사한 출력이 표시됩니다.

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

NameNode 힙 크기 늘리기

중요: 이 구성을 변경하려면 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

    참고: 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 itemsdrwxr-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
  7. 구성을 변경한 후 클러스터를 모니터링합니다.

관련 정보

애플리케이션 구성

Hive가 쿼리 결과를 출력할 때 발생하는 Amazon EMR의 "OutOfMemoryError" Hive Java 힙 공간 예외는 어떻게 해결합니까?

AWS 공식업데이트됨 4달 전