Trino è un motore di query SQL distribuito open-source progettato per interrogare grandi set di dati distribuiti su uno o più sistemi di origine dati eterogenei. Trino è stato progettato per gestire data warehousing, ETL e analisi interattiva da grandi quantità di dati e produrre report.
Alluxio è una piattaforma open-source di orchestrazione dei dati per analisi su larga scala e AI. Alluxio si trova tra i framework di calcolo come Trino e Apache Spark e vari sistemi di archiviazione come Amazon S3, Google Cloud Storage, HDFS e MinIO.
Questo è un tutorial per la distribuzione di Alluxio come livello di caching per Trino utilizzando il connettore Iceberg.
Perché Abbiamo Bisogno del Caching per Trino?
A small fraction of the petabytes of data you store is generating business value at any given time. Repeatedly scanning the same data and transferring it over the network consumes time, compute cycles, and resources. This issue is compounded when pulling data from disparate Trino clusters across regions or clouds. In these circumstances, caching solutions can significantly reduce the latency and cost of your queries.
Trino ha un motore di caching incorporato, Rubix, nel suo connettore Hive. Sebbene questo sistema sia conveniente poiché viene fornito con Trino, è limitato al connettore Hive e non è stato mantenuto dal 2020. Inoltre, manca di funzionalità di sicurezza e supporto per ulteriori motori di calcolo.
Trino su Alluxio
Alluxio collega Trino a vari sistemi di archiviazione, fornendo API e uno spazio dei nomi unificato per applicazioni guidate dai dati. Alluxio consente a Trino di accedere ai dati indipendentemente dalla fonte dati e memorizza in cache in modo trasparente i dati accessi frequenti (ad esempio, tabelle comunemente utilizzate) nell’archiviazione distribuita di Alluxio.
Utilizzo del Caching di Alluxio tramite il Connettore Iceberg su Archiviazione File MinIO
Abbiamo creato una demo che dimostra come configurare Alluxio per utilizzare il caching write-through con MinIO. Questo è ottenuto utilizzando il connettore Iceberg e apportando una singola modifica alla proprietà della posizione sulla tabella dal punto di vista di Trino.
In questa demo, Alluxio viene eseguito su server separati; tuttavia, è consigliato eseguirlo sugli stessi nodi di Trino. Ciò significa che tutte le configurazioni per Alluxio saranno situate sui server dove Alluxio viene eseguito, mentre la configurazione di Trino rimane invariata. Il vantaggio di eseguire Alluxio esternamente è che non competerà per risorse con Trino, ma lo svantaggio è che i dati dovranno essere trasferiti attraverso la rete durante la lettura da Alluxio. È cruciale per le prestazioni che Trino e Alluxio si trovino sulla stessa rete.
Per seguire questa demo, copia il codice situato qui.
Configurazione di Trino
Trino è configurato in modo identico a una configurazione standard di Iceberg. Poiché Alluxio è in esecuzione esternamente a Trino, la sola configurazione necessaria è al momento della query e non al momento del startup.
Configurazione di Alluxio
La configurazione di Alluxio può essere impostata tutta utilizzando il file alluxio-site.properties
. Per mantenere tutte le configurazioni co-locate sul file docker-compose.yml
, le stiamo impostando utilizzando le proprietà Java tramite la variabile di ambiente ALLUXIO_JAVA_OPTS
. Questo tutorial si riferisce anche al nodo master come leader e ai lavoratori come follower.
Configurazioni del Master
alluxio.master.mount.table.root.ufs=s3://alluxio/
Il leader espone i porte 19998
e 19999
, dove il secondo è la porta per l’interfaccia web.
Configurazioni del Worker
alluxio.worker.ramdisk.size=1G
alluxio.worker.hostname=alluxio-follower
Il follower espone le porte 29999
e 30000
, e configura una memoria condivisa utilizzata da Alluxio per memorizzare i dati. Questa è impostata su 1G
tramite la proprietà shm_size
ed è richiamata dalla proprietà alluxio.worker.ramdisk.size
.
Configurazioni condivise tra Leader e Follower
alluxio.master.hostname=alluxio-leader
# Configurazioni di Minio
alluxio.underfs.s3.endpoint=http://minio:9000
alluxio.underfs.s3.disable.dns.buckets=true
alluxio.underfs.s3.inherit.acl=false
aws.accessKeyId=minio
aws.secretKey=minio123
# Configurazioni solo per dimostrazione
alluxio.security.authorization.permission.enabled=false
Il alluxio.master.hostname
deve essere presente su tutti i nodi, leader e follower. La maggior parte delle configurazioni condivise indirizza Alluxio verso il underfs
, che in questo caso è MinIO.
alluxio.security.authorization.permission.enabled
è impostato su “false” per mantenere semplice la configurazione Docker.
Nota: Non è consigliato fare questo in un ambiente di produzione o CI/CD.
Esecuzione dei Servizi
In primo luogo, si desidera avviare i servizi. Assicurati di trovarti nella directory trino-getting-started/iceberg/trino-alluxio-iceberg-minio
. Ora, esegui il seguente comando:
docker-compose up -d
Ci si aspetta di vedere il seguente output. Docker potrebbe anche dover scaricare le immagini Docker prima di vedere i messaggi “Crea/Avvia”, quindi potrebbe esserci un output aggiuntivo:
[+] Running 10/10
⠿ Network trino-alluxio-iceberg-minio_trino-network Created 0.0s
⠿ Volume "trino-alluxio-iceberg-minio_minio-data" Created 0.0s
⠿ Container trino-alluxio-iceberg-minio-mariadb-1 Started 0.6s
⠿ Container trino-alluxio-iceberg-minio-trino-coordinator-1 Started 0.7s
⠿ Container trino-alluxio-iceberg-minio-alluxio-leader-1 Started 0.9s
⠿ Container minio Started 0.8s
⠿ Container trino-alluxio-iceberg-minio-alluxio-follower-1 Started 1.5s
⠿ Container mc Started 1.4s
⠿ Container trino-alluxio-iceberg-minio-hive-metastore-1 Started
Apertura CLI Trino
Una volta completato, puoi accedere al nodo coordinatore Trino. Lo faremo utilizzando il comando exec
e eseguire l’eseguibile CLI trino
come comando che eseguiamo su quel contenitore. Nota che l’id del contenitore è trino-alluxio-iceberg-minio-trino-coordinator-1
, quindi il comando che eseguirai è:
<<<<<<< HEAD
docker container exec -it trino-alluxio-iceberg-minio-trino-coordinator-1 trino
=======
docker container exec -it trino-minio_trino-coordinator_1 trino
>>>>>>> alluxio
Quando inizi questo passaggio, dovresti vedere il cursore trino
una volta completato il processo di avvio. Dovrebbe apparire così quando è finito:
trino>
Per comprendere al meglio come funziona questa configurazione, creiamo una tabella Iceberg utilizzando una query CTAS (CREATE TABLE AS) che spinge i dati da uno dei connettori TPC in Iceberg che punta a MinIO. I connettori TPC generano dati al volo, quindi possiamo eseguire semplici test come questo.
Per prima cosa, esegui un comando per mostrare i cataloghi per vedere i cataloghi tpch
e iceberg
poiché questi sono quelli che utilizzeremo nella query CTAS:
SHOW CATALOGS;
Dovresti vedere che il catalogo Iceberg è registrato.
Bucket MinIO e Schemi Trino
All’avvio, viene eseguito il seguente comando in un container di inizializzazione che include l’interfaccia utente mc
per MinIO. Questo crea un bucket in MinIO chiamato /alluxio
, che ci fornisce un luogo in cui scrivere i nostri dati e possiamo indicare a Trino dove trovarli:
/bin/sh -c "
until (/usr/bin/mc config host add minio http://minio:9000 minio minio123) do echo '...waiting...' && sleep 1; done;
/usr/bin/mc rm -r --force minio/alluxio;
/usr/bin/mc mb minio/alluxio;
/usr/bin/mc policy set public minio/alluxio;
exit 0;
"
Nota: Questo bucket fungerà da punto di montaggio per Alluxio, quindi la directory schema alluxio://lakehouse/
in Alluxio si mapparà su s3://alluxio/lakehouse/
.
Esecuzione di query su Trino
Passiamo a creare il nostro SCHEMA
che ci indica il bucket in MinIO e poi eseguiamo la nostra query CTAS. Tornando al terminale, crea il SCHEMA
iceberg.lakehouse
. Questa sarà la prima chiamata al metastore per salvare la posizione dello schema nello spazio dei nomi Alluxio. Nota che dovremo specificare il nome host alluxio-leader
e la porta 19998
poiché non abbiamo impostato Alluxio come file system predefinito. Tenere presente questo aspetto se si desidera che l’utilizzo del caching Alluxio sia predefinito e trasparente per gli utenti che gestiscono le dichiarazioni DDL:
CREATE SCHEMA iceberg.lakehouse
WITH (location = 'alluxio://alluxio-leader:19998/lakehouse/');
Ora che abbiamo un SCHEMA
che fa riferimento al bucket in cui memorizziamo le nostre tabelle in Alluxio, che sincronizza con MinIO, possiamo creare la nostra prima tabella.
Facoltativo: Per visualizzare le query eseguite, accedi alla Interfaccia Umana di Trino e accedi utilizzando qualsiasi nome utente (non ha importanza poiché non è impostata alcuna sicurezza).
Sposta i dati dei clienti dai piccoli dati generati TPCH in MinIO utilizzando una query CTAS. Esegui la seguente query e, se lo desideri, osservala in esecuzione sull’Interfaccia Umana di Trino:
CREATE TABLE iceberg.lakehouse.customer
WITH (
format = 'ORC',
location = 'alluxio://alluxio-leader:19998/lakehouse/customer/'
)
AS SELECT * FROM tpch.tiny.customer;
Vai alla Interfaccia Umana di Alluxio e alla Interfaccia Umana di MinIO e sfoglia i file di Alluxio e MinIO. Ora vedrai una directory lakehouse
che contiene una directory customer
che contiene i dati scritti da Trino ad Alluxio e da Alluxio a MinIO.
Ora, c’è una tabella sotto Alluxio e MinIO, puoi interrogare questi dati verificando quanto segue:
SELECT * FROM iceberg.lakehouse.customer LIMIT 10;
Come possiamo essere sicuri che Trino stia effettivamente leggendo da Alluxio e non da MinIO? Eliminiamo i dati in MinIO e eseguiamo nuovamente la query solo per sicurezza. Una volta eliminati questi dati, dovresti comunque vedere i dati restituiti.
Arresto dei Servizi
Una volta completato questo tutorial, le risorse utilizzate per questa esercitazione possono essere rilasciate eseguendo il seguente comando:
docker-compose down
Conclusione
A questo punto, dovresti avere una migliore comprensione di Trino e Alluxio, come iniziare con il deployment di Trino e Alluxio e come utilizzare il caching di Alluxio con un connettore Iceberg e il file storage di MinIO. Spero che questo articolo ti sia piaciuto. Assicurati di apprezzare questo articolo e commentare se hai domande!
Source:
https://dzone.com/articles/get-started-with-trino-and-alluxio-in-five-minutes