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.
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.
- 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.
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.
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.
Ş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.
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
Adım-2: Gerekli olan sürücüleri indirme
Adım-3: 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.
Ö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
- Trino 408 Documentation
- 4. Trino Architecture – Trino: The Definitive Guide [Book]
- bitsondatadev/trino-getting-started
- GitHub – Lewuathe/docker-trino-cluster: Multiple node presto cluster on docker container
- Presto and Minio on Docker Infrastructure
- Trino – Revision #3 (Kapak Fotoğrafı)
Merhaba,
Trino hakkında bilgi edinmek için araştırma yapıyordum. Yazınız yararlı oldu. Elinize sağlık.