본문 바로가기
Database

[Database] 분산 처리 프레임워크 (4) 대화형 쿼리 엔진 Presto의 구조

by keemchanniee 2025. 7. 30.
Hive와 같은 배치형 쿼리 엔진은 대량 출력을 수반하는 대규모 데이터 처리에 적합하지만, 작은 쿼리를 여러 번 실행하는 대화형  데이터 처리에는 적합하지 않다. 쿼리 실행의 지연을 감소시키는 것을 목적으로 개발된 것이 '대화형 쿼리 엔진'이다. 대표적인 엔진 Presto로 구조화 데이터를 집계하는 방법에 대해 알아보자. 

 

| 플러그인 가능한 스토리지 

Presto의 특징 중 하나는 플러그인 가능한 스토리지 설계이다. 

- 일반적인 MPP 데이터베이스는 저장소마다 따로 조회해야 한다.

- Presto는 한 번의 쿼리로 다양한 저장소에서 데이터를 가져올 수 있다. 

- 예를 들어, Hive에 저장된 로그/MySQL에 저장된 회원정보/NoSQL에 저장된 설정값을 하나의 쿼리로 조합할 수 있다. 

 

 

 

Presto의 구조를 살펴보자. Presto는 빠르게 쿼리하기 위해 특별한 구조를 사용한다. 

- 중앙의 Coordinator가 계획을 세운다.

- 여러 개의 Worker가 나눠서 동시에 데이터를 처리한다. (병렬 처리)

- 속도를 더 높이기 위해 데이터는 ORC 같은 빠른 포맷으로 저장하고, 저장소와 네트워크는 가까운 데 배치한다.

- Hive에서 정의한 테이블 구조인 Hive 메타정보를 그대로 불러와 쓸 수 있다. 

 

즉, Presto는 다양한 곳에 흩어진 데이터를 한 번에, 빠르게 분석할 수 있게 도와주는 쿼리 엔진이다. 

 

 

 

| CPU 방식의 최적화 

Presto는 인 메모리 처리로 쿼리를 고속화한다. 쉽게 말해, 데이터 처리를 디스크에 쓰지 않고 메모리 상에서 실시한다. 메모리가 부족하면 여유가 생길 대까지 기다리거나 오류로 실패한다. 

 

 

Presto의 쿼리 실행 과정 

1. SQL 쿼리를 분석하고 실행 계획을 생성한다.

2. 자바 바이트코드로 변환한다.

- 기계가 이해할 수 있는 언어로 번역하는 과정 

- 이 바이트 코드는 Worker에서 병렬로 실행된다. 

- 여러 노드에서 동시에 작업하므로 빠른 처리가 가능하다. 

 

병렬 처리 구조 덕분에, Presto는 CPU와 메모리를 효율적으로 사용할 수 있다. 하지만, CPU나 메모리가 부족하면 쿼리 속도가 느려지거나 대기가 발생할 수 있다. 

 

 

Presto 리소스 관리의 한계점 

Presto의 리소스 관리에는 한계도 존재한다. Presto는 YARN이나 Mesos 같은 일반적인 리소스 관리 시스템을 쓰지 않기 때문에, Presto만을 위한 클러스터가 따로 돌아가야 한다. 그래서 한 번에 너무 많은 쿼리가 들어오면, 리소스가 부족해지고 지연이 발생할 수 있다.

 

이러한 이점과 한계점 때문에, Presto는 짧고 단순한 쿼리를 빠르게 처리해야 할 때 적합하다. 복잡하고 무거운 쿼리를 자주 돌려야 하는 환경이라면 성능 이슈가 발생할 수 있다. 

 

 

 

| 분산 결합과 브로드캐스트 결합 

테이블의 결합은 종종 대량의 메모리를 소비한다. 특히 2개의 팩트 테이블을 결합하는 경우에는 매우 많은 조인 키를 메모리상에 계속 유지해야 한다. Presto는 기본적으로 분산 결합을 실시하며, 같은 키를 갖는 데이터는 동일한 노드에 모인다. 

 

 

분산 결합

같은 값을 가진 데이터를 같은 노드로 이동시켜서 결합하는 방식 

- 노드 간에 데이터를 주고 받아야 하므로 네트워크 비용이 크고 느릴 수 있다.

- 특히 조인에 필요한 데이터 양이 많을 경우 성능이 저하될 수 있다. (쿼리 지연) 

 

쉽게 말해, 분산 결합은 필요한 데이터들을 옮겨서 같은 컴퓨터(노드)에 옮긴 뒤 조인을 수행한다. 조인하려는 데이터가 흩어져 있으면, 한 족의 데이터를 다른 노드로 옮겨서 조인하는 방식 

 

 

브로드캐스트 결합

작은 테이블 전체를 모든 노드에 복사해서 결합하는 방식 

- 각 노드는 자신의 데이터만 가지고 조인하면 된다.

- 데이터를 재배치하지 않아도 되므로 빠르게 처리할 수있다.

- 작은 테이블이 자주 조인될 때 유리하다. 

브로드캐스트 결합은 조인할 때 작은 테이블을 모든 노드에 복사해서 큰 테이블과 조인하는 방식이다. 

 

 

분산 결합과 브로드캐스트 결합

기본적으로 Presto는 분산 결합을 먼저 시도한다. 즉, 각 노드에서 데이터를 서로 주고받으며 조인하는 방식이다. 이떄, 브로드캐스트 결합을 하려면, 분산 결합이 아님을 명시적으로 알려줘야 한다. 

SELECT *
FROM big_fact_table f
JOIN small_dimension_table d
ON f.id = d.id

 

그래서 쿼리 작성 순서가 중요하다. Presto는 먼저 등장한 테이블을 기준 테이블로 보고, 나중에 등장한 테이블을 복사해서 브로드캐스트 할 수 있는지 판단한다. 따라서 SELECT문으로 먼저 팩트 테이블을 지정해야 한다.그리고 디멘젼 테이블이 나중에 오도록 하면 Presto는 브로드캐스트 결합을 할 수 있다. 

 

 

| 열 지향 스토리지 집계 

앞서 설명한 구조에 의해 Presto는 열 지향 스토리지의 집계를 매우 빠르게 실행할 수 있다. 실제로 ORC 형식의 테이블을 로드해보면, 수백만 레코드 정도의 데이터 양인 경우 1초 미만으로 집계할 수 있음을 확인할 수 있다. 

 

정리하면 Presto는 열 지향 구조 덕분에 필요한 열만 읽고 처리할 수 있다. 그래서 데이터가 아무리 많아도, 전체 데이터를 다 스캔하지 않고, 빠르게 요약 결과만 계산할 수 있다.