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.
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.
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¶
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 :
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 :
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-admindoit incluretrinoetairflow: 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 avecALTER USER akko WITH PASSWORD '...'. invalid_scopede Polaris : Le catalogue Iceberg doit définiriceberg.rest-catalog.oauth2.scope=PRINCIPAL_ROLE:ALLexplicitement.DROP TABLEinterdit par Polaris : UtilisezCALL iceberg.system.unregister_table('schema', 'table')au lieu deDROP 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.