Bigdata, Trino

Jeonghak Cho·2025년 3월 31일

Bigdata

목록 보기
13/30

📗Trino 사용 이유

Trino를 사용하는 이유는 멀티 데이터 소스 쿼리(Federated Query)를 위함이다. 운영 데이터베이스(MySQL, PostgreSQL)와 빅데이터 플랫폼(Hive, Iceberg) 데이터를 하나의 쿼리로 결합한다. MySQL, PostgreSQL, Iceberg, Kafka 등 다양한 데이터 소스를 하나의 SQL로 조회 가능하다. 또한 운영 데이터베이스(MySQL, PostgreSQL)와 빅데이터 플랫폼(Hive, Iceberg) 데이터를 하나의 쿼리에서 조인가능하다.

🏳️‍🌈 [궁금한점]

  • Trino 가 무엇이며 왜/어디에서 사용할까
  • 가장 일반적인 형태의 마리아DB 연결을 통해 외부 연결하는 방법

🔗[목차]

Trino 개요

Trino(구 PrestoSQL)는 빠르고 분산된 SQL 쿼리 엔진으로, 대용량 데이터 분석을 위해 개발된 오픈소스 프로젝트이다. 원래 Facebook(현 Meta)에서 Presto라는 이름으로 개발되었지만, 이후 개발진이 독립하여 Trino로 발전시켰다.
Trino는 고성능, 확장성, 다양한 데이터 소스 지원을 갖춘 분산 SQL 엔진으로, 데이터 웨어하우스 및 데이터 레이크에서 실시간 분석 및 이종 데이터 통합 분석을 가능하게 한다. Spark보다 빠른 대화형 SQL 분석, Hive보다 우수한 성능, Snowflake보다 유연한 오픈소스 환경을 원하는 기업 및 개발자들에게 강력한 선택지가 될 수 있다.

주요 특징

  • 고성능 SQL 쿼리 엔진
    Trino는 MPP(Massively Parallel Processing) 아키텍처를 사용하여 분산 환경에서 빠른 쿼리 처리가 가능함.
  • 대용량 데이터 레이크(S3, HDFS) 및 데이터 웨어하우스(Snowflake, Redshift, BigQuery 등)와 연동하여 빠른 쿼리 실행을 지원함.
  • 다양한 데이터 소스 지원
    하나의 Trino 클러스터에서 여러 데이터 소스(Hive, Iceberg, MySQL, PostgreSQL, Kafka, MongoDB 등)에 동시에 쿼리 가능.
    데이터 이동 없이 직접 분석할 수 있어, 데이터 엔지니어링 및 ETL 비용 절감 가능.
  • ANSI SQL 완전 지원
    SQL 표준(ANSI SQL)을 준수하여 일반적인 SQL 기반 애플리케이션과 호환 가능.JOIN, 서브쿼리, 윈도우 함수 등 복잡한 쿼리도 실행 가능.
  • 클라우드 및 온프레미스 환경 지원
    AWS, GCP, Azure 같은 클라우드 환경에서도 데이터 웨어하우스 대체 솔루션으로 사용 가능.Kubernetes, Docker 등 컨테이너 기반 배포 및 관리 가능.
  • 대규모 확장성(Scalability)
    수천 개의 노드로 확장 가능하여 페타바이트(PB) 단위의 데이터도 빠르게 분석할 수 있음.고성능 쿼리 실행을 위해 메모리 내 처리 방식(memory-based processing) 사용.

Trino 아키텍처

Trino는 Coordinator(조정 노드)와 Worker(작업 노드) 로 구성

Coordinator

  • 사용자의 SQL 쿼리를 수신하고 실행 계획을 생성.
  • Worker 노드에 작업을 배포하고 결과를 수집하여 사용자에게 반환.

Worker

  • Coordinator로부터 받은 쿼리를 실행하고 데이터를 처리.
  • 분산 환경에서 병렬로 실행되며, 여러 개의 Worker를 추가하여 성능 확장 가능.

Trino vs 기존 데이터 웨어하우스 및 쿼리 엔진 비교

비교 항목TrinoApache HiveSpark SQLSnowflake
쿼리 성능매우 빠름 (메모리 기반)느림 (디스크 기반)빠름 (메모리 기반)매우 빠름 (클라우드 최적화)
데이터 소스 지원다수의 커넥터 지원주로 HDFSHDFS, Iceberg 등클라우드 스토리지
SQL 표준 지원ANSI SQL 완전 지원제한적거의 지원완전 지원
실시간 분석가능어려움가능가능
확장성매우 뛰어남높음높음클라우드 자동 확장

TRINO 활용 사례

대용량 데이터 분석

Trino는 데이터 웨어하우스 대체 솔루션으로 활용될 수 있으며, PB급 데이터에 대한 빠른 분석이 가능.
예: 광고 로그 분석, 고객 행동 분석 등.

데이터 레이크 분석

S3, HDFS, Google Cloud Storage(GCS) 등에 저장된 데이터를 ETL 없이 직접 쿼리할 수 있음.Iceberg, Delta Lake, Hudi 같은 테이블 포맷과 연동 가능.

이종 데이터 소스 통합 쿼리

Trino를 사용하면 하나의 SQL 쿼리로 여러 데이터베이스 및 데이터 소스를 조회 가능.
예: MySQL, PostgreSQL, Kafka, Elasticsearch 등의 데이터를 하나의 쿼리에서 조인할 수 있음.

머신러닝 및 AI 데이터 파이프라인

Trino를 이용해 Spark, Presto, TensorFlow 등과 연동하여 대규모 데이터 전처리 및 분석 가능.

Trino 설치 및 기본 사용법 (JDK 17 기준)

⚙️Trino 버전별 JDK 버전

Trino 버전최소 요구 JDK 버전추천 JDK 버전
≤ 414Java 11+Java 11, 17
415 ~ 443Java 17+Java 17, 21
444+ (최신)Java 21+Java 21+

TRINO 설치

JDK 17 환경에 맞춘 도커 이미지 실행

docker run -d \
  -p 8080:8080 \
  -e TRINO_COORDINATOR=true \
  -e TRINO_DISCOVERY_SERVER_ENABLED=true \
  -e TRINO_HTTP_PORT=8080 \
  -e TRINO_JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 \
  --name trino \
  -v ~/trino/catalog:/etc/trino/catalog \
  -v ~/trino/config.properties:/etc/trino/config.properties \
  -v ~/trino/jvm.properties:/etc/trino/jvm.properties \
  --network mynetwork \
  --restart always \
  trinodb/trino:414

웹 콘솔 접속 확인

alt text

java, python 버전 확인

ubuntu@DESKTOP-SCOK45O:/opt/trino$ d exec -it trino java -version
openjdk version "17.0.6" 2023-01-17
OpenJDK Runtime Environment Temurin-17.0.6+10 (build 17.0.6+10)
OpenJDK 64-Bit Server VM Temurin-17.0.6+10 (build 17.0.6+10, mixed mode, sharing)

ubuntu@DESKTOP-SCOK45O:/opt/trino$ d exec -it trino python --version
Python 3.10.6

MariaDB 가 설치되어 있고, ID/Password 가 root / 1234 로 설정된 상태에서 카탈로그 속성 정의

ubuntu@DESKTOP-SCOK45O:~/trino/catalog$ pwd
/home/ubuntu/trino/catalog

ubuntu@DESKTOP-SCOK45O:~/trino/catalog$ vi mariadb.properties
  • 마리아디비 카탈로그 정의 파일
connector.name=mysql
connection-url=jdbc:mysql://localhost:3306
connection-user=root
connection-password=1234
  • TRINO 재시작
docker restart trino

CLI 설치

sudo wget https://repo1.maven.org/maven2/io/trino/trino-cli/414/trino-cli-414-executable.jar -O trino
sudo chmod +x trino

Mariadb 접속 확인

ubuntu@DESKTOP-SCOK45O:~$ d exec -it mariadb bash
root@8d33b712bf9f:/# mariadb -uroot -p1234
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 11.7.2-MariaDB-ubu2404 mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

TRINO 사용법

마리아디비 카탈로그 접속

ubuntu@DESKTOP-SCOK45O:~/trino/catalog$ ./trino --server http://localhost:8080 --catalog mariadb

카탈로그 목록 조회

trino> SHOW CATALOGS;
 Catalog
---------
 mariadb
 system
(2 rows)

Query 20250327_063220_00000_2n683, FINISHED, 1 node
Splits: 11 total, 11 done (100.00%)
0.82 [0 rows, 0B] [0 rows/s, 0B/s]

함수 목록 조회

trino> SHOW FUNCTIONS;
            Function             |         Return Type          |                                 Argument Types                                 | Function Type | Determini>
---------------------------------+------------------------------+--------------------------------------------------------------------------------+---------------+---------->
 abs                             | bigint                       | bigint                                                                         | scalar        | true     >

스키마 목록 조회

trino> SHOW SCHEMAS FROM mariadb;
       Schema
--------------------
 information_schema
 myschema
 performance_schema
(3 rows)

스키마 생성

trino> create schema mariadb.mariadb_schema;
CREATE SCHEMA

스키마 삭제

trino> drop schema mariadb.mariadb_schema;
DROP SCHEMA

테이블 조회

trino> SHOW TABLES FROM myschema;
 Table
-------
 users
(1 row)

테이블 칼럼 목록 보기

trino> describe mariadb.myschema.users;
 Column |  Type   | Extra | Comment
--------+---------+-------+---------
 id     | integer |       |
 name   | varchar |       |
 age    | integer |       |
(3 rows)

테이블 생성

trino> CREATE TABLE mariadb.myschema.new_table (
    ->     id INT,
    ->     name VARCHAR
    -> );
CREATE TABLE

데이터 삽입

trino> INSERT INTO mariadb.myschema.new_table VALUES (1, 'Alice');
INSERT: 1 row

데이터 조회

trino> SELECT * FROM mariadb.myschema.new_table;
 id | name
----+-------
  1 | Alice
(1 row)

0개의 댓글