Puedes leer sin crear un espacio. Créalo solo cuando quieras guardar.
Guardar progresoSpark UI, Query Profile y system tables
Combina señales de ejecución, plataforma y datos para reducir el tiempo de diagnóstico.
01Modelo mentalSpark UI: jobs, stages y executors
Lee Spark UI de arriba abajo: job, stage, task y executor, manteniendo una hipótesis que conecte tiempo con datos y recursos.
+
Spark UI: jobs, stages y executors
Lee Spark UI de arriba abajo: job, stage, task y executor, manteniendo una hipótesis que conecte tiempo con datos y recursos.
Spark UI es la herramienta de detalle para compute clásico. Empieza por la timeline y el job más largo, entra en su stage crítico y compara tareas. Scheduling delay señala falta de slots o overhead; shuffle read/write muestra movimiento; spill, GC y duración extrema orientan a memoria o skew. Los executors permiten comprobar si el trabajo se distribuyó y si hubo pérdidas.
No conviertas cada métrica en una receta. Un stage con 90 % de tiempo en una tarea no mejora con más workers; una etapa I/O-bound puede necesitar mejor layout o pruning. Conserva IDs de job, stage y run, captura percentiles y anota el plan o commit analizado para que otra persona reproduzca el diagnóstico.
spark.sparkContext.setJobGroup(
"daily-margin-2026-07-21",
"Daily margin aggregation · release 4f2c9ab",
)
result = build_daily_margin(spark.table("prod.silver.order_lines"))
result.write.mode("overwrite").saveAsTable("prod.gold.daily_margin")El job group facilita localizar la ejecución correcta; no registres secretos ni datos personales en la descripción.
¿Qué vista usarías para demostrar que cinco tareas concentran el shuffle de una etapa?
Profundiza
Spark UI es una reconstrucción causal de una ejecución. Un job nace de una acción; cada job contiene stages separados por exchanges; cada stage ejecuta tareas equivalentes sobre particiones; los executors aportan procesos, memoria y cores. Leer de arriba abajo evita saltar a una métrica llamativa sin contexto. Primero se identifica el camino crítico, después la etapa dominante, luego la distribución por tarea y finalmente el recurso que explica esa distribución. El plan SQL conecta esas métricas con operadores y datos de negocio. Una hipótesis completa suena así: este join produce un shuffle, una clave concentra bytes, cinco tareas derraman a disco y determinan la duración. No basta decir que el clúster está lento.
Conjunto de tareas que pueden ejecutarse sin un nuevo shuffle y comparten el mismo plan físico local.
Sitúa la frontera donde cambian distribución y dependencia, permitiendo localizar el camino crítico.Ejecución concreta de una tarea, incluida una repetición tras fallo o especulación.
Mezclar intentos puede inflar métricas y ocultar que la fiabilidad, no el volumen, causa el tiempo.Cadena de etapas y tareas que determina el tiempo mínimo de finalización del job.
Optimizar trabajo paralelo fuera de esa cadena puede no mejorar el SLA.Resumen
Puntos clave
- Navega desde la duración global hasta la tarea que explica el cuello.
- Correlaciona tiempo, bytes, registros, spill y ejecutor.
- Guarda identificadores y baseline para reproducibilidad.
Evita
- Mirar sólo la página Executors y perder la etapa concreta que causa el problema.
- Comparar una ejecución fría con otra caliente sin registrar caché y volumen.
02ImplementaciónQuery Profile y operadores
Usa Query Profile para serverless y SQL warehouses, separando cola, planificación, pruning y ejecución por operador.
+
Query Profile y operadores
Usa Query Profile para serverless y SQL warehouses, separando cola, planificación, pruning y ejecución por operador.
Query Profile visualiza el DAG de operadores y métricas como filas, tiempo, memoria y I/O. El resumen distingue wall-clock de task time agregado: el segundo puede ser mayor porque suma trabajo paralelo. Los top operators revelan scans completos, joins explosivos y agregaciones caras; los indicadores de pruning muestran si el layout evita leer datos irrelevantes.
En serverless no hay Spark UI, por lo que Query Profile y query history son la ruta principal. Una consulta servida desde cache puede no disponer de perfil; cambia de forma inocua la consulta para una medición controlada. Usa CAN MONITOR en el warehouse o propiedad de la consulta, y concede acceso al mínimo grupo operativo necesario.
-- incident: INC-2041 | variant: filtered-before-join
WITH recent_orders AS (
SELECT order_id, customer_id, net_amount
FROM prod.gold.orders
WHERE order_date >= current_date() - INTERVAL 7 DAYS
)
SELECT c.segment, SUM(o.net_amount) AS revenue
FROM recent_orders o
JOIN prod.gold.customers c USING (customer_id)
GROUP BY c.segment;Guarda statement ID, variante y ventana de datos; compara las mismas métricas y concurrencia.
¿Por qué task time puede superar wall-clock?
Profundiza
Query Profile es el mapa de tiempo y movimiento de una consulta en compute administrado. La latencia total se descompone en cola, preparación y ejecución; dentro de la ejecución, cada operador consume filas, bytes, CPU y tiempo y produce otros. Esa separación es esencial: escalar un warehouse no arregla una expresión ineficiente si el cuello está en ejecución, y reescribir SQL no elimina una cola causada por concurrencia. El perfil permite seguir el flujo desde scan y pruning hasta joins, aggregations y write, observar Photon y detectar explosiones de cardinalidad. El operador con más tiempo no siempre es la causa original: puede procesar el exceso generado por un join anterior.
Intervalo en que una consulta espera capacidad antes de comenzar su ejecución.
Se corrige con concurrencia y capacidad, no necesariamente cambiando el SQL.Aumento inesperado de filas provocado por joins no únicos, explode u otra operación multiplicativa.
Hace costosos todos los operadores posteriores y puede apuntar a un error de semántica.Identificador único de una ejecución de sentencia en el historial de consultas.
Une evidencia de system tables, interfaz, alertas y diagnóstico reproducible.Resumen
Puntos clave
- Wall-clock y task time agregado miden fenómenos distintos.
- Top operators y DAG localizan el operador dominante.
- Pruning e I/O validan layout mejor que una sensación de rapidez.
Evita
- Interpretar task time agregado como duración percibida por el usuario.
- Optimizar el operador más vistoso sin comprobar si está en la ruta crítica.
03OperaciónSystem tables de workflows
Convierte system tables y señales de Data Quality Monitoring en una línea de tiempo común para ejecución, coste y salud del dato.
+
System tables de workflows
Convierte system tables y señales de Data Quality Monitoring en una línea de tiempo común para ejecución, coste y salud del dato.
`system.query.history` registra statements de SQL warehouses y serverless con estado, duración, compute y métricas. `system.lakeflow.job_run_timeline` y `job_task_run_timeline` permiten analizar ejecuciones y tareas de jobs; `system.billing.usage` aporta consumo. Estas tablas son regionales en gran parte, tienen retenciones documentadas y están gobernadas por Unity Catalog.
Un run `SUCCESS` no demuestra que el activo esté fresco o completo. Data Quality Monitoring añade anomaly detection de freshness/completeness y data profiling de distribución/drift sin modificar el job productor. Correlaciona sus incidentes con IDs y ventanas de despliegue/run, y conserva expectations o reconciliaciones para reglas que deban aplicar acciones. Construye vistas restringidas y no fuerces joins cuando no exista identificador común.
SELECT
workspace_id,
statement_id,
executed_by,
execution_status,
total_duration_ms,
compute.type AS compute_type,
error_message
FROM system.query.history
WHERE start_time >= current_timestamp() - INTERVAL 24 HOURS
AND (execution_status = 'FAILED' OR total_duration_ms > 600000)
ORDER BY start_time DESC;Expón esta información mediante una vista que filtre workspaces o equipos; los mensajes pueden contener detalles sensibles.
¿Por qué una vista dinámica es preferible a compartir directamente `system.query.history`?
Profundiza
Las system tables son el plano histórico de observabilidad de la cuenta. Cada esquema registra una perspectiva: billing describe consumo, query history sentencias, lakeflow jobs y tasks, compute configuraciones, access auditoría y lineage relaciones inferidas. Ninguna tabla cuenta por sí sola el incidente completo. El trabajo conceptual consiste en construir una línea de tiempo con identificadores, región y granularidad compatibles, y aceptar que algunas relaciones son opcionales o parciales. Son datos sensibles y gobernados dentro del catálogo system, con retención y disponibilidad propias. Una consulta selectiva por tiempo y workspace protege rendimiento; copiar todo fuera de la plataforma amplía superficie de riesgo y suele ser innecesario.
Unidad que representa cada fila, como uso horario, sentencia, tarea, evento o relación de linaje.
Unir granos incompatibles sin agregación duplica métricas y produce conclusiones falsas.Cobertura limitada a eventos o recursos de una región, a diferencia de tablas globales de cuenta.
Explica ausencias y obliga a consultar o consolidar regiones de forma explícita.Historial de versiones de atributos de una entidad a lo largo del tiempo.
Permite asociar un run con la configuración de compute vigente entonces, no con la actual.Resumen
Puntos clave
- Respeta ámbito regional y retención de cada señal.
- Distingue salud del run de frescura, completitud y drift del dato.
- Correlaciona por IDs y tiempo, declarando lag y huecos de telemetría.
Evita
- Asumir que una consulta desde otra región aparecerá en el metastore consultado.
- Dar `SELECT` amplio sobre auditoría y query history a todo el workspace.
04DiagnósticoEvent logs y cluster logs
Escoge event logs, driver logs o executor logs según el fallo y entiende cómo modo de acceso y retención limitan la investigación.
+
Event logs y cluster logs
Escoge event logs, driver logs o executor logs según el fallo y entiende cómo modo de acceso y retención limitan la investigación.
El compute event log explica creación, cambios, escalado y terminación. Driver stdout/stderr/log4j contiene excepciones de planificación y aplicación; los worker/executor logs ayudan cuando una tarea concreta falla. Spark UI conserva detalle del runtime activo, pero reiniciar compute puede perder la vista histórica; configura entrega de logs cuando la política de soporte exige retención externa.
El acceso depende del modo de compute. En standard, los usuarios no ven todos los logs de executor y sólo admins acceden a ciertos driver logs; en dedicated, el principal asignado obtiene más visibilidad. No registres payloads, secretos o tokens para facilitar depuración. Usa correlation IDs y métricas estructuradas que permitan unir el fallo con job/run sin exponer datos.
import json
import logging
logger = logging.getLogger("orders_pipeline")
logger.setLevel(logging.INFO)
logger.info(json.dumps({
"event": "quality_gate_completed",
"run_id": dbutils.widgets.get("run_id"),
"table": "prod.silver.orders",
"invalid_rows": invalid_count,
"contains_customer_data": False,
}))Evita imprimir registros fallidos completos; guarda muestras sensibles sólo en una cuarentena gobernada.
El compute no llegó a iniciar la aplicación. ¿Qué revisarías antes que los executor logs?
Profundiza
Los logs se eligen por frontera de fallo. El event log de Spark describe eventos estructurados de aplicación y permite reconstruir jobs, stages y executors; el driver log contiene coordinación, stack traces del proceso principal y salida de usuario; el executor log contiene fallos dentro de tareas y procesos distribuidos. Mirar el archivo equivocado produce silencio o ruido. El modo de acceso determina quién puede ver logs y la retención local puede terminar al cerrar compute, por lo que incidentes críticos requieren entrega gobernada. Un log no es una fuente inocua: puede incluir rutas, parámetros, consultas o datos, así que permisos y redacción forman parte de observabilidad.
Secuencia estructurada de eventos de una aplicación usada para reconstruir su ejecución y Spark UI.
Permite análisis posterior aunque el compute ya no exista, si se configuró persistencia adecuada.Salida y errores del proceso que planifica, coordina y ejecuta código local de la aplicación.
Es la fuente para fallos de inicialización, planificación, librerías del driver y recopilación de resultados.Salida y excepciones de los procesos que ejecutan tareas sobre particiones distribuidas.
Localiza errores dependientes de datos, memoria o entorno que sólo ocurren en ciertos workers.Resumen
Puntos clave
- Event log describe ciclo de vida; driver logs, aplicación; executor logs, tareas concretas.
- Planifica retención antes del incidente.
- El modo de acceso condiciona quién puede investigar cada señal.
Evita
- Reiniciar compute antes de capturar evidencia que no tiene entrega persistente.
- Añadir `print(df.collect())` y filtrar datos personales a logs operativos.
05Decisión de diseñoCLI, REST APIs y automatización
Automatiza una captura mínima con CLI y APIs, manteniendo autenticación segura, paginación y trazabilidad de cada artefacto.
+
CLI, REST APIs y automatización
Automatiza una captura mínima con CLI y APIs, manteniendo autenticación segura, paginación y trazabilidad de cada artefacto.
La CLI ofrece comandos `jobs get-run`, `get-run-output`, `list-runs` y `repair-run`; el grupo `api` sirve para endpoints aún no envueltos. Una captura de incidente debe conservar run ID, estado, timestamps, configuración efectiva y enlaces a perfiles, no ejecutar reparaciones en el mismo paso. Usa OAuth para automatización y perfiles separados, nunca tokens pegados en scripts o notebooks.
Las respuestas pueden paginarse y algunos outputs de tareas tienen límites. Diseña el script como lectura idempotente, almacena JSON en un volumen gobernado con retención y redacta campos sensibles. Después de formular una hipótesis, la reparación se convierte en una acción aprobada con evidencia antes/después.
databricks jobs get-run 987654321 --output json > run-987654321.json
databricks jobs get-run-output 987654321 --output json > output-987654321.json
# Inspecciona antes de cualquier repair-run.
# La autenticación procede de OAuth o de un perfil seguro, no del script.Guarda los ficheros en un destino gobernado y aplica redacción si el output contiene parámetros sensibles.
¿Por qué conviene separar la captura de `repair-run`?
Profundiza
Una captura de diagnóstico automatizada debe ser una caja negra mínima, no una copia indiscriminada de la cuenta. Parte de un identificador de incidente y un intervalo, obtiene metadatos reproducibles mediante CLI o REST, sigue paginación y registra qué petición produjo cada artefacto. La autenticación representa una identidad de servicio con privilegios mínimos; el token nunca se imprime ni se almacena junto a la evidencia. Las APIs son eventualmente consistentes, versionadas y sujetas a límites, por lo que reintentos con backoff y marcadores de página son parte del mecanismo. El objetivo es preservar contexto suficiente para reconstruir la causa sin ampliar innecesariamente exposición de consultas, usuarios o datos.
División de una colección API en respuestas enlazadas mediante tokens, offsets o indicadores de continuación.
No recorrer todas las páginas crea diagnósticos incompletos y sesga recuentos o timelines.Espera creciente y ligeramente aleatoria antes de repetir errores transitorios.
Reduce presión sobre el servicio y evita que múltiples clientes reintenten simultáneamente.Índice que registra origen, tiempo, parámetros y checksum de cada artefacto capturado.
Aporta trazabilidad e integridad sin depender de nombres de archivo informales.Resumen
Puntos clave
- Separa captura read-only de acciones de reparación.
- Usa OAuth/service principal y perfiles de entorno.
- Gestiona paginación, límites y redacción de datos sensibles.
Evita
- Ejecutar `repair-run` automáticamente al detectar cualquier fallo y borrar la evidencia causal.
- Guardar un PAT junto al script de diagnóstico o en el historial del shell.