데이터 엔지니어 · 데이터 사이언티스트를 위한 핵심 요약
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 구조로 고가용성 확보.
기존 도구 대비 Trino의 강점은 인-플레이스 분석과 초고속 쿼리입니다. 데이터 이동 비용을 없애고, 실시간 BI/AD-hoc 쿼리를 지원합니다.
| 기능 | Trino | Hive | Spark SQL | BigQuery |
|---|---|---|---|---|
| 쿼리 속도 | 초~분 (메모리 기반) | 분~시간 (MR 기반) | 분 (디스크/메모리) | 초 (클라우드 최적화) |
| 데이터 소스 | 30+ 페더레이션 | HDFS/Hive만 | 다양 (ETL 필요) | GCS/BigQuery만 |
| 스토리지 | 인-플레이스 (0 추가) | HDFS | 별도 (Delta 등) | 관리형 |
| 비용 | 오픈소스 (클러스터 비용) | 저비용 배치 | 중간 (컴퓨트) | 사용량 과금 |
| 실시간성 | 높음 (Interactive) | 낮음 (Batch) | 중간 | 높음 |
Trino는 Coordinator가 쿼리를 파싱/최적화/스케줄링하고, Worker들이 병렬 실행합니다. Catalog은 데이터 소스를 논리적으로 그룹화하며, Connector가 실제 데이터 액세스를 담당합니다.
주요 용어:
docker run -d -p 8080:8080 --name trino trinodb/trino:latest
브라우저에서 http://localhost:8080 접속 확인.
커스텀 설정 시:
# 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
docker exec -it trino trino --server localhost:8080 --catalog system --execute 'SHOW CATALOGS;'
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
| 설정 키 | 파일 | 기본값 | 설명 | 권장 실무값 |
|---|---|---|---|---|
| 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 (네트워크 절약) |
원인: query.max-memory 초과.
해결:
# config.properties 증가
query.max-memory-per-node=4GB
# 또는 쿼리 힌트: /* +SET SESSION max_memory = 10GB */
해결: query.timeout=2h 설정 또는 SET SESSION query_timeout = 7200s;
팁: /* +JOIN_REORDER_STRATEGY=ELIMINATE_CROSS_JOINS */ 힌트 사용. Broadcast JOIN 우선.
helm install trino trinodb/trinopip install trino - GitHub