Trino에 대한 실무 스터디 가이드

데이터 엔지니어 · 데이터 사이언티스트를 위한 핵심 요약

데이터 엔지니어 · 데이터 사이언티스트 query-engine distributed-sql federation 2026.03

1. Trino란?

Trino(구 PrestoSQL)는 오픈소스 분산 SQL 쿼리 엔진으로, 페타바이트 규모의 데이터를 초고속으로 분석할 수 있는 query-engine입니다. 다양한 데이터 소스(Hive, Kafka, S3, PostgreSQL 등)를 연합(federation)하여 ANSI SQL로 쿼리할 수 있으며, 별도의 데이터 이동 없이 실시간 분석을 지원합니다.

멀티 데이터소스 페더레이션

Hive, Kafka, Elasticsearch 등 30+ 커넥터로 데이터 레이크, 데이터 웨어하우스, 데이터베이스를 하나의 SQL로 통합 쿼리. 데이터 복제 불필요.

고성능 분산 처리

메모리 기반 MPP(Massively Parallel Processing) 아키텍처로 초당 TB급 쿼리 처리. Spark 대비 2-10배 빠른 성능.

스케일아웃 & 무중단

Kubernetes나 Docker로 쉽게 스케일링. Coordinator-Worker 구조로 고가용성 확보.

핵심 가치: 데이터 엔지니어는 ETL 없이, 데이터 사이언티스트는 Jupyter에서 즉시 분석 가능.

2. 왜 써야 하는가?

기존 도구 대비 Trino의 강점은 인-플레이스 분석과 초고속 쿼리입니다. 데이터 이동 비용을 없애고, 실시간 BI/AD-hoc 쿼리를 지원합니다.

기능 Trino Hive Spark SQL BigQuery
쿼리 속도 초~분 (메모리 기반) 분~시간 (MR 기반) 분 (디스크/메모리) 초 (클라우드 최적화)
데이터 소스 30+ 페더레이션 HDFS/Hive만 다양 (ETL 필요) GCS/BigQuery만
스토리지 인-플레이스 (0 추가) HDFS 별도 (Delta 등) 관리형
비용 오픈소스 (클러스터 비용) 저비용 배치 중간 (컴퓨트) 사용량 과금
실시간성 높음 (Interactive) 낮음 (Batch) 중간 높음
주의: OLTP(트랜잭션)보다는 OLAP(분석)에 최적화. UPDATE/DELETE는 제한적.

3. 핵심 개념

Trino는 Coordinator가 쿼리를 파싱/최적화/스케줄링하고, Worker들이 병렬 실행합니다. Catalog은 데이터 소스를 논리적으로 그룹화하며, Connector가 실제 데이터 액세스를 담당합니다.

+----------------+ +----------------+ +----------------+ | Clients | | Coordinator | | Workers | | (CLI, JDBC, |<----->| - Query Parser |<----->| - Task Exec | | Python, BI) | | - Optimizer | | - Data Fetch | +----------------+ | - Scheduler | | (N개) | | - Discovery | +----------------+ +----------------+ | | | v v +----------------+ +----------------+ | Catalog | | Connectors | | (Hive, Kafka, |<----->| (HiveMetastore,| | PostgreSQL..) | | Kafka, S3..) | +----------------+ +----------------+ | v +----------------+ | Data Sources | | (HDFS, S3, DBs)| +----------------+

주요 용어:

4. 퀵스타트

Step 1: Docker로 설치 (5분)

docker run -d -p 8080:8080 --name trino trinodb/trino:latest

브라우저에서 http://localhost:8080 접속 확인.

Step 2: 기본 설정 (config.properties 추가)

커스텀 설정 시:

# etc/config.properties
coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8080
query.max-memory=50GB
query.max-memory-per-node=1GB
discovery-server.enabled=true
discovery.uri=http://localhost:8080

Step 3: CLI로 첫 쿼리

docker exec -it trino trino --server localhost:8080 --catalog system --execute 'SHOW CATALOGS;'

Step 4: Python 클라이언트 (trino-python-client)

pip install trino

# example.py
import trino

conn = trino.dbapi.connect(
    host='localhost',
    port=8080,
    user='admin',
    catalog='system',
    schema='default'
)

cur = conn.cursor()
cur.execute('SELECT * FROM system.runtime.nodes LIMIT 5')
print(cur.fetchall())
cur.close()
conn.close()

실행: python example.py

팁: Hive 커넥터 추가 시 Docker volume으로 etc/catalog/hive.properties 마운트.

5. 핵심 설정 레퍼런스

설정 키 파일 기본값 설명 권장 실무값
query.max-memory config.properties 20GB 단일 쿼리 최대 메모리 50GB (대형 클러스터)
query.max-memory-per-node config.properties 1GB 노드당 쿼리 메모리 4GB (16GB RAM 노드)
query.max-stage-count config.properties 100 쿼리 스테이지 최대 200 (복잡 JOIN)
optimizer.optimize-hash-generation config.properties true HASH 최적화 true
hive.max-partitions-per-scan catalog/hive.properties 1M Hive 파티션 스캔 제한 100K (OOM 방지)
exchange.compression-enabled config.properties true 셔플 압축 true (네트워크 절약)

6. 실무 팁 & 트러블슈팅

자주 겪는 문제 1: OOM (Out of Memory)

원인: query.max-memory 초과.

해결:

# config.properties 증가
query.max-memory-per-node=4GB
# 또는 쿼리 힌트: /* +SET SESSION max_memory = 10GB */

문제 2: Query Timeout

해결: query.timeout=2h 설정 또는 SET SESSION query_timeout = 7200s;

문제 3: Slow JOIN

팁: /* +JOIN_REORDER_STRATEGY=ELIMINATE_CROSS_JOINS */ 힌트 사용. Broadcast JOIN 우선.

실무 팁

경고: Worker 노드 메모리 70% 초과 시 안정성 저하. heap dump 확인.

7. 참고 자료