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

최종 업데이트 날짜: 2020년 6월 19일

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까지 확장하는 것을 고려해보십시오.