Published

Handoff · 2026-08-09 — Spark absorbido, StarRocks por delante

Connect any source, model it as an ontology, transform it, and operationalize it, analytics, automation and machine learning, under one governed, self-hostable roof. --- Most teams stitch the...

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):

  1. 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 MySQLmysql2 y listo. Ningún benchmark arregla esto.
  2. 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.
  3. Vended credentials desde 4.0, que encaja con el STS encendido hoy.

2 · Dónde estamos, exactamente

FaseEstado
S0-S2operador · Spark arranca · lee por la cara con credencial vendida🏁
S3identidad propia (lakekeeper-spark, -etl, -maintenance)🟡 grants sí; clientes Keycloak creados A MANO, no como código
S4autorización: revocar el grant corta a Spark🏁 con control negativo
S5·0principals de escritura y mantenimiento🏁
S5·1la escritura que firma🔴 BLOQUEADA en can_commit
S5·2-5mantenimiento Iceberg⬜ approach escrito
S6·0/1SparkConnectServer🏁 / 🟡 — se conserva para notebooks
S6·2-5latencia y concurrencia❌ retiradas: la decisión no era de velocidad
S8retirar la VM de OpenMetadataOpenMetadata 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 abajolo 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.

FaseGate
R0operador/despliegue en el clusterpods Running, nada en Pending
R1catálogo Iceberg REST contra nuestra caraSHOW DATABASES responde
R2⭐ lee con credencial vendidacount(*) sobre tabla real + negativo sin grant
R3JWT identity passthroughel catálogo ve al usuario, no al motor — el gate que justifica la elección
R4la caché localla 2ª pasada de la misma query, contra la 1ª
R5el editor por MySQL wireel 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/listener que 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

  1. 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.
  2. can_commit (§3).
  3. Los clientes de Keycloak como códigolakekeeper-spark, -etl se crearon a mano hoy. El día que se recree el realm, S2/S5 dejan de pasar y nadie sabrá por qué.
  4. La deriva Index ↔ físico — 157 tablas físicas vs 109 datasets.
  5. /metrics sin gobernar — el RESTMetricsReporter de Iceberg publica en cada escaneo y la cara devuelve 404: ruido, y telemetría de escaneo que se tira.
  6. Rotar el secreto de lakekeeper-spark (se pegó en el chat) y carbon-r2-vending-spike (Admin R&W sobre todos los buckets, activo).

5 · Los docs que dan contexto

DocPara qué
sustrato-02.mdla foto de hoy. Manda sobre todo lo demás
sustrato-01.mdla foto del 08-08 · §7 = claims retiradas, leer antes de citar cualquier approach viejo
s5-write-maintenance-approach.mdel 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.mdel 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.mdhistórico de F0-F7. Trino ya no existe

6 · Las lecciones de la sesión, que valen más que las fases

  1. 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.
  2. Un gate de aislamiento que sólo comprueba lo que NO se puede hacer aprueba un sistema que no puede hacer nada. sts-aislamiento medía tres negativos y ningún positivo de escritura.
  3. 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.
  4. El bridge de OPA no contenía política: la traducía. Comprobarlo evitó tirar F4 entera al demoler Trino.
  5. Declarado ≠ efectivo. writer se declara con un agregado (1 privilegio → 21); reader hoja por hoja. Compararlos por la tabla da un rojo falso.
  6. El separador de namespace %1F no sobrevive a escribir un fichero y produce 404 que parecen «la tabla no existe». String.fromCharCode(31).
  7. spawnSync(..., {shell:true}) no es bash en Windows — es cmd.exe.