Empezar con Trino y Alluxio en cinco minutos

Trino es un motor de consultas SQL distribuido de código abierto diseñado para consultar grandes conjuntos de datos distribuidos sobre uno o más orígenes de datos heterogéneos. Trino fue diseñado para manejar el almacenamiento de datos, ETL y análisis interactivos por grandes cantidades de datos y produciendo informes. 

Alluxio es una plataforma de orquestación de datos de código abierto para análisis a gran escala y AI. Alluxio se encuentra entre los frameworks de cómputo como Trino y Apache Spark y diversos sistemas de almacenamiento como Amazon S3, Google Cloud Storage, HDFS y MinIO. 

Este es un tutorial para implementar Alluxio como capa de caché para Trino utilizando el conector Iceberg.

¿Por qué necesitamos caché para 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 cuenta con un motor de caché incorporado, Rubix, en su conector Hive. Si bien este sistema es conveniente ya que viene con Trino, está limitado al conector Hive y no ha sido mantenido desde 2020. También carece de características de seguridad y soporte para más motores de cómputo.

Trino con Alluxio

Alluxio conecta a Trino con varios sistemas de almacenamiento, proporcionando APIs y un espacio de nombres unificado para aplicaciones dirigidas por datos. Alluxio permite que Trino acceda a los datos independientemente del origen de los datos y almacene de forma transparente en caché los datos accedidos con frecuencia (por ejemplo, tablas comúnmente utilizadas) en el almacenamiento distribuido de Alluxio.

Uso de la caché de Alluxio a través del conector Iceberg sobre el almacenamiento de archivos MinIO

Hemos creado una demostración que muestra cómo configurar Alluxio para usar la caché de escritura a través con MinIO. Esto se logra utilizando el conector Iceberg y haciendo un solo cambio en la propiedad de ubicación de la tabla desde la perspectiva de Trino.

En esta demostración, Alluxio se ejecuta en servidores separados; sin embargo, se recomienda ejecutarlo en los mismos nodos que Trino. Esto significa que todas las configuraciones para Alluxio estarán ubicadas en los servidores donde Alluxio se ejecuta, mientras que la configuración de Trino permanece inalterada. La ventaja de ejecutar Alluxio externamente es que no competirá por recursos con Trino, pero la desventaja es que los datos deberán transferirse a través de la red al leer desde Alluxio. Es crucial para el rendimiento que Trino y Alluxio estén en la misma red.

Para seguir esta demostración, copie el código ubicado aquí.

Configuración de Trino

Trino está configurado de manera idéntica a una configuración estándar de Iceberg. Dado que Alluxio se está ejecutando externamente a Trino, la única configuración necesaria es en el momento de la consulta y no al inicio.

Configuración de Alluxio

La configuración de Alluxio se puede establecer utilizando el archivo alluxio-site.properties. Para mantener todas las configuraciones en el archivo docker-compose.yml, las estamos configurando mediante propiedades de Java a través de la variable de entorno ALLUXIO_JAVA_OPTS. Este tutorial también se refiere al nodo maestro como líder y a los trabajadores como seguidores.

Configuraciones del Maestro

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

El líder expone puertos 19998 y 19999, siendo este último el puerto para la interfaz web.

Configuraciones del Trabajador

 

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

El seguidor expone puertos 29999 y 30000, y configura una memoria compartida utilizada por Alluxio para almacenar datos. Esto se establece en 1G a través de la propiedad shm_size y se referencia desde la propiedad alluxio.worker.ramdisk.size.

Configuraciones Compartidas Entre Líder y Seguidor

 

alluxio.master.hostname=alluxio-leader

# Configuraciones de 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

# Configuraciones solo para demostración
alluxio.security.authorization.permission.enabled=false

El alluxio.master.hostname debe estar presente en todos los nodos, tanto líderes como seguidores. La mayoría de las configuraciones compartidas apuntan a Alluxio hacia el underfs, que en este caso es MinIO.

Se establece alluxio.security.authorization.permission.enabled en “false” para mantener la configuración de Docker simple.

Nota: No se recomienda hacer esto en un entorno de producción o CI/CD.

Ejecutando Servicios

Primero, debes iniciar los servicios. Asegúrate de estar en el directorio trino-getting-started/iceberg/trino-alluxio-iceberg-minio. Ahora, ejecuta el siguiente comando:

 
docker-compose up -d

Debes esperar ver la siguiente salida. Docker también puede tener que descargar las imágenes de Docker antes de que veas los mensajes “Creado/Iniciado”, por lo que podría haber salida adicional:

 

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

Abrir CLI de Trino

Una vez completado esto, puedes iniciar sesión en el nodo coordinador de Trino. Haremos esto utilizando el comando exec y ejecutaremos el ejecutable trino CLI como el comando que ejecutamos en ese contenedor. Observa que el id del contenedor es trino-alluxio-iceberg-minio-trino-coordinator-1, por lo que el comando que ejecutarás es:

 

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

Cuando inicies este paso, deberías ver el cursor trino una vez que la inicialización esté completa. Debería verse así cuando haya terminado:

 
trino>

Para comprender mejor cómo funciona esta configuración, creemos una tabla Iceberg utilizando una consulta CTAS (CREATE TABLE AS) que empuje datos desde uno de los conectores TPC a Iceberg que apunta a MinIO. Los conectores TPC generan datos sobre la marcha, por lo que podemos realizar pruebas simples como esta.

Primero, ejecuta un comando para mostrar los catálogos y ver los catálogos tpch e iceberg ya que estos son los que utilizaremos en la consulta CTAS:

 
SHOW CATALOGS;

Deberías ver que el catálogo Iceberg está registrado.

MinIO Buckets y Esquemas Trino

Al iniciarse, se ejecuta el siguiente comando en un contenedor de inicialización que incluye el CLI mc para MinIO. Esto crea un bucket en MinIO llamado /alluxio, lo que nos da un lugar para escribir nuestros datos y podemos indicar a Trino dónde encontrarlo:

 

/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: Este bucket actuará como punto de montaje para Alluxio, por lo que el directorio de esquema alluxio://lakehouse/ en Alluxio se mapeará a s3://alluxio/lakehouse/.

Consultando Trino

Pasemos a crear nuestro SCHEMA que nos indica el bucket en MinIO y luego ejecute nuestra consulta CTAS. De vuelta en la terminal, cree el SCHEMA iceberg.lakehouse. Esta será la primera llamada al metadatastore para guardar la ubicación de la ubicación del esquema en el espacio de nombres de Alluxio. Tenga en cuenta que necesitaremos especificar el nombre de host alluxio-leader y el puerto 19998 ya que no configuramos a Alluxio como sistema de archivos predeterminado. Tenga esto en cuenta si desea que el uso de caché de Alluxio sea el predeterminado y sea transparente para los usuarios que gestionan declaraciones DDL:

 

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

Ahora que tenemos un SCHEMA que hace referencia al bucket donde almacenamos nuestras tablas en Alluxio, que sincroniza con MinIO, podemos crear nuestra primera tabla.

Opcional: Para ver las consultas ejecutarse, inicie sesión en el Interfaz de Trino y inicie sesión con cualquier nombre de usuario (no importa ya que no se establece seguridad).

Mueva los datos de los clientes de los pequeños datos generados TPCH a MinIO utilizando una consulta CTAS. Ejecute la siguiente consulta y, si lo desea, mírala ejecutándose en la interfaz de Trino:

 

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

Diríjase a la Interfaz de Alluxio y la Interfaz de MinIO, y navegue por los archivos de Alluxio y MinIO. Ahora verá un directorio lakehouse que contiene un directorio customer que contiene los datos escritos por Trino a Alluxio y Alluxio escribiéndolos a MinIO.

Ahora, hay una tabla bajo Alluxio y MinIO, puedes consultar estos datos revisando lo siguiente:

 
SELECT * FROM iceberg.lakehouse.customer LIMIT 10;

¿Cómo estamos seguros de que Trino está leyendo desde Alluxio y no desde MinIO? Vamos a borrar los datos en MinIO y ejecutar la consulta nuevamente solo para asegurarnos. Una vez que borres estos datos, aún deberías ver datos devueltos.

Deteniendo Servicios

Una vez que completes este tutorial, los recursos utilizados para esta práctica pueden ser liberados ejecutando el siguiente comando:

 
docker-compose down

Conclusión

En este punto, deberías tener una mejor comprensión de Trino y Alluxio, cómo comenzar con la implementación de Trino y Alluxio, y cómo utilizar la caché de Alluxio con un conector de Iceberg y almacenamiento de archivos MinIO. Espero que hayas disfrutado de este artículo. ¡No olvides darle me gusta a este artículo y comentar si tienes alguna pregunta!

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