Handoff · 2026-08-09 — Spark absorbido, StarRocks por delante
Leer primero:
sustrato-02.md— la foto MEDIDA de la
infraestructura, con el comando que demuestra cada hecho. Manda sobre
cualquier approach o runbook donde discrepen.Este documento es el puente: qué pasó, dónde estamos, y qué procede.
1 · La decisión que ordena todo
Spark = CÓMPUTO. StarRocks = SERVING.
Spark en toda la aplicación —ingesta, flujos de datos, ETL, notebooks,
transformaciones, ML—. El SQL Editor no: consultas interactivas por
StarRocks.
Y antes de eso, el 2026-08-09: Trino fuera por completo, porque la arquitectura es full copy y la federación —su cuña— no se va a usar.
Por qué StarRocks y no Spark Connect (las tres, medidas, no de folleto):
- ⛔ No existe cliente Node/TypeScript de Spark Connect. El editor es
Next.js sobre Vercel; Spark Connect habla gRPC propietario. StarRocks habla
protocolo de cable MySQL →
mysql2y listo. Ningún benchmark arregla esto. - JWT identity passthrough (StarRocks 4.0): el catálogo vería al usuario, no a un principal técnico. Es la carencia exacta que bloqueó S5·1.
- Vended credentials desde 4.0, que encaja con el STS encendido hoy.
2 · Dónde estamos, exactamente
| Fase | Estado | |
|---|---|---|
| S0-S2 | operador · Spark arranca · lee por la cara con credencial vendida | 🏁 |
| S3 | identidad propia (lakekeeper-spark, -etl, -maintenance) | 🟡 grants sí; clientes Keycloak creados A MANO, no como código |
| S4 | autorización: revocar el grant corta a Spark | 🏁 con control negativo |
| S5·0 | principals de escritura y mantenimiento | 🏁 |
| S5·1 | la escritura que firma | 🔴 BLOQUEADA en can_commit |
| S5·2-5 | mantenimiento Iceberg | ⬜ approach escrito |
| S6·0/1 | SparkConnectServer | 🏁 / 🟡 — se conserva para notebooks |
| S6·2-5 | latencia y concurrencia | ❌ retiradas: la decisión no era de velocidad |
| S8 | retirar la VM de OpenMetadata | ⬜ OpenMetadata perfila vía Trino |
Desplegado en main: ed98e69 (sustrato + vending) y 87a4221 (S5·1 + S6).
3 · 🔴 El bloqueante vivo: can_commit
Spark → cara → Index autoriza al llamante ✅
→ acuña credencial de escritura ✅ (VendMode 'auto', desplegado)
→ Spark escribe los Parquet ✅
→ COMMIT → Lakekeeper ⛔ can_commit forbidden
Lo concedido y que NO bastó: describe·create·modify en los 9 warehouses, y
modify en el namespace. La documentación de Lakekeeper dice que modify
propaga hacia abajo — lo medido contradice al manual.
⇒ Pista sin explorar: change_ownership. Las acciones válidas sobre tabla
incluyen commit, write_data, read_data, change_ownership. El escritor
commitea porque creó las tablas («quien crea un objeto se convierte en su
dueño»), y ésa es la hipótesis viva junto con la caché de OpenFGA.
⚠️ Afecta a cualquier motor que escriba por la puerta, StarRocks incluido el día que escriba. No es deuda de Spark: es deuda del sustrato.
4 · El horizonte — absorción de StarRocks
Ninguna fase está escrita todavía; esto es el esqueleto propuesto, con la misma disciplina de gates que S0-S6.
| Fase | Gate | |
|---|---|---|
| R0 | operador/despliegue en el cluster | pods Running, nada en Pending |
| R1 | catálogo Iceberg REST contra nuestra cara | SHOW DATABASES responde |
| R2 | ⭐ lee con credencial vendida | count(*) sobre tabla real + negativo sin grant |
| R3 | ⭐ JWT identity passthrough | el catálogo ve al usuario, no al motor — el gate que justifica la elección |
| R4 | ⭐ la caché local | la 2ª pasada de la misma query, contra la 1ª |
| R5 | el editor por MySQL wire | el SQL Editor consulta desde Vercel sin intermediario |
Lo que hay que verificar temprano, y no dar por hecho:
- ⚠️ No hay operador de StarRocks en Stackable. Se sale de la familia: el
secret/listenerque conservamos no aplica. Hay operador oficial propio. - ⚠️ Es una capa de serving: siempre encendida, con memoria y SSD local. Forma de coste opuesta a Spark, que es efímero. Adiós al scale-to-zero ahí.
- ⚠️ Recién horneado: el arreglo del cacheo de credenciales vendidas es de julio de 2026. Seríamos temprano.
- ⭐ R4 es el que de verdad importa. Los 3,4 s/query medidos con Trino eran
topología (GKE
europe-west1→ R2 WEUR), no motor. Si la caché local no los baja, cambiar de motor no arregla el problema.
Y en paralelo, lo que no depende de StarRocks
- S5·2-5 · mantenimiento Iceberg — 144 tablas sin compaction ni expiración de
snapshots. Nadie las mantiene, y no es un problema que llegue con la
escala: llega con el tiempo. Approach:
s5-write-maintenance-approach.md. can_commit(§3).- Los clientes de Keycloak como código —
lakekeeper-spark,-etlse crearon a mano hoy. El día que se recree el realm, S2/S5 dejan de pasar y nadie sabrá por qué. - La deriva Index ↔ físico — 157 tablas físicas vs 109 datasets.
/metricssin gobernar — elRESTMetricsReporterde Iceberg publica en cada escaneo y la cara devuelve 404: ruido, y telemetría de escaneo que se tira.- Rotar el secreto de
lakekeeper-spark(se pegó en el chat) ycarbon-r2-vending-spike(Admin R&W sobre todos los buckets, activo).
5 · Los docs que dan contexto
| Doc | Para qué |
|---|---|
⭐ sustrato-02.md | la foto de hoy. Manda sobre todo lo demás |
sustrato-01.md | la foto del 08-08 · §7 = claims retiradas, leer antes de citar cualquier approach viejo |
s5-write-maintenance-approach.md | el mantenimiento Iceberg y por qué el orden de las 4 operaciones se mide, no se copia del blog |
s6-spark-connect-approach.md | §3·bis tiene el hallazgo del cliente Node |
platform-thesis.md | el norte: el cliente compra contexto, no velocidad |
federated-catalog-wedge.md | ⚠️ se queda sin caso: sostiene que la cuña es la federación, y la federación salió |
../runbooks/trino-absorcion.md | histórico de F0-F7. Trino ya no existe |
6 · Las lecciones de la sesión, que valen más que las fases
- ⭐ Un veredicto no se calcula por ausencia. Pasó dos veces el mismo día: una sonda que reventó sin imprimir dio 🟢 «está acotada», y un arnés cuyas tres corridas fallaron dio 🔴 «no hay puerta». Un resultado que no es ni el éxito ni el fallo esperados no es un dato.
- ⭐ Un gate de aislamiento que sólo comprueba lo que NO se puede hacer aprueba
un sistema que no puede hacer nada.
sts-aislamientomedía tres negativos y ningún positivo de escritura. - ⭐ Nadie había intentado nunca escribir por la puerta. Tres bloqueantes
apilados —región,
mode:'read', autorización de la cara— invisibles porque el único escritor la esquivaba. - El bridge de OPA no contenía política: la traducía. Comprobarlo evitó tirar F4 entera al demoler Trino.
- Declarado ≠ efectivo.
writerse declara con un agregado (1 privilegio → 21);readerhoja por hoja. Compararlos por la tabla da un rojo falso. - El separador de namespace
%1Fno sobrevive a escribir un fichero y produce 404 que parecen «la tabla no existe».String.fromCharCode(31). spawnSync(..., {shell:true})no es bash en Windows — escmd.exe.