쿼리 재실행
쿼리 재실행 (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이나 일시적 실패에 대한 복원력을 높여줘요.