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 Catalogue Iceberg (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://storage:9000
s3.path-style-access=true
s3.aws-access-key=${ENV:STORAGE_ACCESS_KEY}
s3.aws-secret-key=${ENV:STORAGE_SECRET_KEY}
s3.region=us-east-1

Scope OAuth2

Le iceberg.rest-catalog.oauth2.scope=PRINCIPAL_ROLE:ALL est obligatoire. Sans cela, Catalogue Iceberg 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;

Moteurs de contrôle d'accès (Lego)

La couche requête expose un marqueur canonique unique, global.layers.query.accessControlEngine, avec trois modes réels. Une garde de rendu fail-closed (helm/akko/templates/validate-access-control.yaml) rejette toute combinaison incohérente au moment du helm template/helm install, pour qu'un Trino cassé ne soit jamais livré silencieusement.

Moteur Ce que charge Trino Dépendance OPA Contrôle fin (masquage de colonnes, filtres de lignes)
opa (défaut) plugin access-control.name=opa, URIs de politique vers akko-akko-opa Oui (akko-opa doit être activé) Oui
file access-control.name=file, ConfigMap souverain rules.json à 6 rôles Non Non
none access-control.name=allow-all (intégré) Non Non

Le défaut est opa et reste byte-identical à la production. Pour basculer, appliquez un overlay d'exemple en dernier (après vos propres values) :

# Ruleset fichier (CORE souverain, sans OPA)
helm upgrade akko helm/akko -n akko -f my-values.yaml \
  -f helm/examples/values-trino-accesscontrol-file.yaml --set akko-opa.enabled=false

# Aucun plugin (allow-all ; à réserver derrière une frontière d'autorisation externe)
helm upgrade akko helm/akko -n akko -f my-values.yaml \
  -f helm/examples/values-trino-accesscontrol-none.yaml

La garde échoue le rendu quand, par exemple, accessControlEngine=opa mais akko-opa.enabled=false (Trino pointerait sur un service OPA inexistant), ou quand une propriété OPA subsiste en mode file/none après un overlay à moitié appliqué. C'est un contrôle de configuration fail-closed : aucun accès n'est ouvert par défaut.

Frontière CORE (stratégie open-core) : file et none ne fournissent que les règles catalogue/schéma/table. Le masquage de colonnes et les filtres de lignes sont des fonctions du plugin OPA ; en mode file/none, akko-policy-sync (propagation PII vers OPA) est sans effet et doit rester désactivé. Le mode file exige aussi un group provider (LDAP, ou le fichier de secours group.txt livré dans l'overlay) pour que les groupes de rôles se résolvent.

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

Le moteur file utilise un ruleset souverain aligné sur les six rôles plateforme (admin, engineer, analyst, steward, user, viewer), réactualisé toutes les 5 minutes. Pour le guide RBAC complet (Identité (Keycloak), Moteur de politiques (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 Moteur d'orchestration (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 Moteur de politiques)
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 Identité (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 Moteur BI (Superset)

Moteur BI 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 Catalogue Iceberg : Le catalogue Iceberg doit définir iceberg.rest-catalog.oauth2.scope=PRINCIPAL_ROLE:ALL explicitement.
  • DROP TABLE interdit par Catalogue Iceberg : 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.