MinIO se utiliza con frecuencia para almacenar datos desde cargas de trabajo de AI/ML, Datalakes hasta casas de lago, ya sea Dremio, Hive, Hudi, StarRocks o cualquiera de la otra docena de excelentes soluciones de herramientas de AI/ML. MinIO es más eficiente cuando se utiliza como capa de almacenamiento principal, lo que reduce el costo total de propiedad de los datos almacenados, además obtiene los beneficios adicionales de escribir datos en MinIO, es decir,
En este tutorial, implementaremos un sistema cohesivo que permite consultas SQL distribuidas en grandes conjuntos de datos almacenados en Minio, con Trino aprovechando los metadatos de Hive Metastore y los esquemas de tablas de Redis.
Estos son los diferentes componentes y lo que hacen en nuestro proceso de configuración que veremos a continuación.
Antes de comenzar, asegúrese de tener instaladas las herramientas necesarias para administrar su clúster de Kubernetes:
Para acceder a los recursos necesarios para implementar Trino en Kubernetes, clone el repositorio de GitHub específico y navegue hasta el directorio apropiado:
git clone https://github.com/minio/blog-assets.git cd blog-assets/trino-on-kubernetes
Los espacios de nombres en Kubernetes proporcionan entornos aislados para aplicaciones. Cree un nuevo espacio de nombres para que Trino encapsule su implementación:
kubectl create namespace trino --dry-run=client -o yaml | kubectl apply -f -
Redis almacenará los esquemas de tablas utilizados por Trino. Proteja estos esquemas con un secreto de Kubernetes. El siguiente comando crea un secreto genérico y obtiene datos de un archivo JSON:
kubectl create secret generic redis-table-definition --from-file=redis/test.json -n trino || true
Los repositorios de Helm proporcionan gráficos preempaquetados que simplifican la implementación de aplicaciones. Agrega los repositorios Bitnami y Trino a tu configuración de Helm:
helm repo add bitnami https://charts.bitnami.com/bitnami || true helm repo add trino https://trinodb.github.io/charts/ || true
Prepare MinIO dentro del espacio de nombres Trino.
kubectl minio init -n trino
Configure una arquitectura multiinquilino para el almacenamiento de datos. El siguiente ejemplo crea un inquilino denominado "inquilino-1" con cuatro servidores, cuatro volúmenes de almacenamiento y una capacidad de 4 GiB:
kubectl minio tenant create tenant-1 --servers 4 --volumes 4 --capacity 4Gi -n trino
Trino utiliza Hive Metastore para almacenar metadatos de tablas. Implemente PostgreSQL para administrar los metadatos y luego configure Hive Metastore:
helm upgrade --install hive-metastore-postgresql bitnami/postgresql -n trino -f hive-metastore-postgresql/values.yaml
Utilice un gráfico Helm preconfigurado para implementar Hive Metastore dentro del espacio de nombres Trino:
helm upgrade --install my-hive-metastore -n trino -f hive-metastore/values.yaml ./charts/hive-metastore
Trino y MinIO crean una poderosa combinación para consultas SQL distribuidas en grandes conjuntos de datos. Siga estos pasos para implementar y configurar el sistema.
Redis es un almacén de datos en memoria de alta velocidad que se utiliza para contener esquemas de tablas Trino para mejorar el rendimiento de las consultas. Implementarlo en el espacio de nombres de Trino usando un gráfico de Helm:
helm upgrade --install my-redis bitnami/redis -n trino -f redis/values.yaml
Implemente Trino como motor de consultas SQL distribuido que se conectará a MinIO y otras fuentes de datos:
helm upgrade --install my-trino trino/trino --version 0.7.0 --namespace trino -f trino/values.yaml
Confirme que todos los componentes se estén ejecutando correctamente enumerando los pods en el espacio de nombres de Trino:
kubectl get pods -n trino
Revisión y ajustes de seguridad
Revise y ajuste la configuración de seguridad según sea necesario. Para deshabilitar la validación de certificados SSL para conexiones S3, actualice la sección adicionalCatalogs del archivo value.yaml con la siguiente propiedad:
hive.s3.ssl.enabled=false
Reenvío de puertos al servicio MinIO del inquilino, lo que permite el acceso local:
kubectl port-forward svc/minio -n trino 9443:443
1. Cree un alias: establezca un alias para el inquilino utilizando las credenciales de la implementación de MinIO:
mc alias set my-minio https://localhost:9443/ minio_access_key minio_secret_key --insecure
2. Crear depósito: crea un nuevo depósito que Trino usará.
mc mb my-minio/tiny --insecure
1. Obtener el nombre del pod: recupere el nombre del pod coordinador de Trino:
export POD_NAME=$(kubectl get pods --namespace trino -l "app=trino,release=my-trino,component=coordinator" -o jsonpath="{.items[0].metadata.name}")
2. Reenvío de puerto: reenvíe el puerto local 8080 al módulo coordinador:
kubectl port-forward $POD_NAME 8080:8080
3. Acceda a la interfaz de usuario: utilice la interfaz de usuario de Trino en su navegador visitando http://127.0.0.1:8080.
Acceda al pod del coordinador de Trino y comience a realizar consultas a través de la línea de comando:
kubectl exec -it deploy/my-trino-coordinator -n trino -- trino
SHOW CATALOGS;
SHOW SCHEMAS IN minio;
Schema -------------------- default information_schema
CREATE SCHEMA minio.tiny WITH (location = 's3a://tiny/');
CREATE TABLE minio.tiny.customer WITH ( format = 'ORC', external_location = 's3a://tiny/customer/' ) AS SELECT * FROM tpch.tiny.customer;
SELECT * FROM minio.tiny.customer LIMIT 50;
SHOW SCHEMAS IN minio;
Schema -------------------- default information_schema tiny (3 rows)
Después de crear el depósito, confirme que los datos estén almacenados en MinIO enumerando el contenido con la herramienta de línea de comandos mc. Utilice el siguiente comando:
mc ls my-minio/tiny --insecure
¡Es tan simple como eso!
Al solucionar problemas de configuración, especialmente aquellos relacionados con la seguridad, revise minuciosamente los archivos value.yaml de cada componente para garantizar la configuración adecuada.
Trino destaca por su capacidad para optimizar consultas en varias capas de datos, ya sean bases de datos especializadas o almacenamiento de objetos. Su objetivo es minimizar la transferencia de datos presionando consultas para recuperar solo los datos esenciales requeridos. Esto permite a Trino unir conjuntos de datos de diferentes fuentes, realizar procesamientos adicionales o devolver resultados precisos de manera eficiente.
MinIO combina excepcionalmente bien con Trino debido a su escalabilidad y rendimiento líderes en la industria. Con la capacidad de manejar cargas de trabajo importantes en IA/ML y análisis, MinIO admite sin esfuerzo consultas de Trino y más. En pruebas comparativas recientes, MinIO logró unos impresionantes 325 GiB/s (349 GB/s) para operaciones GET y 165 GiB/s (177 GB/s) para operaciones PUT en solo 32 nodos. Este notable rendimiento garantiza que los datos almacenados en MinIO sigan siendo fácilmente accesibles, lo que convierte a MinIO en una opción confiable y de alto rendimiento para Trino sin convertirse en un cuello de botella.
Si tiene alguna pregunta sobre MinIO y Trino, asegúrese de comunicarse con nosotros en