Trino
Distributed SQL Query Engine
분산 SQL 쿼리 엔진. 다양한 데이터 소스를 표준 SQL로 연합 쿼리. OLAP 분석 최적화.
Distributed SQL Query Engine
분산 SQL 쿼리 엔진. 다양한 데이터 소스를 표준 SQL로 연합 쿼리. OLAP 분석 최적화.
Trino(구 PrestoSQL)는 Facebook에서 개발하고 이후 독립한 오픈소스 분산 SQL 쿼리 엔진입니다. 페타바이트 규모의 데이터를 대화형 속도(초 단위)로 쿼리할 수 있으며, 데이터 이동 없이 여러 데이터 소스를 단일 SQL로 조인하는 연합 쿼리(Federated Query)가 핵심 강점입니다.
Trino의 아키텍처는 Coordinator(쿼리 파싱, 계획, 스케줄링)와 Worker(실제 데이터 처리)로 구성됩니다. MPP(Massively Parallel Processing) 방식으로 쿼리를 분산 실행하며, 파이프라인 처리를 통해 중간 결과를 디스크에 쓰지 않아 속도가 빠릅니다.
Connector 아키텍처를 통해 Hive, Delta Lake, Iceberg, PostgreSQL, MySQL, MongoDB, Elasticsearch 등 수십 개 데이터 소스에 연결할 수 있습니다. 특히 S3, HDFS 기반 데이터 레이크의 OLAP 쿼리에 최적화되어 있으며, 테이블 포맷 최적화(Parquet, ORC)와 푸시다운(Predicate Pushdown)으로 I/O를 최소화합니다.
AWS Athena는 Trino 기반 서버리스 서비스이며, Starburst는 엔터프라이즈 기능을 추가한 상용 버전입니다. 데이터 레이크하우스 아키텍처에서 분석 레이어로 널리 사용되며, dbt와 연동하여 ELT 변환 워크로드에도 활용됩니다.
-- Trino 분산 SQL JOIN 쿼리 예제
-- 1. 여러 데이터 소스 연합 쿼리 (Federated Query)
-- S3 데이터 레이크 + PostgreSQL + Elasticsearch 조인
SELECT
o.order_id,
o.order_date,
c.customer_name,
c.email,
p.product_name,
p.category,
o.quantity,
o.total_amount,
r.review_score,
r.review_text
FROM hive.sales.orders o -- S3/Hive 데이터 레이크
JOIN postgres.crm.customers c -- PostgreSQL CRM
ON o.customer_id = c.customer_id
JOIN iceberg.catalog.products p -- Iceberg 테이블
ON o.product_id = p.product_id
LEFT JOIN elasticsearch.reviews.product_reviews r -- Elasticsearch
ON o.product_id = r.product_id
WHERE o.order_date >= DATE '2024-01-01'
AND o.region = 'APAC'
ORDER BY o.total_amount DESC
LIMIT 1000;
-- 2. 윈도우 함수를 활용한 분석 쿼리
WITH daily_metrics AS (
SELECT
DATE_TRUNC('day', event_time) AS event_date,
user_id,
COUNT(*) AS event_count,
SUM(revenue) AS daily_revenue
FROM delta.analytics.user_events
WHERE event_time >= CURRENT_DATE - INTERVAL '90' DAY
GROUP BY 1, 2
)
SELECT
event_date,
user_id,
daily_revenue,
SUM(daily_revenue) OVER (
PARTITION BY user_id
ORDER BY event_date
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
) AS rolling_7d_revenue,
RANK() OVER (
PARTITION BY event_date
ORDER BY daily_revenue DESC
) AS daily_rank
FROM daily_metrics
ORDER BY event_date DESC, daily_rank;
-- 3. 대용량 집계 최적화 (Approximate Functions)
SELECT
region,
APPROX_DISTINCT(user_id) AS unique_users,
APPROX_PERCENTILE(latency_ms, 0.95) AS p95_latency,
APPROX_PERCENTILE(latency_ms, 0.99) AS p99_latency
FROM hive.logs.api_requests
WHERE request_date = CURRENT_DATE
GROUP BY region;
시니어: "S3에 있는 로그 데이터랑 PostgreSQL 고객 정보를 조인해서 분석해야 하는데, Trino로 연합 쿼리 날리면 데이터 이동 없이 바로 할 수 있어요."
주니어: "Spark SQL이랑 뭐가 다른가요?"
시니어: "Trino는 대화형 쿼리에 최적화되어 있어서 초 단위로 결과가 나와요. Spark는 복잡한 ETL 배치에 더 적합하고요."
면접관: "Trino의 연합 쿼리(Federated Query)가 무엇이고, 어떤 장점이 있나요?"
지원자: "서로 다른 데이터 소스를 하나의 SQL로 조인하는 기능입니다. 데이터를 한 곳으로 복사하지 않아도 되어 저장 비용과 동기화 문제를 피할 수 있습니다."
시니어: "COUNT(DISTINCT user_id)가 5억 건 테이블에서 너무 느려요. APPROX_DISTINCT 쓰면 HyperLogLog로 2% 오차 내에서 훨씬 빨라요."
주니어: "정확한 값이 꼭 필요하지 않으면 근사 함수가 낫겠네요."