Aan de slag met Trino en Alluxio in vijf minuten

Trino is een open-source gedistribueerde SQL-query-engine ontworpen om grote gegevenssets te onderzoeken die zijn verspreid over één of meer heterogene gegevensbronnen. Trino is ontworpen om gegevensopslag, ETL en interactieve analyses aan te pakken door grote hoeveelheden gegevens te verwerken en rapporten te produceren. 

Alluxio is een open-source databiorchestratieplatform voor grootschalige analyses en AI. Alluxio bevindt zich tussen berekeningsframeworks zoals Trino en Apache Spark en verschillende opslagsystemen zoals Amazon S3, Google Cloud Storage, HDFS en MinIO. 

Dit is een handleiding voor het implementeren van Alluxio als cachelaag voor Trino met behulp van de Iceberg-connector.

Waarom hebben we caching nodig voor 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 beschikt over een ingebouwde caching-engine, Rubix, in zijn Hive-connector. Hoewel dit systeem handig is omdat het met Trino wordt meegeleverd, is het beperkt tot de Hive-connector en is het niet onderhouden sinds 2020. Het mist ook beveiligingsfuncties en ondersteuning voor extra berekeningsmotoren.

Trino op Alluxio

Alluxio verbindt Trino met verschillende opslagsystemen, biedt API’s en een geïntegreerde naamruimte voor data-driven applicaties. Alluxio stelt Trino in staat om gegevens te benaderen ongeacht de gegevensbron en cacheert transparant vaak gebruikte gegevens (bijvoorbeeld veelgebruikte tabellen) in Alluxio’s gedistribueerde opslag.

Het gebruik van Alluxio Caching via de Iceberg-connector over MinIO-bestandsopslag

We hebben een demo gemaakt die laat zien hoe u Alluxio kunt configureren om write-through caching met MinIO te gebruiken. Dit wordt bereikt door de Iceberg-connector te gebruiken en één wijziging aan te brengen in de locatie-eigenschap van de tabel vanuit het perspectief van Trino.

In deze demo wordt Alluxio uitgevoerd op afzonderlijke servers; echter, het wordt aanbevolen om het op dezelfde knooppunten als Trino te draaien. Dit betekent dat alle configuraties voor Alluxio zich op de servers bevinden waar Alluxio draait, terwijl de configuratie van Trino onaangetast blijft. Het voordeel van het extern draaien van Alluxio is dat het niet om middelen zal concurreren met Trino, maar het nadeel is dat gegevens over het netwerk moeten worden overgedragen bij het lezen uit Alluxio. Het is cruciaal voor prestaties dat Trino en Alluxio zich op hetzelfde netwerk bevinden.

Om deze demo te volgen, kopieer de code die zich hier bevindt.

Trino Configuration

Trino is identiek geconfigureerd aan een standaard Iceberg configuratie. Aangezien Alluxio extern draait ten opzichte van Trino, is de enige configuratie nodig tijdens het uitvoeren van query’s en niet bij opstarten.

Alluxio Configuration

De configuratie voor Alluxio kan allemaal worden ingesteld met behulp van het alluxio-site.properties bestand. Om alle configuraties te houden die samen zijn geplaatst op het docker-compose.yml, stellen we ze in met Java-eigenschappen via de ALLUXIO_JAVA_OPTS omgevingsvariabele. Deze tutorial verwijst ook naar de master-node als de leider en de werknemers als volgers.

Master Configuraties

 
alluxio.master.mount.table.root.ufs=s3://alluxio/

De leider exposeert poorten 19998 en 19999, waarvan de laatste de poort is voor de web-UI.

Worker Configuraties

 

alluxio.worker.ramdisk.size=1G
alluxio.worker.hostname=alluxio-follower

De volger exposeert poorten 29999 en 30000, en stelt een gedeelde geheugen in dat door Alluxio wordt gebruikt om gegevens op te slaan. Dit is ingesteld op 1G via de shm_size eigenschap en wordt geraadpleegd vanuit de alluxio.worker.ramdisk.size eigenschap.

Gedeelde Configuraties Tussen Leider en Volger

 

alluxio.master.hostname=alluxio-leader

# Minio configs
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

# Demo-only configs
alluxio.security.authorization.permission.enabled=false

De alluxio.master.hostname moet op alle knooppunten, leiders en volgers aanwezig zijn. Het overgrote deel van de gedeelde configuraties wijst Alluxio naar de underfs, in dit geval MinIO.

alluxio.security.authorization.permission.enabled is ingesteld op “false” om de Docker-setup eenvoudig te houden.

Opmerking: Dit wordt niet aanbevolen in een productie- of CI/CD-omgeving.

Diensten uitvoeren

Eerst wil je de diensten starten. Zorg ervoor dat je in de trino-getting-started/iceberg/trino-alluxio-iceberg-minio directory bent. Voer nu de volgende opdracht uit:

 
docker-compose up -d

Je kunt verwachten dat het volgende resultaat verschijnt. Docker moet mogelijk de Docker-afbeeldingen downloaden voordat je de “Created/Started” berichten ziet, dus er kan extra output zijn:

 

[+] 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

Trino CLI openen

Zodra dit is voltooid, kun je inloggen op het Trino-coordinator-knooppunt. We zullen dit doen door de exec opdracht te gebruiken en de trino CLI-uitvoerbare bestand als de opdracht die we op dat container uitvoeren. Let op dat de container-id trino-alluxio-iceberg-minio-trino-coordinator-1 is, dus de opdracht die je zult uitvoeren is:

 

<<<<<<< HEAD
docker container exec -it trino-alluxio-iceberg-minio-trino-coordinator-1 trino
=======
docker container exec -it trino-minio_trino-coordinator_1 trino
>>>>>>> alluxio

Wanneer je deze stap start, zou je na voltooiing van de opstart de trino cursor moeten zien. Het zou er zo uitzien wanneer het klaar is:

 
trino>

Om het beste te begrijpen hoe deze configuratie werkt, laten we een Iceberg-tabel maken met behulp van een CTAS (CREATE TABLE AS) query die gegevens uit een van de TPC-connectors naar Iceberg stuurt, die naar MinIO verwijst. De TPC-connectors genereren gegevens op het moment, zodat we eenvoudige tests zoals deze kunnen uitvoeren.

Eerst voer je een opdracht uit om de catalogi weer te geven om de tpch en iceberg catalogi te zien, aangezien dit is wat we in de CTAS-query zullen gebruiken:

 
SHOW CATALOGS;

Je zou moeten zien dat de Iceberg-catalogus geregistreerd is.

MinIO Buckets en Trino Schemas

Bij opstart wordt de volgende opdracht uitgevoerd op een initialisatiecontainer die de mc CLI voor MinIO bevat. Dit creëert een bucket in MinIO genaamd /alluxio, wat ons een locatie biedt om onze gegevens naar te schrijven en we kunnen Trino vertellen waar het te vinden is:

 

/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;
"

Opmerking: Deze bucket zal fungeren als de aankoppelpunt voor Alluxio, dus de schema directory alluxio://lakehouse/ in Alluxio zal afgebeeld worden op s3://alluxio/lakehouse/.

Query’s uitvoeren in Trino

Laten we nu ons SCHEMA maken dat naar de bucket in MinIO verwijst en vervolgens onze CTAS-query uitvoert. Ga terug naar de terminal en maak het iceberg.lakehouse SCHEMA aan. Dit is de eerste oproep naar de metastore om de locatie van het schemalocatie in de Alluxio-naamruimte op te slaan. Let op, we moeten het hostnaam alluxio-leader en poort 19998 opgeven, omdat we Alluxio niet als standaard bestandssysteem hebben ingesteld. Neem dit mee in overweging als je Alluxio-caching als standaardgebruik wilt hebben en transparant voor gebruikers die DDL-instructies beheren:

 

CREATE SCHEMA iceberg.lakehouse
WITH (location = 'alluxio://alluxio-leader:19998/lakehouse/');

Nu we een SCHEMA hebben dat verwijst naar de bucket waar we onze tabellen in Alluxio opslaan, die synchroon is met MinIO, kunnen we onze eerste tabel aanmaken.

Optioneel: Om uw queries uit te voeren, log in op de Trino UI en log in met een willekeurige gebruikersnaam (het maakt niet uit omdat er geen beveiliging is ingesteld).

Verplaats de klantgegevens uit de kleine gegenereerde TPCH-gegevens naar MinIO met behulp van een CTAS-query. Voer de volgende query uit en kijk indien gewenst naar de voortgang op de Trino UI:

 

CREATE TABLE iceberg.lakehouse.customer
WITH (
  format = 'ORC',
  location = 'alluxio://alluxio-leader:19998/lakehouse/customer/'
) 
AS SELECT * FROM tpch.tiny.customer;

Ga naar de Alluxio UI en de MinIO UI en blader door de Alluxio en MinIO-bestanden. Je zult nu een lakehouse directory zien die een customer directory bevat met de door Trino naar Alluxio geschreven gegevens en Alluxio die het naar MinIO schrijft.

Nu bevindt zich een tabel onder Alluxio en MinIO, u kunt deze gegevens opvragen door het volgende te controleren:

 
SELECT * FROM iceberg.lakehouse.customer LIMIT 10;

Hoe weten we zeker dat Trino daadwerkelijk uit Alluxio leest en niet uit MinIO? Laten we de gegevens in MinIO verwijderen en de query opnieuw uitvoeren om zeker te zijn. Zodra u deze gegevens verwijdert, zou u nog steeds gegevens moeten zien terugkomen.

Services stoppen

Zodra u deze tutorial hebt voltooid, kunnen de resources die voor deze oefening zijn gebruikt, worden vrijgegeven door de volgende opdracht uit te voeren:

 
docker-compose down

Conclusie

Op dit moment zou u een beter begrip moeten hebben van Trino en Alluxio, hoe te beginnen met het implementeren van Trino en Alluxio, en hoe te om Alluxio caching te gebruiken met een Iceberg connector en MinIO bestand opslag. Ik hoop dat je van dit artikel genoten hebt. Zorg ervoor om dit artikel te liken en te reageren als u vragen heeft!

Source:
https://dzone.com/articles/get-started-with-trino-and-alluxio-in-five-minutes