반응형
Trino 사용 가이드
1. Trino 소개
Trino(구 PrestoSQL)는 빠른 분산 SQL 쿼리 엔진으로, 다양한 데이터 소스에 대해 대화형 분석 쿼리를 실행할 수 있습니다. 하나의 쿼리로 여러 데이터베이스, 데이터 웨어하우스, 데이터 레이크의 데이터를 조합하여 분석할 수 있는 것이 큰 장점입니다.
주요 특징
- 다중 데이터 소스 지원: MySQL, PostgreSQL, Oracle, Cassandra, Hive, Iceberg 등
- 빠른 성능: 메모리 기반 처리로 빠른 쿼리 실행
- 표준 SQL 지원: ANSI SQL 표준을 준수
- 확장성: 수백 개의 노드로 확장 가능
- 연합 쿼리: 여러 데이터 소스를 조인하여 분석
2. 설치 및 설정
2.1 Docker를 사용한 빠른 시작
# Trino 서버 실행
docker run --name trino -d -p 8080:8080 trinodb/trino
# CLI 클라이언트 실행
docker exec -it trino trino
2.2 수동 설치
필수 요구사항
- Java 17 이상
- 최소 8GB RAM (프로덕션 환경에서는 32GB 이상 권장)
설치 과정
- Trino 다운로드
curl -O https://repo1.maven.org/maven2/io/trino/trino-server/435/trino-server-435.tar.gz
tar -xzf trino-server-435.tar.gz
cd trino-server-435
- 설정 파일 생성
etc/node.properties:
node.environment=production
node.id=ffffffff-ffff-ffff-ffff-ffffffffffff
node.data-dir=/var/trino/data
etc/jvm.config:
-server
-Xmx16G
-XX:InitialRAMPercentage=80
-XX:MaxRAMPercentage=80
-XX:G1HeapRegionSize=32M
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseG1GC
-XX:+UseGCOverheadLimit
-XX:+ExitOnOutOfMemoryError
-XX:ReservedCodeCacheSize=512M
-Djdk.attach.allowAttachSelf=true
etc/config.properties:
coordinator=true
node-scheduler.include-coordinator=true
http-server.http.port=8080
discovery.uri=http://localhost:8080
- 카탈로그 설정
etc/catalog/memory.properties:
connector.name=memory
- 서버 실행
bin/launcher run
3. 기본 사용법
3.1 CLI 접속
# 로컬 Trino 서버에 접속
trino --server localhost:8080
# 특정 카탈로그와 스키마 지정
trino --server localhost:8080 --catalog hive --schema default
# 사용자 인증이 필요한 경우
trino --server localhost:8080 --user myuser
3.2 기본 명령어
-- 카탈로그 목록 조회
SHOW CATALOGS;
-- 스키마 목록 조회
SHOW SCHEMAS FROM catalog_name;
-- 테이블 목록 조회
SHOW TABLES FROM catalog_name.schema_name;
-- 테이블 구조 확인
DESCRIBE catalog_name.schema_name.table_name;
-- 현재 세션 정보 확인
SELECT * FROM system.runtime.queries WHERE state = 'RUNNING';
4. 카탈로그 설정
4.1 MySQL 커넥터
etc/catalog/mysql.properties:
connector.name=mysql
connection-url=jdbc:mysql://localhost:3306
connection-user=root
connection-password=secret
4.2 PostgreSQL 커넥터
etc/catalog/postgresql.properties:
connector.name=postgresql
connection-url=jdbc:postgresql://localhost:5432/database
connection-user=postgres
connection-password=secret
4.3 Hive 커넥터
etc/catalog/hive.properties:
connector.name=hive
hive.metastore.uri=thrift://localhost:9083
hive.s3.endpoint=http://localhost:9000
hive.s3.access-key=minioadmin
hive.s3.secret-key=minioadmin
hive.s3.path-style-access=true
4.4 Iceberg 커넥터
etc/catalog/iceberg.properties:
connector.name=iceberg
hive.metastore.uri=thrift://localhost:9083
iceberg.catalog.type=hive
5. 실전 쿼리 예제
5.1 기본 쿼리
-- 단일 테이블 조회
SELECT customer_id, order_date, total_amount
FROM mysql.ecommerce.orders
WHERE order_date >= DATE '2024-01-01';
-- 집계 함수 사용
SELECT
DATE_TRUNC('month', order_date) as month,
COUNT(*) as order_count,
SUM(total_amount) as total_revenue
FROM mysql.ecommerce.orders
GROUP BY DATE_TRUNC('month', order_date)
ORDER BY month;
5.2 연합 쿼리 (Federation Query)
-- MySQL과 PostgreSQL 데이터 조인
SELECT
o.order_id,
o.customer_id,
c.customer_name,
o.total_amount
FROM mysql.ecommerce.orders o
JOIN postgresql.crm.customers c ON o.customer_id = c.customer_id
WHERE o.order_date >= DATE '2024-01-01';
5.3 복합 분석 쿼리
-- 윈도우 함수와 CTE 사용
WITH monthly_sales AS (
SELECT
DATE_TRUNC('month', order_date) as month,
SUM(total_amount) as monthly_total
FROM mysql.ecommerce.orders
GROUP BY DATE_TRUNC('month', order_date)
),
sales_with_growth AS (
SELECT
month,
monthly_total,
LAG(monthly_total) OVER (ORDER BY month) as prev_month_total,
(monthly_total - LAG(monthly_total) OVER (ORDER BY month)) /
LAG(monthly_total) OVER (ORDER BY month) * 100 as growth_rate
FROM monthly_sales
)
SELECT
month,
monthly_total,
COALESCE(ROUND(growth_rate, 2), 0) as growth_percentage
FROM sales_with_growth
ORDER BY month;
6. 성능 최적화
6.1 파티셔닝 활용
-- 파티션 정보 확인
SELECT * FROM hive.information_schema.table_properties
WHERE table_name = 'orders' AND property_name LIKE '%partition%';
-- 파티션 프루닝을 위한 WHERE 절 사용
SELECT *
FROM hive.warehouse.orders
WHERE year = '2024' AND month = '01';
6.2 컬럼 선택 최적화
-- 나쁜 예: 불필요한 컬럼 조회
SELECT * FROM large_table;
-- 좋은 예: 필요한 컬럼만 선택
SELECT customer_id, order_date, total_amount
FROM large_table;
6.3 조인 최적화
-- 큰 테이블을 오른쪽에, 작은 테이블을 왼쪽에 배치
SELECT *
FROM small_lookup_table s
JOIN large_fact_table l ON s.id = l.lookup_id;
7. 모니터링 및 관리
7.1 쿼리 모니터링
-- 실행 중인 쿼리 확인
SELECT
query_id,
state,
user_name,
source,
query,
created
FROM system.runtime.queries
WHERE state = 'RUNNING';
-- 완료된 쿼리 통계
SELECT
query_id,
state,
execution_time_ms,
queued_time_ms,
analysis_time_ms
FROM system.runtime.queries
WHERE created >= current_timestamp - INTERVAL '1' HOUR;
7.2 리소스 사용량 확인
-- 메모리 사용량 확인
SELECT
node_id,
total_memory_gb,
free_memory_gb,
(total_memory_gb - free_memory_gb) / total_memory_gb * 100 as memory_usage_percent
FROM system.runtime.nodes;
-- 태스크 실행 통계
SELECT
stage_id,
task_count,
running_tasks,
completed_tasks
FROM system.runtime.stages
WHERE query_id = 'your_query_id';
8. 보안 설정
8.1 HTTPS 설정
etc/config.properties:
http-server.https.enabled=true
http-server.https.port=8443
http-server.https.keystore.path=/path/to/keystore.jks
http-server.https.keystore.key=keystore_password
8.2 사용자 인증
etc/config.properties:
http-server.authentication.type=PASSWORD
etc/password-authenticator.properties:
password-authenticator.name=file
file.password-file=etc/password.db
8.3 접근 제어
etc/access-control.properties:
access-control.name=file
security.config-file=etc/rules.json
9. 문제 해결
9.1 일반적인 오류
메모리 부족 오류
Query exceeded maximum memory limit
해결방법: query.max-memory-per-node 설정 증가 또는 쿼리 최적화
연결 오류
Connection refused
해결방법: 서버 상태 확인, 방화벽 설정 확인, 포트 접근성 확인
9.2 로그 확인
# 서버 로그 확인
tail -f var/log/server.log
# HTTP 요청 로그 확인
tail -f var/log/http-request.log
10. 고급 기능
10.1 사용자 정의 함수 (UDF)
-- 내장 함수 사용 예제
SELECT
regexp_extract(email, '^([^@]+)@(.+)$', 1) as username,
regexp_extract(email, '^([^@]+)@(.+)$', 2) as domain
FROM users;
10.2 배치 처리
-- 대용량 데이터 배치 처리를 위한 INSERT
INSERT INTO hive.warehouse.processed_orders
SELECT
order_id,
customer_id,
DATE_TRUNC('day', order_date) as order_day,
total_amount
FROM mysql.ecommerce.raw_orders
WHERE order_date >= DATE '2024-01-01';
10.3 동적 필터링
-- 동적 파티션 프루닝
SELECT *
FROM partitioned_table
WHERE partition_column IN (
SELECT DISTINCT partition_value
FROM another_table
WHERE condition = 'specific_value'
);
이 가이드를 통해 Trino의 기본 사용법부터 고급 기능까지 체계적으로 학습하고 활용할 수 있습니다. 실제 환경에서는 데이터 규모와 성능 요구사항에 따라 적절한 설정 조정이 필요합니다.
반응형
'Data Platform > Trino' 카테고리의 다른 글
[Trino] 클러스터 구성 및 분산 처리 w.장애 극복 (0) | 2025.06.24 |
---|---|
[Trino] Trino란? (0) | 2025.06.24 |