Trino est un moteur de requête SQL distribué open source conçu pour interroger de grands ensembles de données répartis sur une ou plusieurs sources de données hétérogènes. Trino a été conçu pour gérer l’entreposage de données, l’ETL et l’analyse interactive par de grandes quantités de données et produire des rapports.
Alluxio est une plateforme d’orchestration de données open source pour l’analyse à grande échelle et l’IA. Alluxio se situe entre les frameworks de calcul tels que Trino et Apache Spark et divers systèmes de stockage comme Amazon S3, Google Cloud Storage, HDFS et MinIO.
Ceci est un tutoriel pour déployer Alluxio en tant que couche de mise en cache pour Trino en utilisant le connecteur Iceberg.
Pourquoi avons-nous besoin de la mise en cache pour 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 dispose d’un moteur de mise en cache intégré, Rubix, dans son connecteur Hive. Bien que ce système soit pratique puisqu’il est fourni avec Trino, il est limité au connecteur Hive et n’a pas été maintenu depuis 2020. Il manque également de fonctionnalités de sécurité et de prise en charge pour d’autres moteurs de calcul.
Trino sur Alluxio
Alluxio connecte Trino à divers systèmes de stockage, fournissant des API et un espace de nommage unifié pour les applications axées sur les données. Alluxio permet à Trino d’accéder aux données quel que soit la source des données et de mettre en cache de manière transparente les données fréquemment accédées (par exemple, les tables couramment utilisées) dans le stockage distribué Alluxio.
Utilisation de la mise en cache Alluxio via le connecteur Iceberg sur le stockage de fichiers MinIO
Nous avons créé une démo qui montre comment configurer Alluxio pour utiliser la mise en cache en écriture avec MinIO. Cela est réalisé en utilisant le connecteur Iceberg et en apportant un seul changement à la propriété de localisation sur la table du point de vue de Trino.
Dans cette démonstration, Alluxio est exécuté sur des serveurs séparés ; cependant, il est recommandé de l’exécuter sur les mêmes nœuds que Trino. Cela signifie que toutes les configurations pour Alluxio seront situées sur les serveurs où Alluxio s’exécute, tandis que la configuration de Trino reste inchangée. L’avantage d’exécuter Alluxio en externe est qu’il n’entrera pas en concurrence pour les ressources avec Trino, mais l’inconvénient est que les données devront être transférées sur le réseau lors de la lecture à partir d’Alluxio. Il est crucial pour les performances que Trino et Alluxio soient sur le même réseau.
Pour suivre cette démonstration, copiez le code situé ici.
Configuration de Trino
Trino est configuré de manière identique à une configuration Iceberg standard. Puisque Alluxio est exécuté en externe par rapport à Trino, la seule configuration nécessaire se fait au moment de l’interrogation et non au démarrage.
Configuration d’Alluxio
La configuration d’Alluxio peut être entièrement définie à l’aide du fichier alluxio-site.properties
. Pour garder toutes les configurations colocalisées sur le fichier docker-compose.yml
, nous les définissons en utilisant les propriétés Java via la variable d’environnement ALLUXIO_JAVA_OPTS
. Ce tutoriel fait également référence au nœud maître en tant que leader et aux workers en tant que followers.
Configurations du Master
alluxio.master.mount.table.root.ufs=s3://alluxio/
Le leader expose les ports 19998
et 19999
, ce dernier étant le port pour l’interface utilisateur web.
Configurations du Worker
alluxio.worker.ramdisk.size=1G
alluxio.worker.hostname=alluxio-follower
Le follower expose les ports 29999
et 30000
, et configure une mémoire partagée utilisée par Alluxio pour stocker les données. Celle-ci est définie à 1G
via la propriété shm_size
et est référencée à partir de la propriété alluxio.worker.ramdisk.size
.
Configurations partagées entre le Leader et le Follower
alluxio.master.hostname=alluxio-leader
# Configs 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
# Configs de démonstration uniquement
alluxio.security.authorization.permission.enabled=false
Le alluxio.master.hostname
doit être présent sur tous les nœuds, leaders et followers. La majorité des configurations partagées pointe Alluxio vers le underfs
, qui est MinIO dans ce cas.
Remarque : Il n’est pas recommandé de le faire dans un environnement de production ou CI/CD.
Services en cours d’exécution
Tout d’abord, vous voulez démarrer les services. Assurez-vous que vous êtes dans le répertoire trino-getting-started/iceberg/trino-alluxio-iceberg-minio
. Maintenant, exécutez la commande suivante :
docker-compose up -d
Vous devriez voir la sortie suivante. Docker devra peut-être également télécharger les images Docker avant que vous ne voyiez les messages « Created/Started », il pourrait donc y avoir une sortie supplémentaire :
[+] 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
Ouvrir l’interface de ligne de commande Trino
Une fois que c’est terminé, vous pouvez vous connecter au nœud de coordination Trino. Nous allons faire cela en utilisant la commande exec
et exécuter l’exécutable trino
CLI en tant que commande que nous exécutons sur ce conteneur. Notez que l’ID du conteneur est trino-alluxio-iceberg-minio-trino-coordinator-1
, donc la commande que vous exécuterez est :
<<<<<<< HEAD
docker container exec -it trino-alluxio-iceberg-minio-trino-coordinator-1 trino
=======
docker container exec -it trino-minio_trino-coordinator_1 trino
>>>>>>> alluxio
Lorsque vous démarrez cette étape, vous devriez voir le curseur trino
une fois le démarrage terminé. Cela devrait ressembler à ceci lorsque c’est fait :
trino>
Pour bien comprendre comment cette configuration fonctionne, créons une table Iceberg à l’aide d’une requête CTAS (CREATE TABLE AS) qui pousse les données d’un des connecteurs TPC dans Iceberg pointant vers MinIO. Les connecteurs TPC génèrent des données à la volée, nous pouvons donc exécuter des tests simples comme celui-ci.
Tout d’abord, exécutez une commande pour afficher les catalogues afin de voir les catalogues tpch
et iceberg
puisque nous les utiliserons dans la requête CTAS :
SHOW CATALOGS;
Vous devriez voir que le catalogue Iceberg est enregistré.
Buckets MinIO et schémas Trino
Au démarrage, la commande suivante est exécutée sur un conteneur d’initialisation qui comprend l’interface de ligne de commande mc
pour MinIO. Cela crée un bucket dans MinIO appelé /alluxio
, ce qui nous donne un emplacement pour écrire nos données et nous pouvons dire à Trino où les trouver :
/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;
"
Remarque : Ce bucket servira de point de montage pour Alluxio, donc le répertoire de schéma alluxio://lakehouse/
dans Alluxio se mappera sur s3://alluxio/lakehouse/
.
Interrogation de Trino
Permettons de créer notre SCHEMA
qui pointe vers le bucket dans MinIO, puis exécutons notre requête CTAS. Retour dans le terminal, créez le SCHEMA
iceberg.lakehouse
. Ce sera le premier appel au metastore pour enregistrer l’emplacement du schéma dans l’espace de noms Alluxio. Notez que nous devrons spécifier le nom d’hôte alluxio-leader
et le port 19998
puisque nous n’avons pas défini Alluxio comme système de fichiers par défaut. Prenez cela en considération si vous souhaitez que la mise en cache Alluxio soit l’utilisation par défaut et transparente pour les utilisateurs gérant les instructions DDL :
CREATE SCHEMA iceberg.lakehouse
WITH (location = 'alluxio://alluxio-leader:19998/lakehouse/');
Maintenant que nous avons un SCHEMA
qui fait référence au bucket où nous stockons nos tables dans Alluxio, qui se synchronise avec MinIO, nous pouvons créer notre première table.
Optionnel : Pour voir vos requêtes exécutées, connectez-vous à l’interface utilisateur Trino et connectez-vous avec n’importe quel nom d’utilisateur (peu importe puisqu’aucune sécurité n’est configurée).
Déplacez les données client des données TPCH générées minuscules vers MinIO à l’aide d’une requête CTAS. Exécutez la requête suivante et, si vous le souhaitez, regardez-la s’exécuter sur l’interface utilisateur Trino :
CREATE TABLE iceberg.lakehouse.customer
WITH (
format = 'ORC',
location = 'alluxio://alluxio-leader:19998/lakehouse/customer/'
)
AS SELECT * FROM tpch.tiny.customer;
Accédez à l’interface utilisateur Alluxio et à l’interface utilisateur MinIO, et parcourez les fichiers Alluxio et MinIO. Vous verrez maintenant un répertoire lakehouse
contenant un répertoire customer
contenant les données écrites par Trino vers Alluxio et Alluxio les écrivant vers MinIO.
Voici le texte traduit en français :
Maintenant, il y a un tableau sous Alluxio et MinIO, vous pouvez interroger ces données en vérifiant ce qui suit :
SELECT * FROM iceberg.lakehouse.customer LIMIT 10;
Comment sommes-nous sûrs que Trino lit réellement à partir d’Alluxio et non de MinIO ? Supprimons les données dans MinIO et exécutons à nouveau la requête, juste pour être sûrs. Une fois ces données supprimées, vous devriez toujours voir des données retournées.
Arrêt des services
Une fois ce tutoriel terminé, les ressources utilisées pour cet exercice peuvent être libérées en exécutant la commande suivante :
docker-compose down
Conclusion
À ce stade, vous devriez avoir une meilleure compréhension de Trino et Alluxio, de la façon de commencer à déployer Trino et Alluxio, et de l’utilisation de la mise en cache Alluxio avec un connecteur Iceberg et le stockage de fichiers MinIO. J’espère que vous avez apprécié cet article. N’hésitez pas à aimer cet article et à commenter si vous avez des questions !
Source:
https://dzone.com/articles/get-started-with-trino-and-alluxio-in-five-minutes