간헐적 하이브 스테이징 FileNotFoundException이 발생하여 Amazon EMR Hive 쿼리가 실패하는 경우

최종 업데이트 날짜: 2020년 8월 28일

Amazon EMR 클러스터를 사용하여 Amazon Simple Storage Service(Amazon S3) 버킷에 있는 Apache Hive 테이블에 데이터를 쓰려고 하면 다음 오류 중 하나가 발생하면서 쿼리가 실패합니다.

  • java.io.FileNotFoundException File s3://awsdoc-example-bucket/.hive-staging_hive_xxx_xxxx does not exist.
  • java.io.IOException: rename for src path ERROR

간략한 설명

INSERT INTO, INSERT OVERWRITE 또는 다른 PARTITION 명령을 실행하면 Hive가 해당 테이블과 동일한 S3 버킷에 스테이징 디렉터리를 생성합니다. Hive는 스테이징 쿼리 데이터를 해당 S3 버킷에 쓰기 위해 RENAME 작업을 실행합니다.

RENAME 작업에는 HEAD, GET 및 PUT과 같은 하위 수준 S3 API 호출이 포함됩니다. Hive가 해당 파일을 생성하기 전에 키 이름에 대해 HEAD 또는 GET 요청을 하는 경우, Amazon S3는 쓰기 후 읽기에 대한 최종 일관성을 제공합니다. 이 경우 Hive는 임시 디렉토리의 이름을 최종 출력 디렉토리로 바꿀 수 없습니다. 이로 인해 java.io.IOException 또는 java.io.FileNotFoundException 같은 오류가 발생합니다. 자세한 내용은 Amazon S3 데이터 일관성 모델을 참조하십시오.

​해결 방법

참고: 다음 단계는 Amazon EMR 릴리스 버전 3.2.1 이상에 적용됩니다. 클러스터에서 Amazon EMR 버전 5.7.0 이하를 사용하는 경우 버전 5.8.0 이상으로 업그레이드하는 것이 좋습니다. 버전 5.8.0 이상에는 Hive 2.3.x가 포함되어 있습니다. Hive 2.3.x에서도 java.io.IOExceptionjava.io.FileNotFoundException 오류가 발생할 수 있지만, Amazon S3에 저장된 테이블에서만 발생합니다. Hive는 쿼리하는 테이블과 동일한 디렉토리가 아닌 엄격하게 일관된 HDFS 위치에 스테이징 디렉토리를 생성하기 때문에 HDFS 테이블에서는 이러한 오류가 발생하지 않습니다.

1.    SSH를 사용하여 마스터 노드에 연결하십시오.

2.    다음 예와 같이 /mnt/var/log/hive/user/hadoop/hive.log 디렉토리에서 Hive 오류 로그를 찾거나 Amazon S3 로그 URI 아래에서 YARN 애플리케이션 컨테이너 로그를 찾습니다. 자세한 내용은 로그 파일 보기를 참조하십시오.

s3://awsdoc-example-bucket/elasticmapreduce/j-3ABCDEF2BALUG5/Containers/application_11234567890654_0001/

3.    다음과 같은 오류 메시지를 찾습니다.

2020-08-27T11:53:28,837 ERROR [HiveServer2-Background-Pool: Thread-64([])]: ql.Driver (SessionState.java:printError(1097)) - FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.tez.TezTask. Vertex failed, vertexName=Map 6, vertexId=vertex_1525862550243_0001_1_03, diagnostics=[Vertex vertex_1525862550243_0001_1_03 [Map 6] killed/failed due to:ROOT_INPUT_INIT_FAILURE, Vertex Input: r initializer failed, vertex=vertex_1525862550243_0001_1_03 [Map 6], java.io.FileNotFoundException: File s3://awsdoc-example-bucket/folder/subfolder/subfolder/.hive-staging_hive_2020-08-25_09-36-30_835_6368934499747071892-1 does not exist. at com.amazon.ws.emr.hadoop.fs.s3n.S3NativeFileSystem.listStatus(S3NativeFileSystem.java:972)
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to rename output from: s3://awsdoc-example-bucket/demo.db/folder/ingestion_date=20200827/.hive-staging_hive_2020-08-27_13-52-51_942_3098569974412217069-5/_task_tmp.-ext-10000/_tmp.000000_2 to: s3://awsdoc-example-bucket/demo.db/folder/ingestion_date=20200827/.hive-staging_hive_2019-10-27_13-52-51_942_3098569974412217069-5/_tmp.-ext-10000/000000_2  at org.apache.hadoop.hive.ql.exec.FileSinkOperator$FSPaths.commit(FileSinkOperator.java:247)

4.    이러한 오류 중 하나가 로그에 있으면 Hive가 파일을 만들기 전에 RENAME 작업 중에 HEAD 요청을 실행한 것입니다. 이 오류를 해결하려면 EMRFS 일관성 보기를 활성화합니다. 자세한 내용은 일관성 보기를 참조하십시오.

로그에 이러한 오류가 없으면 로그를 사용하여 Amazon EMR에서 Hive 쿼리 문제를 해결하려면 어떻게 해야 합니까?를 참조하십시오.

5.    일관된 보기를 활성화한 후에도 이러한 오류가 계속 발생할 경우 일관성 보기의 추가 설정을 구성하십시오. 예를 들어 Amazon DynamoDB가 EMRFS 테이블을 제한하는 경우 emrfs-site.xml에서 다음 파라미터를 변경하여 테이블의 읽기 및 쓰기 용량 단위를 늘립니다.

fs.s3.consistent.metadata.read.capacity

fs.s3.consistent.metadata.write.capacity

java.io.FileNotFoundException 또는 java.io.IOException으로 인해 요청이 실패할 경우 EMRFS는 emrfs-site.xml의 기본값을 사용하여 요청을 재시도합니다. EMRFS는 Amazon S3가 일관될 때까지 또는 fs.s3.consistent.retryCount에 정의된 값에 도달할 때까지 요청을 계속 재시도합니다. 작업이 성공하기 전에 EMRFS가 이 재시도 횟수에 도달하면 ConsistencyException이 발생합니다. 이 문제를 해결하려면 fs.s3.consistent.retryCount를 늘립니다.