데이터 엔지니어 기술 블로그

[Trino] 트리노(프레스토) 기본 개념 이해 및 사용하기 본문

데이터 엔지니어링

[Trino] 트리노(프레스토) 기본 개념 이해 및 사용하기

jun_yeong_park 2022. 2. 4. 14:04
반응형

About

Trino

트리노는 빅데이터를 쿼리하기 위한 분산 SQL 쿼리 엔진이다. 기존에는 HDFS를 쿼리하도록 설계되었지만 지금은 그것에만 국한되지 않는다. Trino라는 이름은 Presto라는 이름을 리브랜딩 한 것으로 같은 쿼리 엔진이다.

트리노는 범용 데이터베이스가 아니기 때문에 MySQL과 같이 OLTP(Online Transaction Processing)가 아닌 OLAP(Online Analytics Processing)로 설계되었다.

 

Concepts

Server types

트리노는 두 가지의 서버 타입이 있다. 하나는 Coordinator로 다른 하나는 Worker이다. 이름과 같이 Coordinator는 구문 분석, 쿼리 계획, 작업자 노드 관리와 같은 일을 하고 Worker는 실제 작업을 실행하고 데이터 처리를 담당한다. 연결된 커넥터에서 데이터를 가져오고 서로 중간 데이터를 교환한다. REST API를 사용하여 Worker와 Coordinator와 통신한다.

 

Data sources

Connector

모든 카탈로그의 데이터는 특정 커넥터와 연결된다. 둘 이상의 카탈로그가 동일한 커넥터를 사용하여 서로 다른 두 인스턴스를 연결할 수 있다.

 

Catalog

카탈로그 안에는 스키마들이 있다. 커넥터를 통해 데이터 소스를 참조한다.

 

Schema

스키마 안에는 테이블들이 있다.

 

Table

테이블은 컬럼과 타입들이 있는 정렬되지 않은 행 집합이며 맵핑은 커넥터에 의해 정의된다.

Query execution model

Statement

ANSI호환 SQL문을 실행한다. statement는 Trino에 전달되는 SQL 텍스트이다

 

Query

statement를 분석할 때 쿼리로 변환하고 분산 쿼리 계획을 생성하면 Trino Worker에서 실제로 실행이 된다.

 

Stage

쿼리를 실행할 때 stage로 분할하여 실행을 한다.

 

Task

스테이지 자체는 Trino Worker에서 실행되지 않는다. Stage는 Task로 분할되어 실제로 Worker에서 실행이 된다.

 

Split

Tasks는 분할하여 작동한다. 가장 낮은 단계에서 커넥터에서 split을 통하여 데이터를 검색하고 상위 수준에 있는 중간 단계는 그 아래 단계에서 데이터를 검색한다.

 

Driver

드라이버는 하나의 입력과 하나의 출력이 있다. Trino Architecture에서 가장 낮은 수준에 있는 병렬 처리이다. Task에는 하나 이상의 병렬 드라이버가 포함이 된다.

 

Operator

데이터를 소비, 변환, 생성한다.

 

Exchange

쿼리에서 노드 간의 데이터를 전송한다.

 

Deploying Trino

Requirements

리눅스

  • 64-bit
  • 최신 릴리즈

JRE

  • Java11.0.11 이상 버전
  • Java 12, 13 지원하지 않음

Python

  • version: 2.6.x, 2.7.x, 3.x
  • bin/launcher 스크립트를 실행하기 위해서 필요하다.

Trino Installation

  1. trino-server-370.tar.gz 다운로드 및 압축 해제
  2. 설치 디렉토리 내에 etc 디렉토리 생성
    1. Node Properties: 노드에 대한 특정 환경 구성
    2. JVM Config: JVM에 대한 명령줄 옵션
    3. Config Properties: Trino 서버에 대한 구성
    4. Catalog Properties: 커넥터 구성

 

Node properties

etc/node.properties는 Trino를 처음 실행하면 배포 시스템에서 생성이 된다. 각 노드에 관련된 구성이 포함되어 있다.

node.environment=production
node.id=ffffffff-ffff-ffff-ffff-ffffffffffff
node.data-dir=/var/trino/data
  • node.id는 모든 노드에 대해 고유해야한다.
  • node.data-dir에 로그와 기타 데이터를 저장한다.

 

JVM

etc/jvm.config는 JVM을 시작할 때의 옵션들이 포함되어있다.

-server
-Xmx16G
-XX:-UseBiasedLocking
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+ExplicitGCInvokesConcurrent
-XX:+ExitOnOutOfMemoryError
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-XX:ReservedCodeCacheSize=512M
-XX:PerMethodRecompilationCutoff=10000
-XX:PerBytecodeRecompilationCutoff=10000
-Djdk.attach.allowAttachSelf=true
-Djdk.nio.maxCachedBufferSize=2000000

 

Config properties

etc/config.properties는 Trino 서버에 대한 구성이포함되어 있다.

# Coordinator 구성 예시
coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8080
query.max-memory=50GB
query.max-memory-per-node=1GB
query.max-total-memory-per-node=2GB
discovery.uri=http://example.net:8080
# Worker 구성 예시
coordinator=false
http-server.http.port=8080
query.max-memory=50GB
query.max-memory-per-node=1GB
query.max-total-memory-per-node=2GB
discovery.uri=http://example.net:8080
# 단일 시스템 예시
coordinator=true
node-scheduler.include-coordinator=true
http-server.http.port=8080
query.max-memory=5GB
query.max-memory-per-node=1GB
query.max-total-memory-per-node=2GB
discovery.uri=http://example.net:8080

 

Log levels

etc/log.properties에는 최소 로그 수준을 설정할 수 있도록 한다.

io.trino=INFO

 

Catalog properties

카탈로그에 탑제된 커넥터를 통해 데이터에 액세스할 수 있다. 커넥터는 카탈로그 내부의 모든 스키마와 테이블을 제공한다. 각자 매핑해서 트리노로 들어올 수 있다.

카탈로그는 etc/catalog/{name}.properties라는 이름으로 작성할 수 있다.

connector.name=mysql

 

트리노 실행하기

bin/launcher를 실행하여 Trino를 실행할 수 있다.

bin/launcher start

만약 로그를 직접 눈으로 보면서 디버깅하고싶다면 아래와 같이 실행한다.

bin/launcher run

 

로그 파일을 확인하는 방법

{data directory}/var

  • launcher.log
    • 런처에 의해 생성되며 stdout, stderr 스트림에 연결된다.
    • 서버 로깅이 초기화되는 동안 발생하는 로그 메시지와 JVM에서 생성한 메시지가 포함된다.
  • server.log
    • 트리노에서 사용하는 메인 로그 파일이며 자동으로 로테이트하고 압축된다.
  • http-request.log
    • HTTP 로그가 포함되어있다.
    • 자동으로 회전하고 압축된다.

 

Clients

트리노를 사용하기 위한 클라이언트에는 아래와 같은 종류들이 있다.

  1. Command line interface
  2. JDBC 드라이버
  3. Python과 같은 플랫폼

 

Command line interface

Trino CLI는 일반 UNIX 실행 파일처럼 작동한다. CLI는 REST API를 사용하여 Trino와 통신한다.

 

Requirements

  • JVM

Installation

  1. trino-cli-370-executable.jar
  2. chmod +x
  3. ./trino --server localhost:8080 --catalog hive --schema default

 

JDBC driver

<dependency> 
    <groupId>io.trino</groupId> 
    <artifactId>trino-jdbc</artifactId> 
    <version>370</version> 
</dependency>

Example

jdbc:trino://example.net:8080/hive/sales

 

Web UI

 

Trino는 Web UI를 제공해준다.

 

States

  • QUEUED: 큐에 대기중인 상태
  • PLANNING: 쿼리 계획중인 상태
  • STARTING: 쿼리 실행 시작하는 상태
  • RUNNING: 쿼리에 실행중인 Task가 존재하는 상태
  • BLOCKED: 쿼리가 차단되고 메모리, 버퍼 공간 등을 기다리는 상태
  • FINISHING: 쿼리가 커밋이 진행중이고 완료되는 상태
  • FINISHED: 쿼리 실행이 완료된 상태
  • FAILED: 쿼리 실행이 실패한 상태

 

Connectors

트리노에서는 다양한 소스의 커넥터를 제공해준다. 370버전에서 제공해주는 커넥터의 예시는 다음과 같다.

  • BigQuery
  • Cassandra
  • Elasticsearch
  • Google Sheets
  • Hive
  • JMX
  • Kafka
  • Kinesis
  • Local File
  • Memory
  • MongoDB
  • MySQL
  • Oracle
  • PostgreSQL
  • Prometheus
  • Redis
  • Redshift
  • System
  • Thrift

MySQL Connector Example

  1. etc/catalog 폴더로 들어간다.
  2. {name}.properties 로 파일을 생성한다.
  3. 아래와 같이 값을 입력한다.
  4. connector.name=mysql connection-url=jdbc:mysql://example.net:3306 connection-user=root connection-password=secret
  5. 이렇게 설정하면 Trino에서 SELECT * FROM {name}.{database}.{table} 로 쿼리를 할 수 있다.

 

 

Trino 도커로 간단하게 사용해보기

  1. docker-compose.yaml 파일 작성하기
    version: '3.4'
    services:
      trino:
        image: trinodb/trino
        container_name: trino
        ports:
          - 8080:8080
        volumes:
          - './etc:/etc/trino'
  2. docker-compose.yaml이 있는 경로에 etc 폴더 생성하기
  3. etc폴더에 아래와 같이 추가하고 설정하기
    catalog/mysql.properties
    config.properties
    jvm.config
    log.properties
    node.properties​
  4. docker 실행 후 사용해보기
  5. select * from mysql.{database}.{table_name} limit 10;

 

 

이 글은 Trino 370을 기준으로 작성되었습니다.

반응형
Comments