Saltar al contenido
Lakehouse LabLakehouse LabPreparación Databricks Data Engineer
Módulo 26 · Professional

Observabilidad

Contenido abierto

Puedes leer todo sin registrarte. Solo crearemos un perfil anónimo cuando decidas guardar tu progreso.

Professional

Spark UI, Query Profile y system tables

Combina señales de ejecución, plataforma y datos para reducir el tiempo de diagnóstico.

Lectura pública
Al terminar podrás
  • Localizar cuellos en Spark UI y Query Profile
  • Consultar historial de Jobs y auditoría
  • Usar CLI y REST para automatizar diagnóstico
Ver fuentes y revisión

Metadatos editoriales

Última revisión
21 jul 2026
Nivel
Professional
Ruta relacionada
performance
Dominios blueprint
Monitoring and Alerting · Debugging
Estado
Revisión editorial interna
Fuentes principales
Query profile · System tables reference
Reportar un error
01
Modelo mental

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.

Objetivo
Lee Spark UI de arriba abajo: job, stage, task y executor, manteniendo una hipótesis que conecte tiempo con datos y recursos.
Duración estimada
17 min aprox.
Dificultad
Professional
Prerrequisitos
m25
Reportar un error en esta lección

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.

Modelo mental

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.

Stage

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.
Task attempt

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.
Camino crítico

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.
PySparkEtiquetar una ejecución antes de abrir Spark UI
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.

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.

Recuerdo activo

¿Qué vista usarías para demostrar que cinco tareas concentran el shuffle de una etapa?

Borrador privado · solo en este navegador
02
Implementación

Query Profile y operadores

Usa Query Profile para serverless y SQL warehouses, separando cola, planificación, pruning y ejecución por operador.

Objetivo
Usa Query Profile para serverless y SQL warehouses, separando cola, planificación, pruning y ejecución por operador.
Duración estimada
17 min aprox.
Dificultad
Professional
Prerrequisitos
m25
Reportar un error en esta lección

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.

Modelo mental

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.

Queue time

Intervalo en que una consulta espera capacidad antes de comenzar su ejecución.

Se corrige con concurrencia y capacidad, no necesariamente cambiando el SQL.
Cardinality explosion

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.
Statement ID

Identificador único de una ejecución de sentencia en el historial de consultas.

Une evidencia de system tables, interfaz, alertas y diagnóstico reproducible.
SQLConsulta etiquetada para comparar perfiles
-- 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.

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.

Recuerdo activo

¿Por qué task time puede superar wall-clock?

Borrador privado · solo en este navegador
03
Operación

System tables de workflows

Convierte system tables en una línea de tiempo común para consultas, jobs, compute y coste a escala de cuenta y región.

Objetivo
Convierte system tables en una línea de tiempo común para consultas, jobs, compute y coste a escala de cuenta y región.
Duración estimada
17 min aprox.
Dificultad
Professional
Prerrequisitos
m25
Reportar un error en esta lección

`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.

Construye vistas restringidas para equipos en vez de conceder acceso amplio al catálogo `system`. Une usando IDs de job/run/statement disponibles y conserva intervalos temporales; no fuerces joins cuando la fuente no emite un identificador común. Una línea de tiempo fiable diferencia fallo de compute, cola, ejecución lenta y reintento posterior.

Modelo mental

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.

Granularidad

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.
Ámbito regional

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.
Dimensión lentamente cambiante

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.
SQLDetectar consultas fallidas y lentas
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.

Puntos clave

  • Respeta ámbito regional y retención de cada system table.
  • Concede `USE` y `SELECT` mediante vistas de mínimo privilegio.
  • 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.

Recuerdo activo

¿Por qué una vista dinámica es preferible a compartir directamente `system.query.history`?

Borrador privado · solo en este navegador
04
Diagnóstico

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.

Objetivo
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.
Duración estimada
17 min aprox.
Dificultad
Professional
Prerrequisitos
m25
Reportar un error en esta lecció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.

Modelo mental

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.

Spark event log

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.
Driver log

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.
Executor log

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.
PythonLogging estructurado sin datos de negocio
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.

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.

Recuerdo activo

El compute no llegó a iniciar la aplicación. ¿Qué revisarías antes que los executor logs?

Borrador privado · solo en este navegador
05
Decisión de diseño

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.

Objetivo
Automatiza una captura mínima con CLI y APIs, manteniendo autenticación segura, paginación y trazabilidad de cada artefacto.
Duración estimada
17 min aprox.
Dificultad
Professional
Prerrequisitos
m25
Reportar un error en esta lección

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.

Modelo mental

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.

Paginación

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.
Backoff con jitter

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.
Manifest de evidencia

Índice que registra origen, tiempo, parámetros y checksum de cada artefacto capturado.

Aporta trazabilidad e integridad sin depender de nombres de archivo informales.
CLICaptura read-only de un run
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.

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.

Recuerdo activo

¿Por qué conviene separar la captura de `repair-run`?

Borrador privado · solo en este navegador
5 lecciones pendientes

Vista de lectura · sin ejecución

databricks-finops-system-tables

databricks-finops-system-tables · commit 7834d5d

README.md