Trino

Merhaba bu yazıda size Trino’dan bahsedeceğim. İlk olarak Trino’nun kısaca ne olduğuna bakalım ve ardından demo uygulaması yapalım.

Trino Nedir?

Trino, büyük veri analizi için hızlı ve dağıtık SQL sorgulama motorudur. Geleneksel SQL sorgularının yanı sıra NoSQL verileri de destekler ve çoklu veri kaynaklarından veri toplayabilir. Trino, ölçeklenebilirlik, performans ve düşük gecikme süresi sunar ve açık kaynak kodlu olması, kullanıcıların özelleştirme yapabilmesini ve topluluk desteğinden yararlanabilmesini sağlar.

Trino Mimarisi

Trino koordinatör(coordinator) ve işçi(worker) sunucularından oluşur. Bu sunucuların bir araya gelmesi ise küme(cluster) olarak adlandırılır. Koordinatör, gelen sorguları işleyen ve sorguları yürütmek için işçileri yöneten bir Trino sunucusudur. İşçi, görevleri yürütmekten ve verileri işlemekten sorumlu bir Trino sunucusudur.

 

Şekil-1: Trino Mimarisi

Temel Kavramlar

Trino, ilişkisel veritabanları, anahtar-değer depoları ve nesne depolama gibi harici veri kaynaklarına SQL tabanlı erişim sağlar. Trino’da aşağıdaki kavramların anlaşılması önemlidir: 

  • Konnektör (Connector): Trino’yu bir veri kaynağına uyarlar. Her katalog belirli bir bağlayıcı ile ilişkilidir.

 

Şekil-2: Konnektör Listesi
  • Katalog (Catalog): Bir veri kaynağına erişmek için ayrıntıları tanımlar; şemaları içerir ve kullanılacak belirli bir bağlayıcıyı yapılandırır.
  • Şema (Schema): Tabloları organize etmenin bir yolu. Katalog ve şema birlikte sorgulanabilecek bir tablo kümesi tanımlar.
  • Tablo (Table): Veri türleriyle adlandırılmış sütunlar halinde düzenlenmiş sıralanmamış satırlar kümesi.

Demo Uygulaması

Uygulamayı Docker kullanarak geliştireceğiz. Uygulamada kullandığımız kodlara buradan erişebilirsiniz. İlk olarak Trino’nun yapılandırma dosyalarını tanıyarak başlayalım. 

Trino’yu başlatmadan önce, bir dizi yapılandırma dosyası sağlamamız gerekiyor:

  • config.properties
  • jvm.config
  • node.properties  

Varsayılan olarak, yapılandırma dosyalarının kurulum dizini içindeki etc dizininde olması beklenir. Bu üç dosyayı olmadığında Trino çalışmaz.

config.properties 

Bu, trino kümesindeki her düğüm için birincil yapılandırma dosyasıdır. Burada ayarlanabilecek çok sayıda seçenek var demo uygulamasında varsayılan ayarları kullanarak devam edeceğiz. 

  • coordinator=true|false: Bu Trino örneğinin bir koordinatör olarak işlev görmesine  izin verir. Varsayılan olarak true değer alır. Değerin olarak ayarlanması, false sunucuyu çalışan olarak ayırır.
  • node-scheduler.include-coordinator=true|false: Koordinatör üzerinde çalışma planlamasına izin verir. Varsayılan olarak true değer alır.
  • http-server.http.port=8080 – http-server.https.port=8443: HTTP/HTTPS bağlantısı için sunucu için kullanılan bağlantı noktalarını belirtir. Trino, tüm dahili ve harici iletişim için HTTP kullanır.
  • discovery-server.enabled=true: Trino, kümedeki tüm düğümleri bulmak için keşif hizmetini kullanır. Her Trino örneği, başlangıçta keşif hizmetine kaydolur.
  • discovery.uri=http://localhost:8080: Keşif sunucusunun URI’si. Trino koordinatöründe gömülü keşif sürümünü çalıştırırken, Trino koordinatörünün URI’si olmalıdır.

jvm.config 

Trino, Java tabanlı bir uygulamadır. Bu dosya ise Trino’yu çalıştıran Java Sanal Makinesinin (JVM) bellek ayarlarını tutan bir yapılandırma dosyasıdır. 

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

node.properties 

Bu yapılandırma, kümedeki düğümleri benzersiz bir şekilde tanımlamak ve düğümdeki dizinlerin konumlarını belirtmek için kullanılır.

  • node.environment=demo: Ortamın gerekli adı . Bir kümedeki tüm Trino düğümleri aynı ortam adına sahip olmalıdır. Burada belirtilen ad, Trino Web UI başlığında görünür.
  • node.id=some-random-unique-string: Bu Trino kurulumu için isteğe bağlı benzersiz bir tanımlayıcı. Bu, her düğüm için benzersiz olmalıdır. Bu tanımlayıcı, Trino’nun yeniden başlatılması veya yükseltilmesi boyunca tutarlı kalmalı ve bu nedenle belirtilmelidir. Atlanırsa, her yeniden başlatmada rastgele bir tanımlayıcı oluşturulur.
  • node.data-dir=/var/trino/data: Trino’nun günlük dosyalarını ve diğer verileri depoladığı dizinin isteğe bağlı dosya sistemi yolu. Varsayılan olarak kurulum dizini içindeki var klasörüdür.

Repo üzerinde iki uygulama örneği bulunuyor.

Ben anlatmaya multi-node üzerinden devam edeceğim. Konfigürasyon işlemine başlayalım. 

Şekil-3: Multi-Node Uygulaması Mimarisi

Konfigürasyon

Koordinatör ve işçi sunucuların konfigürasyon ayarlarında farklılık olduğu için iki ayrı klasör oluşturuyoruz. Buradaki farklılık yalnız config properties dosyası içerisinde.

Şekil-4: Multi-Node Uygulaması Dosya Yapısı

coordinator/config.properties 

coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8080
discovery.uri=http://coordinator:8080

worker/config.properties

NOT: Bir Trino cluserındaki tüm işçi konfigürasyonları aynı olmalıdır.

coordinator=false
http-server.http.port=8080
discovery.uri=http://coordinator:8080

node.properties, jvm.config ve log.properties dosyaları içerikleri aynı her iki sunucu içinde aynı.

node.properties

node.environment=docker
node.data-dir=/data/trino
plugin.dir=/usr/lib/trino/plugin

jvm.config:

-server
-Xms2G
-Xmx2G
-XX:InitialRAMPercentage=80
-XX:MaxRAMPercentage=80
-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
-XX:+UnlockDiagnosticVMOptions
-XX:+UseAESCTRIntrinsics

Veri kaynaklarına bağlantı sağlayabilmek için etc/catalog dizinine konnektör dosyalarımızı eklememiz gerekiyor. Konnektör dosyaları bir veritabanına bağlanmak için gerekli olan ip, port, kullanıcı adı,  şifre vs. gibi bilgileri içerir.

  • mongo.properties
connector.name=mongodb
mongodb.connection-url=mongodb://admin:admin@mongodb:27017/
  • mysql.properties
connector.name=mysql
connection-url=jdbc:mysql://mysql:3306
connection-user=admin
connection-password=admin
  • minio.properties

Minio bağlantısı için aynı zamanda Hive Metastore için konfigürasyon ayrı yapılması gerekiyor. Yapılandırma dosyası xml formatında. Yine bu dosya içerisinde sunucu bilgileri, kullancı adı, şifre vb. gibi bilgileri bulunmakta bu bilgileri kendi bilgilerimize uyarlamamız gerekiyor. Örnek konfigürasyon dosyayına repo üzerinden erişebilirsiniz.

connector.name=hive
hive.metastore.uri=thrift://hive-metastore:9083
hive.s3.aws-access-key=trainkey
hive.s3.aws-secret-key=trainsecret
hive.s3.endpoint=http://minio:9000
hive.s3.path-style-access=true

Docker ile Trino Kurulumu

Hızlıca kullandığımız servisleri inceleyelim ve uygulamamızı çalıştıralım.

version: '3.7'

services:
  coordinator:
    container_name: mn-coordinator
    image: 'trinodb/trino:408'
    ports:
      - "9091:8080"
    volumes:
      - ./etc/coordinator:/etc/trino
    networks:
      - trino-multinode-network
  worker1:
    container_name: mn-worker1
    image: 'trinodb/trino:408'
    ports:
      - "8081:8081"
    volumes:
      - ./etc/worker:/etc/trino
    networks:
      - trino-multinode-network
  worker2:
    container_name: mn-worker2
    image: 'trinodb/trino:408'
    ports:
      - "8082:8081"
    volumes:
      - ./etc/worker:/etc/trino
    networks:
      - trino-multinode-network
  worker3:
    container_name: mn-worker3
    image: 'trinodb/trino:408'
    ports:
      - "8083:8081"
    volumes:
      - ./etc/worker:/etc/trino
    networks:
      - trino-multinode-network
  mysql:
    container_name: mn-mysql
    image: mysql:latest
    hostname: mysql
    environment:
      MYSQL_ROOT_PASSWORD: admin
      MYSQL_USER: admin
      MYSQL_PASSWORD: admin
    ports:
      - '3307:3306'
    networks:
      - trino-multinode-network
  mongodb:
    container_name: mn-mongo
    image: 'mongo:latest'
    hostname: mongodb
    ports:
      - '27018:27017'
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: admin
    networks:
      - trino-multinode-network
  mariadb:
    container_name: mariadb
    hostname: mariadb
    image: mariadb:10.5.8
    ports:
      - 3308:3306
    environment:
      MYSQL_ROOT_PASSWORD: admin
      MYSQL_USER: admin
      MYSQL_PASSWORD: admin
      MYSQL_DATABASE: metastore_db
    networks:
      - trino-multinode-network
  hive-metastore:
    hostname: hive-metastore
    image: 'bitsondatadev/hive-metastore:latest'
    ports:
      - '9083:9083' # Metastore Thrift
    volumes:
      - ./conf/metastore-site.xml:/opt/apache-hive-metastore-3.0.0-bin/conf/metastore-site.xml:ro
    environment:
      METASTORE_DB_HOSTNAME: mariadb
    depends_on:
      - mariadb
    networks:
      - trino-multinode-network
  minio:
    restart: always
    image: minio/minio:RELEASE.2023-02-27T18-10-45Z
    container_name: minio
    hostname: minio
    ports:
      - "9000:9000"
      - "9001:9001"
    networks:
      - trino-multinode-network
    command: server /data --console-address ':9001' --address ':9000'
    env_file:
      - .env
    environment:
      - MINIO_ROOT_USER=${AWS_ACCESS_KEY_ID}
      - MINIO_ROOT_PASSWORD=${AWS_SECRET_ACCESS_KEY}
    volumes:
      - ./data:/data

volumes:
  minio-data:
    driver: local

networks:
  trino-multinode-network:
    driver: bridge
  • hive-metastore: Minio’ya bağlantısını sağlamak için Hive Metastore’a ihtiyacımız var.
  • mariadb: Hive Metastore’un kullandığı veritabanı
  • coordinator: Trino’nun çalıştığı ana konteyner
  • İşçi sunucular
    • worker1
    • worker2 
    • worker3
  • Bağlantı yapacağımız veri tabanları
    • mysql 
    • mongodb
    • minio

Evet ayarlamaları yaptık. Servisleri de tanıdığımıza göre artık çalıştırabiliriz. 

docker-compose -f docker-compose-multinode.yaml up --build -d

Konteynerların durmunu kontrol edelim.

docker-compose -f docker-compose-multinode.yaml ps

Eğer sorun yoksa aşağıdaki şekilde bir çıktı alacağız. ‘STATUS’ kısmında hepsinin başladığını görüyoruz.

Şekil-5: Konteyner Listesi

 

Şimdi Trino arayüzüne gidelim. Arayüzün gelmesi biraz zaman alabiliyor. Her Trino sunucusu, genellikle Trino Web Kullanıcı Arayüzü olarak adlandırılan bir web arayüzü sağlar . Trino Web Kullanıcı Arayüzü, Trino sunucusu ve sunucudaki sorgu işleme hakkındaki ayrıntıları gösterir. Bir kullanıcı adı ile oturum açmanız gerekmektedir. Varsayılan olarak, hiçbir kimlik doğrulaması yapılandırılmadığı için ‘trino’ kullanıcı adı giriş yapabilirsiniz. Normalde Trino Web Arayüzü 8080 portunda çalışmaktadır. Ancak doker-compose dosyasında 9091 portuna yönlendirme yaptığımız için http://localhost:9091/ui/ üzerinde arayüze erişebiliriz.

Şekil-6: Trino Web Arayüzü

DBeaver SQL editörüyle Trino Bağlantısı

DBeaver SQL editörüyle Trino’ya bağlantı kurup sorgularımızı çalıştırabiliriz. Bağlantı kurmak için aşağıdaki adımları takip edebilirsiniz.

Adım-1: Veri tabanı seçimi

Şekil-7: Veri tabanı seçimi

Adım-2: Gerekli olan sürücüleri indirme

Şekil-8: Sürücü İndirme

Adım-3: Trino bağlantısı

Şekil-9: Trino bağlantısı

 

Trino ile Sorgulama 

Bağlantıyı sağladıktan sonra bir oturum açalım ve örnek sorgulama yapalım. Repoda paylaştığım multinode.sql içerisinde farklı sorgular mecvut. Yazıyı daha fazla uzatmamak için sadece Mysql ve Mongodb üzerinden join ile birleştip okuduğum veriyi Minio’ya ORC formatında nasıl kayıt edileceğini göstereceğim. 

Minio üzerinde şema oluşturalım 

Note: Kodlar çalıştırılmadan önce Minio üzerinde vbo isminde bucket oluşturulması gerekmektedir. Aksi halde hata oluşacaktır.

CREATE SCHEMA minio.vbo WITH (location = 's3a://vbo/')

Hangi şema üzerinde çalışacağımız belirtelim

USE minio.vbo;

Aşağıdaki sorguda Mysql ve Mongo veri tabanlarına Trino’nun test için sunduğu veri katalogundan veri aktarıp daha sonra kayıt ettiğimiz tabloları birleştip Minio’ya ORC formatın da yazıyoruz. 

create schema mysql.tiny;
create table mysql.tiny.nation AS SELECT * FROM tpch.tiny.nation;
create table mysql.tiny.region  AS SELECT * FROM tpch.tiny.region  ;



create schema mongo.tiny;
CREATE TABLE mongo.tiny.customer AS SELECT * FROM tpch.tiny.customer;
CREATE TABLE mongo.tiny.orders AS SELECT * FROM tpch.tiny.orders ;


create table minio.vbo.report_table WITH (format = 'ORC') as 
select  c.name as customer, o.totalprice, o.orderdate, n.name as nation, r.name as region 
from mongo.tiny.customer as c 
inner join mongo.tiny.orders as o on o.custkey = c.custkey  inner join mysql.tiny.nation as n on n.nationkey = c.nationkey  
inner join mysql.tiny.region as r on r.regionkey = n.regionkey

Son olarak kayıt ettiğimiz ORC formatındaki doysayı Minio arayüzünden kontrol edelim. Bağlanmak için http://localhost:9001  adresine gidelim.

  • Kullanıcı adı: trainkey
  • Şifre: trainsecret

Aşağıdaki görselde sorgu sonucunun doysa olarak kayıt edildiğini görebiliriz.

Şekil-10: Minio Arayüzü

Özetle, Trino, büyük veri setlerinde veri sorgulama işlemlerini hızlandırmak için kullanılan açık kaynaklı bir veri sorgulama motorudur. Bir veri tabanı değildir. Farklı veritabanlarına aynı anda bağlantı sağlayıp tek bir SQL syntax’i ile sorugulama yapmamız sağlayan bir araçtır. Aynı zamanda kullanıcı yetkilerinde bir sınırlama yoksa veriyi aktarımı içinde kullanabileceğimizi demo ile birlikte gözlemlemiş olduk. Yeni yazıda görüşmek üzere.

Kaynaklar

 

Yazar Hakkında
Toplam 6 yazı
Seda KAYADEMİR
Seda KAYADEMİR
Üniversite yıllarında tanışmış olduğu veri dünyasına ilgisi artan ve bu alanda kariyer hedeflemiş bir süre yazılım mühendisi olarak çalışmış ve hedefi doğrultusunda kendini geliştirerek kariyerine veri mühendisi olarak devam etmektedir. İlgilendiği Alanlar; Dataops, Mlops, Bulut Teknolojileri.
Yorumlar (Yorum yapılmamış)

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

×

Bir Şeyler Ara