쿼리 재실행

쿼리 재실행 (Query ReExecution)

쿼리 재실행은 예상치 못한 상황이 발생했을 때 쿼리를 여러 번 다시 실행할 수 있는 기능이에요. Hive 3.0(HIVE-17626)에서 도입됐어요.

출처: 문서

본문

쿼리 재실행은 예상치 못한 상황이 발생한 경우 쿼리를 여러 번 재실행할 수 있는 시설을 제공합니다. Hive 3.0(HIVE-17626)에서 도입되었습니다.

재실행 전략

Overlay

앞으로 발생할 모든 재실행에 대해 hive 설정을 변경할 수 있게 해줍니다. 실제 hive 설정에 구성 하위 트리(reexec.overlay.*)를 오버레이로 추가하는 방식으로 동작합니다.

예제

set zzz=1;
set reexec.overlay.zzz=2;

set hive.query.reexecution.enabled=true;
set hive.query.reexecution.strategies=overlay;

create table t(a int);
insert into t values (1);
select assert_true(${hiveconf:zzz} > a) from t group by a;

"reexec.overlay" 접두사를 가진 모든 hive 설정은 모든 재실행에 대해 설정됩니다.

더 실질적인 예로 모든 재실행에서 조인 자동 변환을 비활성화하는 것입니다:

set reexec.overlay.hive.auto.convert.join=false;

Reoptimize

쿼리 실행 중에 각 연산자를 통과하는 실제 행 수가 추적됩니다. 이 정보는 재플래닝 중에 재사용되어 더 나은 계획을 만들 수 있습니다.

이것이 필요한 상황:

  • 통계 누락
  • 잘못된 통계
  • 많은 조인

OOM 상황으로 이어질 쿼리를 만들기는 쉽지 않지만, 활성화하려면:

set hive.query.reexecution.strategies=overlay,reoptimize;

연산자 매칭 (Operator Matching)

연산자 수준 통계는 연산자 하위 트리 매칭을 사용해 새 계획과 매칭됩니다. 이는 "유사한" 부분을 가진 쿼리에 정보를 매칭할 수도 있게 해줍니다.

설정

설정 기본값
hive.query.reexecution.enabled true 기능 활성화
hive.query.reexecution.strategies overlay,reoptimize 재실행 플러그인. 현재 overlay와 reoptimize가 지원됨
hive.query.reexecution.stats.persist.scope query 런타임 통계를 영속화할 수 있음: * query: - 재실행 중에만 사용 * hiveserver: - hiveserver 수명 동안 영속화 * metastore: - metastore에 영속화하고 hiveserver 시작 시 로드
hive.query.reexecution.max.count 1 발생할 수 있는 재실행 횟수
hive.query.reexecution.always.collect.operator.stats false 모든 쿼리에서 런타임 통계를 수집하도록 활성화
hive.query.reexecution.stats.cache.batch.size -1 런타임 통계가 metastore에 저장되면 로드 중 라운드당 최대 배치 크기
hive.query.reexecution.stats.cache.size 100000 런타임 통계 캐시 크기. 단위는 OperatorStat 항목. 쿼리 계획은 ~100개로 구성됨
runtime.stats.clean.frequency 3600s 오래된 런타임 통계 항목을 제거하기 위해 타이머 작업이 실행되는 빈도
runtime.stats.max.age 3days 이보다 오래된 통계 항목은 제거됨

더 알아보기 (Learn more)

재실행은 쿼리 최적화와 밀접한 관련이 있어요. 오류 상황에서 쿼리가 자동으로 다시 시도됨으로써 OOM이나 일시적 실패에 대한 복원력을 높여줘요.