반응형

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 이상 권장)

설치 과정

  1. 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
  1. 설정 파일 생성

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
  1. 카탈로그 설정

etc/catalog/memory.properties:

connector.name=memory
  1. 서버 실행
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

+ Recent posts