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 et l’IA à grande échelle. Alluxio se situe entre des 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 à l’aide du connecteur Iceberg.
Pourquoi avons-nous besoin de la mise en cache pour Trino ?
Une petite fraction des pétaoctets de données que vous stockez génère de la valeur commerciale à tout moment. L’analyse répétée des mêmes données et leur transfert sur le réseau consomment du temps, des cycles de calcul et des ressources. Ce problème est aggravé lors de l’extraction de données à partir de clusters Trino disparates dans des régions ou des clouds. Dans ces circonstances, les solutions de mise en cache peuvent réduire considérablement la latence et le coût de vos requêtes.
Trino a un moteur de mise en cache intégré, Rubix, dans son connecteur Hive. Bien que ce système soit pratique car 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 de moteurs de calcul supplémentaires.
Trino sur Alluxio
Alluxio connecte Trino à divers systèmes de stockage, fournissant des API et un espace de noms unifié pour les applications basées sur les données. Alluxio permet à Trino d’accéder aux données quelle que soit la source de données et de mettre en cache de manière transparente les données fréquemment consulté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. Ceci est réalisé en utilisant le connecteur Iceberg et en apportant une seule modification à la propriété d’emplacement sur la table du point de vue Trino.
Dans cette démo, Alluxio est exécuté sur des serveurs distincts ; cependant, il est recommandé de l’exécuter sur les mêmes nœuds que Trino. Cela signifie que toutes les configurations d’Alluxio seront situées sur les serveurs sur lesquels Alluxio s’exécute, tandis que la configuration de Trino reste inchangée. L’avantage d’exécuter Alluxio en externe est qu’il ne concurrencera pas 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émo, copiez le code situé ici.
Configuration trino
Trino est configuré de manière identique à une configuration Iceberg standard. Étant donné qu’Alluxio s’exécute en dehors de Trino, la seule configuration nécessaire est au moment de la requête et non au démarrage.
Configuration Alluxio
La configuration d’Alluxio peut être définie à l’aide du alluxio-site.properties
déposer. Pour conserver toutes les configurations colocalisées sur le docker-compose.yml
nous les configurons à l’aide des propriétés Java via le ALLUXIO_JAVA_OPTS
variables d’environnement. Ce didacticiel fait également référence au nœud maître en tant que leader et aux travailleurs en tant que suiveurs.
Configurations principales
alluxio.master.mount.table.root.ufs=s3://alluxio/
Le leader expose les ports 19998
et 19999
ce dernier étant le port de l’interface utilisateur Web.
Configurations de travail
alluxio.worker.ramdisk.size=1G
alluxio.worker.hostname=alluxio-follower
Le suiveur expose les ports 29999
et 30000
, et met en place une mémoire partagée utilisée par Alluxio pour stocker les données. Ceci est réglé sur 1G
via le shm_size
propriété et est référencé à partir de la alluxio.worker.ramdisk.size
propriété.
Configurations partagées entre le leader et le suiveur
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
Le alluxio.master.hostname
doit être sur tous les nœuds, leaders et suiveurs. La majorité des configs partagées pointent Alluxio vers le underfs
qui est MinIO dans ce cas.
alluxio.security.authorization.permission.enabled
est défini sur « false » pour simplifier la configuration de Docker.
Note: Il n’est pas recommandé de le faire dans un environnement de production ou CI/CD.
Les services en cours d’exécution
Tout d’abord, vous souhaitez démarrer les services. Assurez-vous que vous êtes dans le trino-getting-started/iceberg/trino-alluxio-iceberg-minio
annuaire. Maintenant, exécutez la commande suivante :
Vous devez vous attendre à 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 la CLI de Trino
Une fois cette opération terminée, vous pouvez vous connecter au nœud du coordinateur Trino. Nous le ferons en utilisant le exec
commande et exécutez le trino
Exécutable CLI en tant que commande que nous exécutons sur ce conteneur. Notez que l’identifiant 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 commencez cette étape, vous devriez voir le trino
curseur une fois le démarrage terminé. Cela devrait ressembler à ceci quand c’est fait:
Pour mieux comprendre le fonctionnement de cette configuration, créons une table Iceberg à l’aide d’une requête CTAS (CREATE TABLE AS) qui pousse les données de l’un des connecteurs TPC vers Iceberg qui pointe vers MinIO. Les connecteurs TPC génèrent des données à la volée afin que nous puissions exécuter des tests simples comme celui-ci.
Tout d’abord, exécutez une commande pour afficher les catalogues afin de voir les tpch
et iceberg
catalogues puisque c’est ce que nous utiliserons dans la requête CTAS :
Vous devriez voir que le catalogue Iceberg est enregistré.
Compartiments MinIO et schémas Trino
Au démarrage, la commande suivante est exécutée sur un conteneur d’initialisation qui inclut le mc
CLI pour MinIO. Cela crée un compartiment dans MinIO appelé /alluxio
ce qui nous donne un emplacement où écrire nos données et nous pouvons indiquer à 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;
"
Note: Ce bucket servira de point de montage pour Alluxio, de sorte que le répertoire de schéma alluxio://lakehouse/
dans Alluxio mappera sur s3://alluxio/lakehouse/
.
Interroger Trino
Passons à la création de notre SCHEMA
qui nous pointe vers le compartiment dans MinIO, puis exécutez notre requête CTAS. De retour dans le terminal, créez le iceberg.lakehouse
SCHEMA
. Ce sera le premier appel au métastore pour enregistrer l’emplacement de l’emplacement du schéma dans l’espace de noms Alluxio. Remarquez, nous devrons spécifier le nom d’hôte alluxio-leader
et port 19998
car nous n’avons pas défini Alluxio comme système de fichiers par défaut. Tenez-en compte si vous souhaitez que la mise en cache d’Alluxio soit l’utilisation par défaut et transparente pour les utilisateurs qui gèrent les instructions DDL :
CREATE SCHEMA iceberg.lakehouse
WITH (location = 'alluxio://alluxio-leader:19998/lakehouse/');
Maintenant que nous avons un SCHEMA
qui référence le bucket où nous stockons nos tables dans Alluxio, qui se synchronise avec MinIO, nous pouvons créer notre première table.
Facultatif: Pour voir vos requêtes exécutées, connectez-vous à l’interface utilisateur de Trino et connectez-vous en utilisant n’importe quel nom d’utilisateur (cela n’a pas d’importance car aucune sécurité n’est configurée).
Déplacez les données client des minuscules données TPCH générées 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 de Trino :
CREATE TABLE...