같은 테이블을 Impala 로 조회하면 정상인데 Hive 에서만 실패한다.
FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.tez.TezTask.
Vertex failed, vertexName=Map 1, ... ROOT_INPUT_INIT_FAILURE
org.apache.hadoop.mapred.InvalidInputException:
Input path does not exist: s3a://bucket/data/hive/db/tbl/datastate=origin/_SUCCESS
경로는 실제로 존재하고 접근 권한도 있다.
주목할 점은 실패한 경로가 데이터 파일이 아니라 _SUCCESS 마커라는 것이다. Hive 가 입력 목록을 만들 때 S3 목록 조회 결과를 근거로 파일 목록을 잡았는데, 실제 열기 단계에서 그 항목이 없다고 판단한 상황이다. 원인은 다음 갈래로 좁혀진다.
S3 목록 일관성과 캐시. 잡 계획 시점과 실행 시점 사이에 파일이 지워졌거나, 목록 결과가 최신이 아닌 경우다. 다른 잡이 _SUCCESS 를 지우고 다시 쓰는 중이면 이 형태로 깨진다.
엔진별 입력 처리 차이. Impala 는 카탈로그에 캐시된 파일 목록으로 읽고, Hive on Tez 는 실행 시점에 InputFormat 이 경로를 다시 훑는다. 그래서 한쪽만 실패할 수 있다. 즉 "Impala 가 되니 S3 연결은 정상"이라는 추론은 맞지만, 그것이 Hive 문제의 원인을 배제해 주지는 않는다.
하위 디렉터리 재귀 설정. 파티션 아래에 다시 디렉터리가 있는 구조라면 재귀 입력이 필요하다.
SET mapreduce.input.fileinputformat.input.dir.recursive=true;
SET hive.mapred.supports.subdirectories=true;
두 키 모두 실제로 존재한다. 과거 이름인 mapred.input.dir.recursive 는 오래된 키이며, 최신 배포판에서는 위 이름을 쓴다.
hdfs dfs -ls s3a://bucket/data/hive/db/tbl/datastate=origin/
hdfs dfs -ls s3a://bucket/data/hive/db/tbl/ | head
DESCRIBE FORMATTED tbl PARTITION (datastate='origin');
SHOW PARTITIONS tbl;
Hive 로그는 HiveServer2 와 Tez AM 양쪽을 본다. Cloudera Manager 에서는 Hive 서비스의 Instances 에서 HiveServer2 를 고르고 Log Files 로 들어간다. Tez AM 로그는 yarn logs -applicationId <appId> 로 받는다.
_SUCCESS 같은 마커 파일을 입력에서 빼면 증상이 사라지는 경우가 있다.
SET mapreduce.input.fileinputformat.input.dir.filter=^[^_].*;
적재 파이프라인에서 마커 파일을 테이블 경로 밖에 두도록 바꾸는 편이 근본적이다.
원본 대화에서는 원인을 특정하지 못한 채 설정 점검 수준에서 끝났다. 재현되면 Tez AM 로그의 전체 스택과 잡 계획 시점의 입력 목록을 확보해, 계획 시점과 실행 시점 사이에 경로가 바뀌었는지부터 확인한다.