Ejecutando notebooks en paralelo usando runMultiple

NotebookUtils (aka MSSparkUtils) en Microsoft Fabric es como tu caja de herramientas secreta para trabajar con notebooks. En esta ocasión nos centraremos en las utilidades de cuaderno runMultiple(), que te permite ejecutar notebooks en paralelo. La API utiliza un mecanismo de implementación multihilo dentro de una sesión de spark, lo que significa que los recursos de computación son compartidos por las ejecuciones de los notebooks referenciados.
Las ventajas que ofrece son:
Definición de las dependencias y el orden de ejecución de los notebooks
Ejecución de notebooks en paralelo, sin esperar a que finalice cada uno
Optimización de uso de los recursos de Spark, reduciendo así el coste de los proyectos en Microsoft Fabric
En este artículo, voy a mostrar cómo utilizar runMultiple con DAG (Directed Acyclic Graph) en Notebooks en Microsoft Fabric para lograr una alta concurrencia, flexibilidad y escalabilidad.
Ejecutar múltiples notebooks en paralelo
Ejemplo simple de uso de runMultiple para ejecutar múltiples notebooks en paralelo.
Notebook Orquestador – Notebook principal que ejecutará los otros notebooks.
Notebook1, Notebook2, Notebook3 – son los notebooks de trabajo que se ejecutarán desde el notebook principal, obtendrán los valores de los parámetros y devolverán la salida al notebook principal.
En su forma más simple, puedes ejecutar todos los notebooks en paralelo pasados como una lista:
notebookutils.notebook.runMultiple(["Notebook1", "Notebook2", "Notebook3"])

Aunque tengo 3 notebooks en este pipeline, en el hub de monitorización sólo veo uno porque todos los cuadernos comparten el cómputo del notebook orquestador

Ejecutar múltiples notebooks con DAG
De esta forma, se pueden ejecutar varios notebooks con parámetros y con un orden especifico, respetando las dependencias.
DAG = {
"activities": [
{
"name": "dimension_fecha",
"path": "dimesionFecha",
"timeoutPerCellInSeconds": 120,
"args": {"fecha_inicio": "2024-01-01", "fecha_fin": "2024-12-31"},
},
{
"name": "dimension_cliente",
"path": "dimesionCliente",
"timeoutPerCellInSeconds": 120,
"args": {"filas": 1000},
},
{
"name": "dimension_producto",
"path": "dimensionProducto",
"timeoutPerCellInSeconds": 120
},
{
"name": "fact_venta",
"path": "factVenta",
"timeoutPerCellInSeconds": 600,
"retry": 1,
"retryIntervalInSeconds": 10,
"dependencies": ["dimension_fecha","dimension_cliente","dimension_producto"]
}
],
"timeoutInSeconds": 43200,
"concurrency": 5
}
Name: Nombre de la NotebookActivity, debe ser único
Path: Nombre del notebook
Args: Parámetros del notebook
Retry: Número de reintentos cuando falla el notebook
Dependencies: List of NotebookActivity names that this activity depends on
TimeoutPerCellInSeconds: Tiempo máximo de espera para cada celda, por defecto 90 segundos
TimeoutInSeconds: Tiempo de expiración para el DAG completo. Por defecto es de 12 horas
Concurrency: Número máximo de notebooks a ejecutar en paralelo, por defecto 50
Para ejecutar y visualizar el DAG:
notebookutils.notebook.runMultiple(DAG, {"displayDAGViaGraphviz":True, "DAGLayout":"spectral", "DAGSize":11})

Puedes ver la barra de progreso interactiva a medida que los cuadernos se ejecutan en el orden especificado, respetando las dependencias y con una visión directa de qué Notebook se ha ejecutado con éxito y cuál ha fallado.
BONUS
Documentación runMultiple
Para poder ver un ejemplo y el uso detallado, ejecuta el siguiente código:
notebookutils.notebook.help("runMultiple")
Referenciar notebooks en otras áreas de trabajo
Por defecto, si no se especifica lo contrario, el notebook de referencia se buscará en la misma área de trabajo donde se ejecuta el notebook orquestador, pero puedes referenciar notebooks de otras áreas de trabajo:

Validar DAG
También existe un método para comprobar si el DAG está definido correctamente
notebookutils.notebook.validateDAG(DAG)
Referencias
NotebookUtils (antiguo MSSparkUtils) para Fabric – Microsoft Fabric | Microsoft Learn



