Aller au contenu

Trino

Aperçu

Trino 480 est le moteur de requêtes SQL distribué d'AKKO. Il fournit des requêtes fédérées à travers le lakehouse Iceberg (via Polaris), PostgreSQL, MySQL, Oracle, SQL Server, Snowflake, BigQuery, Databricks, Hive + HDFS (avec Kerberos pour Cloudera CDP 7.1.9), Kafka et plus — 18 connecteurs exposés via un unique endpoint SQL avec gestion dynamique des catalogues : les administrateurs peuvent ajouter, modifier ou supprimer un catalogue depuis la page Catalog Manager Pro du cockpit, sans downtime (aucun rolling restart nécessaire).

Architecture

  Notebooks / Superset / Airflow
              |
     +--------+--------+
     |     Trino        |  coordinateur + worker (noeud unique)
     |  federation.akko.local  |
     +--------+---------+
              |
     +--------+---------+
     |                  |
  Iceberg           PostgreSQL
  (Polaris REST)    (jdbc)

Trino fonctionne en déploiement à noeud unique (coordinateur avec planification activée) sur le port 8080 en interne, exposé via Traefik à federation.akko.local.

Catalogues

AKKO livre trois catalogues intégrés (fournis dans le chart) et permet d'ajouter autant de catalogues clients que souhaité à l'exécution via la page Catalog Manager Pro du cockpit (voir ADR-021 (see docs/adr/ADR-021-catalog-manager-pro.md)).

Catalogues intégrés :

iceberg -- Lakehouse

Se connecte au catalogue REST Apache Polaris pour la gestion des tables Iceberg.

trino/catalog/iceberg.properties
connector.name=iceberg
iceberg.catalog.type=rest
iceberg.rest-catalog.uri=http://polaris:8181/api/catalog
iceberg.rest-catalog.warehouse=akko-warehouse
iceberg.rest-catalog.security=OAUTH2
iceberg.rest-catalog.oauth2.credential=root:${ENV:POLARIS_ROOT_SECRET}
iceberg.rest-catalog.oauth2.scope=PRINCIPAL_ROLE:ALL
iceberg.file-format=PARQUET
fs.native-s3.enabled=true
s3.endpoint=http://minio:9000
s3.path-style-access=true
s3.aws-access-key=${ENV:MINIO_ROOT_USER}
s3.aws-secret-key=${ENV:MINIO_ROOT_PASSWORD}
s3.region=us-east-1

Scope OAuth2

Le iceberg.rest-catalog.oauth2.scope=PRINCIPAL_ROLE:ALL est obligatoire. Sans cela, Polaris rejette le scope par défaut avec une erreur invalid_scope.

postgresql -- Base de données opérationnelle

Se connecte directement à la base de données PostgreSQL d'AKKO.

trino/catalog/postgresql.properties
connector.name=postgresql
connection-url=jdbc:postgresql://postgres:5432/akko
connection-user=akko
connection-password=${ENV:POSTGRES_AKKO_PASSWORD}

system -- Trino interne

Catalogue intégré exposant les informations d'exécution de Trino (noeuds, requêtes, tâches). Disponible pour tous les rôles en lecture seule.

Fédération

La force principale de Trino est la fédération inter-catalogues -- interroger des tables Iceberg et PostgreSQL dans une seule instruction SQL :

-- Joindre les données du lakehouse Iceberg avec les données opérationnelles PostgreSQL
SELECT
    i.customer_id,
    i.total_amount,
    p.email
FROM iceberg.analytics.transactions AS i
JOIN postgresql.public.customers AS p
    ON i.customer_id = p.id;

RBAC : contrôle d'accès basé sur fichiers

Trino utilise un contrôle d'accès basé sur fichiers avec cinq rôles, réactualisé toutes les 5 minutes. Pour le guide RBAC complet (Keycloak, OPA, masquage de colonnes, filtrage par lignes), voir le Guide d'administration RBAC.

Fichiers de configuration

Fichier Fonction
trino/etc/access-control.properties Active le contrôle d'accès basé sur fichiers
trino/etc/rules.json Règles de permissions sur les catalogues, schémas et tables
trino/etc/group-provider.properties Active le fournisseur de groupes basé sur fichiers
trino/etc/group.txt Correspondances utilisateur-groupe

Appartenance aux groupes

trino/etc/group.txt
akko-admin:admin,alice,trino,airflow
akko-engineer:bob
akko-analyst:carol
akko-user:eve
akko-viewer:dave

Utilisateurs de service

Les utilisateurs trino et airflow doivent être dans le groupe akko-admin. Trino utilise l'utilisateur trino pour les opérations internes, et Airflow se connecte en tant qu'airflow pour exécuter les requêtes de pipeline.

Matrice de permissions

Accès aux catalogues

Rôle Iceberg PostgreSQL System
akko-admin complet complet complet
akko-engineer complet complet lecture seule
akko-analyst lecture seule lecture seule lecture seule
akko-user lecture seule (PII masqué) lecture seule lecture seule
akko-viewer lecture seule -- lecture seule
(défaut) -- -- lecture seule

Accès aux schémas (Iceberg)

Rôle Schémas Propriétaire
akko-admin tous oui
akko-engineer raw, staging, analytics, sandbox oui
akko-analyst tous (lecture) non
akko-user tous (lecture, PII masqué) non
akko-viewer analytics, reporting, public non

Privilèges sur les tables (Iceberg)

Rôle Schémas Privilèges
akko-admin tous SELECT, INSERT, DELETE, UPDATE, OWNERSHIP, GRANT_SELECT
akko-engineer raw, staging, analytics, sandbox SELECT, INSERT, DELETE, UPDATE
akko-analyst tous SELECT
akko-user tous SELECT (PII masqué via OPA)
akko-viewer analytics, reporting, public SELECT (filtré par lignes, PII masqué)

Évaluation des règles

Les règles dans rules.json sont évaluées de haut en bas, la première correspondance l'emporte. Le fichier contient trois sections : catalogs, schemas et tables. Une règle de refus générale à la fin de la section catalogs bloque tout accès non correspondant :

{
  "catalog": ".*",
  "allow": "none"
}

Connexion depuis les notebooks

from trino.dbapi import connect

conn = connect(
    host="trino",
    port=8080,
    user="alice",         # Nom d'utilisateur Keycloak
    catalog="iceberg",
    schema="analytics",
)
cursor = conn.cursor()
cursor.execute("SELECT * FROM transactions LIMIT 10")
rows = cursor.fetchall()

Identité utilisateur

Utilisez toujours le nom d'utilisateur Keycloak (par ex. alice, bob) comme paramètre user. Cela détermine quel groupe RBAC s'applique. N'utilisez jamais akko-admin ou trino comme utilisateur depuis les notebooks.

Connexion depuis Superset

Superset se connecte à Trino avec l'utilisateur trino, qui est membre de akko-admin et a donc un accès complet à tous les catalogues et schémas.

Format de la chaîne de connexion :

trino://trino@trino:8080/iceberg

Référence de configuration

Fichier Paramètre Valeur
config.properties coordinator true
config.properties node-scheduler.include-coordinator true
config.properties http-server.http.port 8080
config.properties http-server.process-forwarded true
config.properties web-ui.authentication.type FIXED
access-control.properties security.refresh-period 5m
group-provider.properties file.refresh-period 5m

Problèmes connus

Points d'attention importants

  • Le groupe akko-admin doit inclure trino et airflow : Ces utilisateurs de service ont besoin d'un accès de niveau administrateur pour les opérations internes et les requêtes de pipeline.
  • Le mot de passe Trino persiste dans le volume PG : Si vous changez le mot de passe PostgreSQL dans .env, l'ancien mot de passe est toujours stocké dans le volume Postgres. Corrigez avec ALTER USER akko WITH PASSWORD '...'.
  • invalid_scope de Polaris : Le catalogue Iceberg doit définir iceberg.rest-catalog.oauth2.scope=PRINCIPAL_ROLE:ALL explicitement.
  • DROP TABLE interdit par Polaris : Utilisez CALL iceberg.system.unregister_table('schema', 'table') au lieu de DROP TABLE.
  • Secrets dynamiques : Trino utilise la syntaxe ${ENV:VARIABLE} pour lire les secrets depuis les variables d'environnement au démarrage. Ne codez jamais les identifiants en dur dans les fichiers .properties.