AWS Glue에서 "java.lang.OutOfMemoryError: Java 힙 공간" 오류를 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2022년 2월 7일

AWS Glue 작업이 "Command failed with exit code 1"과 함께 실패하고 Amazon CloudWatch Logs에 "java.lang.OutOfMemoryError: Java heap space" 오류가 표시됩니다.

간략한 설명

"java.lang.OutOfMemoryError: Java 힙 공간" 오류는 드라이버 또는 실행기 프로세스에 메모리가 부족함을 나타냅니다. 드라이버 또는 실행기가 OOM을 유발하는지 확인하려면 OOM 예외 및 작업 이상 디버깅을 참조하십시오. 다음 해결 방법은 드라이버 OOM 예외에만 적용됩니다.

해결 방법

드라이버 OOM 예외는 일반적으로 Apache Spark 작업이 Amazon Simple Storage Service(Amazon S3)에서 많은 수의 작은 파일을 읽을 때 발생합니다. 다음 방법 중 하나 이상을 사용하여 DynamicFrames에서 드라이버 OOM 예외를 해결합니다.

그룹화

그룹화 기능을 활성화하면 태스크는 개별 파일 대신 여러 파일을 처리합니다. 자세한 내용은 그룹화를 사용하여 여러 파일 처리 수정을 참조하세요.

useS3ListImplementation 활성화

AWS Glue는 파일을 나열할 때 드라이버 메모리 목록에 파일 인덱스를 생성합니다. 다음 예제와 같이 useS3ListImplementationTrue로 설정하면 AWS Glue는 파일 목록을 메모리에 모두 한번에 캐시하지 않습니다. 대신 AWS Glue는 목록을 배치 단위로 캐시합니다. 이것은 드라이버의 메모리가 부족할 가능성이 적다는 의미입니다.

다음은 from_catalog를 사용하여 useS3ListImplementation을 활성화하는 방법의 예입니다.

datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "database", table_name = "table", additional_options = {'useS3ListImplementation': True}, transformation_ctx = "datasource0")

다음은 from_options를 사용하여 useS3ListImplementation을 활성화하는 방법의 예입니다.

datasource0 = glueContext.create_dynamic_frame.from_options(connection_type="s3", connection_options = {"paths": ["s3://input_path"], "useS3ListImplementation":True,"recurse":True}, format="json")

useS3ListImplementation 기능은 큰 결과 집합을 여러 응답으로 분할하는 Amazon S3 ListKeys 작업의 구현입니다. 작업 북마크와 함께 useS3ListImplementation을 사용하는 것이 모범 사례입니다.

추가 문제 해결

그룹화 및 useS3ListImplementation으로 드라이버 OOM 예외가 해결되지 않는 경우 다음을 시도합니다.

  • CloudWatch Logs 및 CloudWatch Metrics를 사용하여 드라이버 메모리를 분석합니다. 작업에서 특정 임계값이 위반되는 경우 알리도록 CloudWatch 경보를 설정합니다.
  • 수집계수와 같은 작업을 사용하지 않도록 합니다. 이러한 작업은 드라이버에 대한 결과를 수집하며, 이로 인해 드라이버 OOM 예외가 발생할 수 있습니다.
  • 데이터 집합을 분석하고 작업에 적합한 작업자 유형을 선택합니다. G.1X 또는 G.2X까지 확장하는 것을 고려합니다.