Para este artículo te vamos a desgranar cómo funciona la pieza angular de un Data Lake: el procesado de los datos batch, o por lotes. Qué es, diferencias con el procesado en tiempo real, ventajas e inconvenientes, ejemplos productivos, arquitectura, principales herramientas y costes.
Este artículo forma parte de nuestra serie donde te contamos todo lo que necesitas saber para diseñar e implementar Arquitecturas Big Data.
Antes de comenzar la lectura, te recomendamos nuestro artículo sobre ingesta de datos en un Data Lake. Tras ingestar el dato, se va a procesar para su limpieza, transformación y agregación, por lo que es importante tener claros ciertos aspectos del volcado del dato, como su tipo, formato y frecuencia de ingesta.
¿Qué es el procesado batch o procesado por lotes?
El batch processing es un enfoque de procesamiento en el que los datos se agrupan en lotes o conjuntos, y se procesan en bloques, en lugar de procesarlos en tiempo real a medida que llegan. En otras palabras, se trata de realizar operaciones de procesamiento en un conjunto específico de datos en lugar de procesar cada dato individualmente en tiempo real.
Normalmente estos procesos funcionan a d-1, es decir, tendrás el dato disponible del día anterior. Lo más habitual es que los procesos batch corran de madrugada, para cuando entren los empleados a trabajar tengan todos los datos generados del día anterior, y preparados para trabajar con ellos.
Ahora bien, esto son ventajas que aplican a muchas empresas, pero no a todas. Aquellas que necesiten datos de los mercados financieros en tiempo real, de redes sociales o de redes de sensores, no pueden esperarse al día siguiente, sino que tienen que tomar decisiones en un marco temporal mucho más corto.
Procesado batch vs real-time
El procesado en tiempo real ofrece una respuesta inmediata en función de los eventos que van llegando. Trabaja con latencias bajas y el desarrollo de estos sistemas exige una mayor complejidad.
El procesamiento en tiempo real es esencial para situaciones que requieren respuestas rápidas y análisis continuos de eventos que ocurren en tiempo real. En muchos casos, las organizaciones utilizan ambos enfoques de manera complementaria para abordar diversas necesidades de análisis y toma de decisiones.
Aun así, no todo es blanco o negro. Los procesados en real time no dejan de ser mini batches en ventanas temporales muy cortas, donde se agrupan los datos, se procesan y se vuelcan en otro sistema. En ocasiones pueden resultar útiles soluciones híbridas donde corremos procesos batches cada 5, 15, 30 minutos. Esto ayuda a no tener que dejarse recursos extra en nuevas arquitecturas, siempre que el tiempo de procesado no vaya a superar esa ventana temporal, y los costes no sean disparatados.
Ventajas e inconvenientes del batch processing
Ventajas
- Eficiencia de Recursos: El procesamiento por lotes permite aprovechar eficientemente los recursos de hardware, ya que las operaciones se realizan en bloques de datos en lugar de uno por uno. De esta forma, si trabajamos en la nube pagaríamos únicamente por el tiempo de computación, que irá de unos minutos a unas pocas horas. No es necesario tener una maquina encendida 24/7.
- Programación y Planificación: Al programar y planificar las operaciones de procesamiento por lotes, las organizaciones pueden aprovechar momentos de menor carga de trabajo o en horarios específicos para realizar análisis y transformaciones de datos.
- Procesamiento Complejo: Las operaciones de procesamiento por lotes pueden ser más complejas y llevar más tiempo, lo que permite realizar análisis profundos y transformaciones complejas en los datos.
- Manejo de Grandes Volúmenes: El procesamiento por lotes es particularmente efectivo cuando se trata de grandes volúmenes de datos, ya que puede gestionarlos de manera ordenada y sistemática.
- Control del dato. Vamos a tener una mayor coherencia en la analítica que se lleva a cabo a lo largo de un día, pues normalmente la carga en batch es diaria. Si la carga fuese continua, los datos cambiarían constantemente durante todo el día, por lo que no estaría claro cuáles son las cifras.
Inconvenientes
- Latencia: Dado que el procesamiento por lotes requiere esperar a que se recopile un conjunto de datos antes de procesarlos, puede haber una latencia significativa entre la recopilación y el análisis real.
- Falta de Respuesta en Tiempo Real: Para casos donde se requieren respuestas inmediatas a eventos en tiempo real, el procesamiento por lotes puede no ser adecuado, ya que no responde en tiempo real a los eventos que ocurren.
Ejemplo de procesado de datos batch productivos en una empresa
En este apartado te traemos un ejemplo de cómo sería un procesamiento de datos en una de las plataformas cloud más utilizadas en el mercado, Azure. Por un lado tendríamos la ingesta de los datos, que provendría de varias fuentes. Esto lo podemos llevar a cabo con Azure Data Factory, que se encargaría de orquestar todos los procesos.
Los datos los guardaríamos o bien en Azure Data Lake si queremos almacenar archivos, o bien en Azure Synapse Analytics si tenemos tablas.
A continuación tendríamos la pieza de databricks con la que podremos orquestar procesos en Spark. Muy útil en caso de tener que atacar datos masivos.
Y por último, en cuanto al consumo, podemos o bien desarrollar dashboards en la propia herramienta de BI de Microsoft: Power BI, o también en Synapse Analytics.
Se trata de un ejemplo de arquitectura sencilla en la nube donde tendríamos dos etapas de procesado de datos. Una en Azure Data Factory, y la otra en databricks. Sistemas de almacenaje, y un orquestador de pipelines de datos como sería Azure Data Factory.
Lenguajes de programación para batch processing
A la hora de procesar pipelines de datos, especialmente en el ámbito del big data y el procesamiento de datos a gran escala, existen varios lenguajes de programación que son ampliamente utilizados debido a su capacidad para manejar la complejidad y la escalabilidad de estas operaciones. Algunos de los lenguajes más adecuados para procesar pipelines de datos serían:
Python
Python es muy popular en el procesamiento de datos gracias a su amplia gama de bibliotecas y como pandas, NumPy y pyspark (Apache Spark). Es un lenguaje de propósito general y de los más sencillos de aprender. Además, cuenta con herramientas orientadas al tratamientos de datos como los notebooks de Jupyter.
Java
Java es ampliamente utilizado en el mundo del big data, especialmente para el procesamiento de datos a gran escala. Frameworks como Apache Hadoop y Apache Flink están basados en Java. Java se destaca por su rendimiento y capacidad para manejar volúmenes masivos de datos.
Scala
Scala es otro lenguaje que se utiliza junto con Apache Spark (ScalaSpark) y Apache Flink. Combina la concisión de la sintaxis de programación funcional con la capacidad de aprovechar la infraestructura de Java. Es uno de los lenguajes con mayor velocidad.
SQL
SQL (Structured Query Language) es fundamental para consultas y manipulación de bases de datos. Muchas plataformas de procesamiento de datos, como Apache Hive y Apache Drill, permiten el uso de SQL para trabajar con grandes conjuntos de datos.
R
R es ampliamente utilizado para análisis estadístico y visualización de datos. Puede ser una excelente opción para el procesamiento y análisis de datos en entornos más enfocados en la estadística y la investigación. Comenzó siendo el rey del Data Science, pero Python le ha ido comiendo terreno poco a poco.
Go
Go es un lenguaje de programación que ha ganado popularidad en el procesamiento de datos en tiempo real y en el desarrollo de aplicaciones de alto rendimiento. Es conocido por su eficiencia y velocidad.
NOTA: Spark no se encuentra en esta lista, pues es un motor de procesado de datos. Tiene sus particularidades y son sus APIs (Python, Java, R) las encargadas de abstraernos en cierta medida de sus procesos y estructuras.
La elección del lenguaje depende en gran medida del ecosistema en el que estás trabajando, las bibliotecas y herramientas disponibles, y las necesidades específicas de tus pipelines de datos. Cada lenguaje tiene sus propias ventajas y desventajas, por lo que es importante considerar factores como la escalabilidad, el rendimiento y la experiencia del equipo al tomar una decisión.
Arquitectura Data Pipeline para procesado batch
Para poder desarrollar una arquitectura cloud donde llevemos a cabo un procesado de datos en batch productivo, son necesarios los siguientes componentes:
- Orquestador. Pieza clave para que todo funcione correctamente y de forma automática. Se encargará de organizar todos los procesados de los datos, mandar avisos, tomar decisiones en caso de errores, planificar ejecuciones y ordenar el pipeline.
- Data Processing. El orquestador no tiene por qué ser el que corra los procesos. En esta etapa necesitamos capacidad de cómputo para manejar grandes volúmenes de datos. Normalmente se eligen tecnologías de Big Data como Apache Spark, que permiten computación en paralelo. Se utiliza uno o varios clusters para correr los jobs, y cuando termina el procesado se apagan.
- Código. El código se desarrolla y testea en local, y después se programa un pipeline de subida a producción, coordinado con una herramienta de control de versiones. Esto conformará artefactos, que no son más que archivos donde se almacene toda la lógica del pipeline. Cuando el orquestador corre el procesado, acude al repositorio de artefactos, que podría incluso ser simplemente un cloud Storage, recoge el código, y lo manda al ejecutor de procesos.
- Bases de datos. Por último, serán necesarias bases de datos para leer y almacenar los datos procesados en el pipeline. Tanto los finales como los procesos intermedios que necesiten escribir.
Por supuesto, hay muchas derivadas a esta arquitectura, podemos no usar un orquestador y montar nosotros mismos las comunicaciones en la nube mediante cloud functions y otros recursos cloud, utilizar otros procesadores que no sea Spark o añadir sistemas de monitoring. En este artículo nos centraremos puramente en el procesado batch.
Principales herramientas para orquestación de procesos batch
Como un proceso batch se va a componer a su vez de varios subprocesos, existirán dependencias, conflictos y errores que va a tener que solucionar el orquestador en el momento de la ejecución. Es por ello, que debemos tener planes de contingencia en caso de fallos en el procesado, sistemas de avisos y de monitoring. Veamos cuáles son las principales herramientas del mercado que se encargan de solventar todo esto:
- Apache Airflow. Apache Airflow es una plataforma de orquestación de flujos de trabajo que permite automatizar, programar y monitorizar tareas y pipelines de datos en sistemas distribuidos. Basado en el concepto de DAGs (Directed Acyclic Graphs), Airflow proporciona una interfaz visual para diseñar y gestionar flujos de trabajo, lo que facilita la planificación, ejecución y supervisión de tareas interconectadas, procesamiento de datos, extracción y carga, y otras operaciones en entornos de big data.
- Dagster. Dagster es una plataforma open source para la orquestación y monitoreo de flujos de datos en entornos Big Data. Se diferencia al enfocarse en la integridad de los pipelines, garantizando que las operaciones se realicen de manera predecible, y con sólida gestión de errores. Dagster ofrece una abstracción de alto nivel para crear y ejecutar pipelines de datos, además de proporcionar herramientas para testear, documentar y monitorear los procesos, promoviendo una práctica ingeniería de datos más robusta y colaborativa.
- AWS Step Functions. AWS Step Functions es un servicio de orquestación de flujos de trabajo en la nube que permite coordinar y automatizar secuencias de tareas y microservicios en aplicaciones distribuidas. Basado en el concepto de máquinas de estados visuales, Step Functions proporciona una interfaz gráfica para diseñar, visualizar y gestionar flujos de trabajo complejos.
- Azure Data Factory. Azure Data Factory es un servicio de orquestación y transformación de datos en la nube de Microsoft Azure, diseñado para mover, transformar y procesar datos desde diversas fuentes a destinos destinos. Proporciona una plataforma para crear y administrar flujos de trabajo de datos mediante una interfaz visual.
- Google Cloud Dataflow. Google Cloud Dataflow es un servicio de procesamiento de datos en tiempo real y batch, en la nube de Google Cloud. Basado en el modelo de programación Apache Beam, Dataflow permite diseñar y ejecutar flujos de trabajo de datos escalables y paralelos para la ingesta, transformación y análisis de datos. Proporciona una abstracción de alto nivel para crear pipelines de datos y gestionar la distribución y el procesamiento de datos a través de clusters de recursos. Con capacidades de autoescalado y optimización, Dataflow permite realizar operaciones de procesamiento de datos a gran escala con facilidad.
- Prefect. Prefect es una plataforma de flujo de trabajo de datos y orquestación que facilita la automatización y gestión de procesos de datos. Prefect permite definir, programar y ejecutar flujos de trabajo complejos. Ofrece una interfaz de usuario intuitiva y capacidades de versionado, lo que permite a los usuarios crear y mantener pipelines de datos robustos, además de proporcionar herramientas para la gestión de errores y la monitorización en tiempo real.
- Luigi. Luigi es un software open source para la orquestación y programación de flujos de trabajo en Python. Diseñado por Spotify, Luigi facilita la creación y administración de pipelines de datos al proporcionar una forma estructurada de definir tareas y dependencias entre ellas. Los flujos de trabajo se representan como grafos dirigidos acíclicos (DAGs), lo que permite ejecutar tareas de manera secuencial o paralela.
Niveles de abstracción
Las plataformas cloud ofrecen recursos en distintos niveles de abstracción en función de las preferencias a la hora de controlar la infraestructura que desplegamos. Esto nos permite acudir a soluciones lo más serverless posible, con autoescalado e interfaz gráfica (SaaS). O elegir otro tipo de soluciones PaaS como Google Dataproc, donde Google nos ofrece distintas configuraciones de clusters y nosotros nos encargamos del desarrollo de la aplicación y despliegue en el cluster.
También podemos acudir a soluciones IaaS, es decir, desplegamos una máquina virtual con su sistema operativo, y somos nosotros los encargados del despliegue de todo el software para el desarrollo, además de la aplicación, subida, puesta en producción, etc. Ya que trabajamos con la nube, lo mejor es aprovecharnos de sus herramientas, ahorrarnos tiempo y pagar solo por su uso.
Integración con Git
Fundamental tanto en el código del propio pipeline como en el código donde definamos la infraestructura, llevar un buen seguimiento de los cambios con herramientas colaborativas en cloud y con buena integración con entornos de desarrollo DevOps. Las más utilizadas serían Git, Bitbucket o GitLab.
Costes de procesados batch
En este apartado nos vamos a centrar únicamente en los costes de las herramientas de procesado y orquestación, pues el resto de componentes de la arquitectura vistos en el apartado de Arquitectura Data Pipeline también tienen su coste. Aun así, ni es el core del artículo ni el coste de esos componentes supondrá una cantidad importante, a no ser que tengamos muchos Tb de almacenamiento, o la herramienta utilizada en la orquestación sea también la encargada de procesar los datos.
Lo más costoso es el tiempo de máquina encendida, por tanto, los proveedores cloud nos cobrarán por el procesado de los datos en la/s maquina/s que nosotros configuremos. Aquí lo ideal es utilizar un servicio serverless con autoescalado, a través del cual pagaremos únicamente por lo que estamos usando, por el tiempo de procesado. Hay que prestar especial atención a programas asíncronos o multithreading, porque pueden autoescalar la infraestructura más de lo esperado.
Si trabajas con clusters o máquinas virtuales, asegúrate que estén siempre apagadas cuando acaba la jornada laboral para evitar facturas elevadas. Esto se puede configurar desde el propio recurso cloud, con un apagado programado.
A no ser que estés trabajando con algoritmos pesados de IA, la mayor parte del presupuesto se lo llevarán las máquinas de trabajo diarias, pues los procesados en producción no deberían ser superiores a minutos o unas pocas horas al día. Una buena opción para reducir estos costes sería trabajar la analítica y desarrollo de pipelines en local, aunque no siempre es posible por el volumen de datos.
Aquí tienes el coste de un procesado “normal” dentro de DataFlow de Google. Para ello hemos utilizado su calculadora oficial. Teniendo en cuenta que los pipelines correrán durante 60 horas al mes (2 al día). El coste sería de casi 15€/mensuales
Siempre tienes que evaluar la mayor cantidad de posibilidades que te ofrece tu proveedor cloud para reducir costes al máximo. Si en lugar de Dataflow quisieses usar Airflow porque ya hay cierto conocimiento en tu equipo, GCP tiene un recurso dedicado exclusivamente a Airflow, llamado Composer. Aquí tendríamos un ejemplo de una configuración de hardware muy básica.
El recurso es muy cómodo de trabajar, pero si queremos tener Airflow corriendo 24/7, los costes se disparan muchísimo. Se podría optimizar el encendido/apagado, pero ya ves que tener un servicio corriendo muchas horas no sale tan económico como recursos tipo Dataflow, los cuales se levantan únicamente cuando les toca.
Esto sería parte del coste total que pagarías al mes por todos los recursos cloud. Recuerda que hay que pagar el Storage, que el desarrollo también exige un tiempo de máquina activo, y que se no se han incluido las herramientas de explotación del dato, como sería en este caso Big Query y/o Looker.
El procesado de datos batch o por lotes en un Data Lake es la pieza angular de todo pipeline de datos. Escalabilidad, finalidad de los datos, formato de consumo, seguridad, madurez, disponibilidad y fiabilidad son factores determinantes en la elección de esta herramienta. Se necesita complementar con un orquestador, bien incluido en el propio procesador, o a través de otro recurso cloud. Evalúa bien tus opciones para optimizar los costes todo lo que puedas.
Pingback: We Learn Data