Automatización de la ejecución de Spark Notebooks

Spark es una herramienta que le permite procesar grandes volúmenes de información, como se explica en este artículo de Eiti Kimura. Las operaciones aplicadas a los datasets son variadas, incluidos filtros, agregaciones, algoritmos de aprendizaje automático y gráficos de visualización. También se utilizan con diferentes propósitos para generar información a partir de los datos.
El Spark Notebook es una herramienta (similar a Jupyter Notebook) que le permite programar un notebook, que es un archivo compuesto por celdas que tienen código o texto, también se ejecuta celda por celda, conectado a Spark. En la práctica, después de crear el notebook, tenemos una pipeline, que es un flujo de manipulación de datos, que contiene procesos como:
– Lectura de datasets;
– Limpieza y transformaciones de datos;
– Generación de nuevas features;
– Enriquecimiento de otros datastores;
– Formación de modelos de aprendizaje de máquina;
– Visualización de datos;
– y obtener de insights
En la Figura 1, tenemos un ejemplo del uso de Spark Notebook ejecutando una celda que genera un gráfico como salida:
Figura 1: Ejemplo de ejecución de una celda en Spark Notebook.
El uso de notebooks facilita la exploración de datasets, pero presenta desafíos tales como: reutilizar el código utilizado en los notebooks para escanear y luego tener que ejecutarlos en producción, programar notebooks y ver gráficos. En este artículo, presento cómo hizo Tail para automatizar el uso de los Spark Notebooks, pudiendo usar lo mismo notebook tanto para exploración como para producción.
La exploración de datos es el paso que le permite conocer el contenido de los datasets mediante la aplicación de diversas transformaciones para generar insights. En Spark, esta exploración a menudo se realiza a través de una herramienta de notebook, lo que permite al equipo de científicos de datos crear código en partes, que se agrupan en celdas. Justo después de la creación de una celda, podemos ejecutar este código y obtener su resultado, tanto en formato de texto como de gráficos, por lo que tenemos un entorno de exploración interactivo.
La exploración de datos con el notebook generalmente se realiza mediante operaciones proporcionadas por Spark o mediante la creación de código en Java, Python o Scala. Una de las bibliotecas disponibles para la manipulación de datos es Spark SQL, que ofrece la opción de ejecutar sentencias SQL en sus datasets.
Con el uso de notebooks también tenemos algunos problemas:
– Al explorar un dataset, es ideal realizar esta exploración en una muestra de ese dataset, especialmente cuando el dataset es demasiado grande, porque en este momento todavía estamos conociendo el dataset o tratando de obtener información y debido al tiempo de procesamiento requerido para realizarlo las operaciones en esos datos. Pero después de la exploración, necesitamos cambiar el dataset para usar su versión completa;
– Los notebooks de experimentación generalmente son creados por el equipo de Científicos de Datos, que después de completar las operaciones y validar los resultados, envía el notebook al equipo de Ingeniería de datos, que programa el pipeline para que se ejecute periódicamente en el entorno de producción;
– Un notebook no es el mejor entorno para que los clientes y otras partes interesadas vean los datos o gráficos que el pipeline produjo , ya que estos gráficos estarán disponibles en una interfaz que también contiene los códigos que la produjeron. Idealmente, los clientes deberían ver sus gráficos en su propio entorno, como un dashboard compuesto por gráficos producidos por diferentes pipelines; y los datos manipulados se obtienen en un formato de archivo que puede usarse para algún otro uso.
En Tail, ejecutamos más de 5,000 pipelines por día, independientemente de levar en consideración los pipelines que demoran más de 24 horas en ejecutarse. Si tuviéramos que ejecutar todos los pipelines desde un sistema de creación de notebook, necesitaríamos asignar a varias personas de un equipo de Ingeniería de Datos solo para eso, diariamente.
Para facilitar el uso de las notebooks, hemos creado un sistema que ejecuta directamente archivos en formato Spark Notebook. (En GitHub de Spark Notebook hay un ejemplo de este archivo). Spark Notebook está escrito en Scala, lo que hicimos fue empaquetarlo como una dependencia en nuestro proyecto. Entonces llamamos directamente al código para ejecutar celda por celda de los notebooks, y también tenemos la opción de pasar como parámetro qué dataset usar en el notebook.
Con la capacidad de ejecutar Spark Notebooks, el mismo notebook criado para explotar datos también se usa en producción. Dependiendo del uso dentro del notebook para manipular o simplemente consultar datasets, identificamos la necesidad de bloquear o no el acceso al datastore, y si necesita de bloquear algún dataset, los otros notebooks se ponen en cola y esperan su turno para ejecutarse.
También programamos la ejecución de cada notebook y después de la ejecución aprovechamos la oportunidad para guardar el log de la salida, que es generado por el propio Spark Notebook con el resultado de la ejecución, celda por celda. Este log se usa si hay problemas al ejecutar el notebook y permite entender la causa del error. Además, copiamos los gráficos generados del registro de ejecución; Por lo tanto, podemos presentarlos en un dashboard con una interfaz más agradable, permitiendo incluso el cambio del orden y la posición del gráfico; y exportar los datasets generados dentro del notebook a formato de archivo.
En la Figura 2, tenemos un resumen de la arquitectura diseñada para automatizar la ejecución de notebooks, y esta misma arquitectura se usa tanto para la exploración usando datasets que contienen una muestra del dataset original, como para la ejecución después de haber sido programada para ejecutarse con el dataset completo.
Figura 2: Arquitectura de ejecución automatizada de Spark Notebooks.
Spark Notebook viene con algunos gráficos como: barras, pasteles, gráficos y mapas; pero para visualizaciones más complejas, necesitamos implementar nuevos gráficos. Spark Notebook le permite implementar nuestros propios gráficos, siguiendo un patrón de su documentación, por lo que creamos un módulo específico para generar nuevos gráficos y los importamos como una biblioteca externa, para que podamos ejecutar notebooks con nuestros gráficos.
Con estos cambios pudimos ejecutar fácilmente el notebook creado en la exploración en producción, programando cuándo debería ejecutarse cada notebook. Y tenemos un dashboard interesante para ver los gráficos generados.
En la conferencia Construcción de Data Pipelines en Apache Spark, Fabiane Nardon (directora científica de datos de Tail) explica cómo automatizamos la creación y ejecución de pipelines.
Sobre el autor: Rafael Sakurai (@rafaelsakurai) es un líder técnico en el equipo de ingeniería de Big Data de Tail y editor responsable del contenido de AI, ML e Ingeniería de Datos de InfoQ Brasil. Lleva más de 15 años trabajando con el desarrollo de aplicaciones empresariales, tiene interés en el desarrollo de soluciones distribuidas, el aprendizaje automático y la ciencia de datos.