Trino를 사용하는 이유는 멀티 데이터 소스 쿼리(Federated Query)를 위함이다. 운영 데이터베이스(MySQL, PostgreSQL)와 빅데이터 플랫폼(Hive, Iceberg) 데이터를 하나의 쿼리로 결합한다. MySQL, PostgreSQL, Iceberg, Kafka 등 다양한 데이터 소스를 하나의 SQL로 조회 가능하다. 또한 운영 데이터베이스(MySQL, PostgreSQL)와 빅데이터 플랫폼(Hive, Iceberg) 데이터를 하나의 쿼리에서 조인가능하다.
🏳️🌈 [궁금한점]
Trino(구 PrestoSQL)는 빠르고 분산된 SQL 쿼리 엔진으로, 대용량 데이터 분석을 위해 개발된 오픈소스 프로젝트이다. 원래 Facebook(현 Meta)에서 Presto라는 이름으로 개발되었지만, 이후 개발진이 독립하여 Trino로 발전시켰다.
Trino는 고성능, 확장성, 다양한 데이터 소스 지원을 갖춘 분산 SQL 엔진으로, 데이터 웨어하우스 및 데이터 레이크에서 실시간 분석 및 이종 데이터 통합 분석을 가능하게 한다. Spark보다 빠른 대화형 SQL 분석, Hive보다 우수한 성능, Snowflake보다 유연한 오픈소스 환경을 원하는 기업 및 개발자들에게 강력한 선택지가 될 수 있다.
Trino는 Coordinator(조정 노드)와 Worker(작업 노드) 로 구성
| 비교 항목 | Trino | Apache Hive | Spark SQL | Snowflake |
|---|---|---|---|---|
| 쿼리 성능 | 매우 빠름 (메모리 기반) | 느림 (디스크 기반) | 빠름 (메모리 기반) | 매우 빠름 (클라우드 최적화) |
| 데이터 소스 지원 | 다수의 커넥터 지원 | 주로 HDFS | HDFS, Iceberg 등 | 클라우드 스토리지 |
| SQL 표준 지원 | ANSI SQL 완전 지원 | 제한적 | 거의 지원 | 완전 지원 |
| 실시간 분석 | 가능 | 어려움 | 가능 | 가능 |
| 확장성 | 매우 뛰어남 | 높음 | 높음 | 클라우드 자동 확장 |
Trino는 데이터 웨어하우스 대체 솔루션으로 활용될 수 있으며, PB급 데이터에 대한 빠른 분석이 가능.
예: 광고 로그 분석, 고객 행동 분석 등.
S3, HDFS, Google Cloud Storage(GCS) 등에 저장된 데이터를 ETL 없이 직접 쿼리할 수 있음.Iceberg, Delta Lake, Hudi 같은 테이블 포맷과 연동 가능.
Trino를 사용하면 하나의 SQL 쿼리로 여러 데이터베이스 및 데이터 소스를 조회 가능.
예: MySQL, PostgreSQL, Kafka, Elasticsearch 등의 데이터를 하나의 쿼리에서 조인할 수 있음.
Trino를 이용해 Spark, Presto, TensorFlow 등과 연동하여 대규모 데이터 전처리 및 분석 가능.
| Trino 버전 | 최소 요구 JDK 버전 | 추천 JDK 버전 |
|---|---|---|
| ≤ 414 | Java 11+ | Java 11, 17 |
| 415 ~ 443 | Java 17+ | Java 17, 21 |
| 444+ (최신) | Java 21+ | Java 21+ |
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

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
docker restart trino
sudo wget https://repo1.maven.org/maven2/io/trino/trino-cli/414/trino-cli-414-executable.jar -O trino
sudo chmod +x trino
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)]>
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)