Skip to content

Latest commit

 

History

History
34 lines (22 loc) · 1.89 KB

Hive 조회 결과 많을 때는 나눠서 조회하자.md

File metadata and controls

34 lines (22 loc) · 1.89 KB

Hive 조회 결과 많을 때는 나눠서 조회하자

현상

약 2억 행의 결과가 나오는 쿼리가 있다. 커스텀 JDBC 드라이버를 이용해서 조회해보면 클라이언트 사양따라 다르겠지만 내 경우 약 1.8억건 이후의 ResultSet 조회시 CPU 사용량이 순간적으로 폭증하는 현상이 있었다.

문제

물론 폭증한 후에 곧 CPU 사용량이 떨어지고 정상적으로 약 2억행 조회는 완료된다. 문제는 이 쿼리가 클러스터로 구성된 Quartz 스케줄러에 의해 주기적으로 실행되는데, CPU가 폭증할 때 이 쿼리를 수행하는 Quartz 노드가 비정상 상태로 돌입한다는 점이다.

Quartz 노드에서 실행 중인 batch job은 보통 qrtz_fired_triggers라는 Quartz 전용 테이블에 기록되는데, CPU 폭증이 발생한 노드에서 실행 중이던 job 들은 실제로는 계속 실행 중임에도 모두 Quartz 전용 테이블에서 사라진다.

즉, Quartz 노드가 실제로는 batch job을 실행하고 있음에도 DB에서는 실행 중이지 않은 걸로 인식해서 일관성이 깨지고, 정상이었으면 발생하지 않았을 중복 실행이 발생하기도 한다.

해결

CPU 폭증을 줄여야 하는데 가장 간단한 방법은 조회량을 나눠서 여러번 조회하는 것이다. 2억건을 한 번에 조회하지 말고 1억건씩 두 번으로 나눠서 조회하는 것이다.

가장 간단한 방법으로는 다음과 같이 where 절에 조건 하나를 추가해서 나눠서 쿼리를 날리면 된다. 아래 예에서는 crc32 함수를 사용했는데 결과값이 잘 분산된다는 보장만 있으면 다른 함수를 사용해도 무방하다.

select ...
from ...
where ...
and crc32(aColumnName) % 2 = 0  # 이거 추가!!
select ...
from ...
where ...
and crc32(aColumnName) % 2 = 1  # 이거 추가!!