FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.tez.TezTask.
Vertex failed, vertexName=Map 1, vertexId=vertex_..., diagnostics=[...]
Tez 는 쿼리를 DAG 로 만들고 각 단계를 vertex 라고 부른다. "Vertex failed" 는 그 단계가 실패했다는 사실만 알려 줄 뿐 원인이 아니다. 원인은 뒤따라오는 diagnostics=[...] 안에 있고, 그것도 잘려 있으면 YARN 애플리케이션 로그를 봐야 한다.
yarn logs -applicationId <application_id> | less
Tez UI 가 떠 있다면 DAG 화면에서 실패한 vertex 와 task attempt 의 진단 메시지를 직접 볼 수 있다. 진단 메시지의 첫 줄을 확보하기 전에는 설정을 건드리지 않는다.
Vertex's TaskResource is beyond the cluster container capability
요청한 컨테이너 크기가 YARN 의 yarn.scheduler.maximum-allocation-mb 를 넘었다. hive.tez.container.size 를 그 한계 안으로 내리거나 YARN 쪽 한계를 올린다. 자세한 관계는 YARN 컨테이너 메모리 설정 을 본다.
INIT_FAILURE ... Fail to create InputInitializerManager
입력 초기화 단계에서 실패한 것이다. 대개 클래스 로딩 또는 입력 경로 문제다. 커스텀 입력 포맷을 쓰는 테이블(Iceberg·HBase 연동 등)에서 필요한 JAR 이 Tez 에 전달되지 않으면 여기서 죽는다. 입력 경로가 실제로 존재하는지도 함께 본다.
hdfs dfs -ls /warehouse/db.db/table/
org.apache.tez.dag.api.TezReflectionException: Unable to instantiate class with 1 arguments
Tez 가 리플렉션으로 만들려는 클래스를 찾지 못했거나 생성자 시그니처가 맞지 않는 경우다. 실질적으로는 JAR 버전 불일치다. 확인 순서는 다음과 같다.
첫째, Tez 라이브러리가 HDFS 에 올라가 있고 tez.lib.uris 가 그것을 가리키는지 본다. Tez 를 올린 뒤 이 경로를 갱신하지 않으면 옛 JAR 이 계속 쓰인다.
<property>
<name>tez.lib.uris</name>
<value>hdfs://nameservice1/apps/tez/tez.tar.gz</value>
</property>
hdfs dfs -ls /apps/tez/
둘째, 같은 라이브러리가 서로 다른 버전으로 두 군데 있는지 본다. $HIVE_HOME/lib 와 Tez 배포본, hive.aux.jars.path 가 가리키는 곳에 같은 이름의 JAR 이 버전만 다르게 들어 있으면 어느 쪽이 먼저 로드되느냐에 따라 증상이 오락가락한다.
ls -l $HIVE_HOME/lib | grep -i tez
hadoop classpath | tr ':' '\n' | sort
셋째, Hive 와 Tez 의 버전 조합이 맞는지 본다. Hive 배포본은 특정 Tez 버전에 맞춰 빌드돼 있다. 올려야 한다면 양쪽을 함께 올린다. Iceberg 같은 확장 라이브러리도 Hive 버전에 맞는 것을 써야 하며, 클래스를 찾지 못하는 경우는 Hive 와 Iceberg 연동 을 본다.
진단 메시지에 OutOfMemoryError 나 Container killed by YARN for exceeding memory limits 가 있으면 메모리다. 컨테이너 크기와 JVM 힙을 함께 올린다. 힙은 컨테이너의 70~80% 로 둔다.
SET hive.tez.container.size=8192;
SET hive.tez.java.opts=-Xmx6400m;
SET tez.am.resource.memory.mb=4096;
크기를 키워도 계속 터진다면 데이터 쏠림을 의심한다. 한 리듀서에 값이 몰리면 그 태스크만 메모리를 다 쓴다. 분포를 먼저 확인한다.
SELECT join_key, count(*) AS cnt
FROM big_table
GROUP BY join_key
ORDER BY cnt DESC
LIMIT 20;
쏠린 값이 보이면 쏠림 처리를 켜거나 키를 분산한다.
SET hive.optimize.skewjoin=true;
SET hive.groupby.skewindata=true;
맵 조인 대상이 너무 커서 AM 이나 태스크가 죽는 경우도 흔하다. 자동 맵 조인 임계값을 내려 본다.
SET hive.auto.convert.join.noconditionaltask.size=200000000;
ArrayIndexOutOfBoundsException 처럼 데이터 해석 중에 나는 예외는 스키마와 실제 파일이 어긋난 경우가 많다. 컬럼을 추가·삭제한 뒤 옛 파일이 남아 있거나, 파티션별로 SerDe 가 다른 경우다. 파티션 하나만 골라 조회해 어느 파티션에서 나는지 좁힌다.
SELECT * FROM db.table WHERE ds = '2026-03-11' LIMIT 10;
파티션이 메타스토어에 등록되지 않아 생기는 문제라면 복구한다. 자세한 것은 Hive 파티션 메타데이터 복구 를 본다.
원인이 Tez 인지 쿼리인지 가르려면 같은 쿼리를 다른 엔진으로 돌려 본다. 통과하면 Tez 설정·라이브러리 쪽이고, 같이 실패하면 데이터나 쿼리 쪽이다. 진단용이며 운영 설정으로 두지 않는다.
SET hive.execution.engine=mr;
Hive 4 계열에서는 MapReduce 실행 엔진이 제거됐으므로 이 방법을 쓸 수 없다. 이때는 같은 데이터를 Spark 나 다른 엔진으로 읽어 보는 것으로 대신한다.
Hive on Tez · Hive 세션 설정과 작은 파일 병합