Amazon S3(Amazon Simple Storage Service) 버킷에 있는 Apache Hive 테이블에 Amazon EMR 클러스터를 사용하여 데이터를 쓰려 할 때 다음과 같은 오류 중 하나가 발생하여 쿼리가 실패합니다. 해결하려면 어떻게 해야 합니까? 

java.io.IOException: rename for src path ERROR

java.io.FileNotFoundException File s3://yourbucket/.hive-staging_hive_xxx_xxxx does not exist.

INSERT INTO, INSERT OVERWRITE 또는 다른 PARTITION 명령을 실행할 경우 Hive는 테이블과 동일한 S3 버킷에서 스테이징 명령을 생성합니다. Hive는 RENAME 작업을 실행하여 해당 S3 버킷에 스테이징 쿼리 데이터를 씁니다.

RENAME 작업에는 HEAD, GET, PUT과 같은 하위 수준 S3 API 호출이 포함됩니다. Hive가 파일을 생성하기 전에 파일이 존재하는지 확인하기 위해 HEAD 또는 GET 요청을 하는 경우 S3는 쓰기 후 읽기(read-after-write)에 대한 최종 일관성을 제공합니다. 이 경우 Hive는 최종 출력 디렉터리에 대한 임시 스크래치 디렉터리의 이름을 변경할 수 없으며 java.io.IOException 또는 java.io.FileNotFoundException 등과 같은 오류를 발생시킵니다. 자세한 내용은 Amazon S3 데이터 일관성 모델을 참조하십시오.

참고: 다음 단계는 Amazon EMR 릴리스 버전 3.2.1 이상에 적용됩니다. 클러스터에서 Amazon EMR 버전 5.7.0 이전을 사용하는 경우 버전 5.8 이상으로 업그레이드하십시오. 버전 5.8 이상에는 Hive 2.3.x가 포함되어 있습니다. Hive 2.3.x에서 S3 테이블을 사용할 경우 java.io.IOExceptionjava.io.FileNotFoundException 오류가 여전히 발생할 수 있습니다. Hive는 쿼리하는 테이블과 동일한 디렉터리가 아니라 일관성 보장(strongly consistent) HDFS 위치에 스테이징 디렉터리를 생성하기 때문에 이러한 오류는 HDFS 테이블에서는 발생하지 않습니다.

1. SSH를 사용하여 마스터 노드에 연결합니다.

2. 다음 예제에서처럼, S3 로그 URL에 있는 YARN 애플리케이션 컨테이너 로그 또는 /mnt/var/log/hive/user/hadoop/hive.log 디렉터리에서 Hive 오류를 찾습니다. 자세한 내용은 로그 파일 보기를 참조하십시오.

s3://your_log_bucket/elasticmapreduce/j-3ABCDEF2BALUG5/Containers/application_11234567890654_0001/

3. 다음과 같은 오류 메시지를 확인합니다. 

2018-05-09T11: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://mybucket/folder/subfolder/subfolder/.hive-staging_hive_2018-04-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://mybucket/demo.db/folder/ingestion_date=20180427/.hive-staging_hive_2017-04-27_13-52-51_942_3098569974412217069-5/_task_tmp.-ext-10000/_tmp.000000_2 to: s3://mybucket/demo.db/folder/ingestion_date=20180427/.hive-staging_hive_2017-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. 이러한 오류 중 하나가 로그에 있으면 파일이 생성되기 전에 RENAME 작업 중에 Hive가 HEAD 요청을 생성한 것입니다. EMRFS 일관된 보기를 활성화하여 이러한 오류를 해결하십시오 자세한 내용은 일관된 보기 단원을 참조하십시오.

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

5. 일관된 보기를 활성화한 후에도 이러한 오류가 계속 발생하면 일관된 보기를 위한 추가 설정 구성을 참조하십시오. 예를 들어 일관된 보기에서 생성한 Amazon DynamoDB 테이블 지표에 조정(throttle) 이벤트가 있으면 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는 S3가 일관될 때까지 또는 fs.s3.consistent.retryCount에 정의된 값에 도달할 때까지 요청을 계속 재시도합니다. 작업이 성공하기 전에 재시도 수에 도달하면 ConsistencyException가 발생합니다. 이 문제를 해결하려면 fs.s3.consistent.retryCount 파라미터를 증가시킵니다.


페이지 내용이 도움이 되었습니까? | 아니요

AWS 지원 지식 센터로 돌아가기

도움이 필요하십니까? AWS 지원 센터를 방문하십시오.

게시 날짜: 2018-10-24