Obtener una solución óptima y rentable en el ámbito de la Ingeniería y Arquitectura de datos en la nube es un proceso que puede resultar complejo. En ixpantia consideramos que el éxito de una solución de este tipo se basa en asegurar procesos robustos de arquitectura, mediante una cultura sólida de experimentación, la adopción de prácticas DevOps y DataOps, la implementación de un sistema de monitoreo de métricas y la utilización de un lenguaje declarativo que facilite la gestión de la infraestructura como código, por ejemplo Terraform.
En nuestros proyectos de ciencia de datos, típicamente uno de los pasos iniciales consiste en idear una solución de arquitectura a alto nivel de acuerdo a las necesidades específicas del cliente.
Entre los factores a tomar en cuenta para la concepción inicial de la arquitectura, tenemos por ejemplo la fuente de los datos (si estos provienen desde dispositivos IoT, bases de datos transaccionales, lagos de datos, etc), cuál es el formato de estos datos (XML, json, csv, etc), la frecuencia de llegada de los datos, la plataforma en la nube elegida, los límites de presupuesto, los niveles necesarios de versionamiento de la data, así como las capacidades y el conocimiento de tecnologías y lenguajes por parte de los equipos de ciencia de datos de las empresas a las cuales acompañamos.
Teniendo en cuenta todos estos ingredientes, usualmente llegamos a proponer una arquitectura inicial para el problema en cuestión: una solución que comprende desde las tecnologías propuestas, las soluciones de monitoreo, el costo total aproximado, hasta la definición de acuerdos de servicio para la solución en conjunto con el cliente.
Es importante destacar que el proceso de implementación como tal, debe considerarse desde el inicio como una fase de continua adaptación y mejora. En este contexto, las soluciones de arquitectura e ingeniería de datos, aunque bien fundamentadas y planificadas, pueden requerir ajustes durante la implementación para optimizar su desempeño. Esto se debe a la complejidad inherente de estos sistemas y a factores imprevistos como picos inesperados de carga en el movimiento de los datos, llegada de archivos con formatos corruptos o inesperados, cambios en el entorno tecnológico o en el presupuesto disponible de las empresas, entre otros.
En ixpantia, consideramos que traer la experimentación científica hacia estas disciplinas de carácter más ingenieril es vital para mantener ciclos de innovación de dataductos óptimos, bajos en costo y efectivos. El flujo utilizado lo visualizamos a alto nivel en la siguiente figura:
Figura 1. Flujo durante el desarrollo e implementación de nuestras soluciones de Ingeniería y Arquitectura de datos
Al hablar de acordar, nos referimos a crear los acuerdos de servicio que plasmen las necesidades y los objetivos que debe cumplir nuestra arquitectura. Hacer esto requiere una serie de reuniones con el cliente para poder realizar el inventario de necesidades de la empresa. Esta buena práctica está basada en la Ingeniería de Confiabilidad (SRE, por sus siglas en inglés Site Reliability Engineering). Bajo esta metodología traducimos los requerimientos del cliente en acuerdos de servicio con sus respectivos indicadores y objetivos, entendiendo que los mismos pueden ir evolucionando a lo largo del tiempo.
En cuanto a planear, esto significa procurar los recursos necesarios, tanto tecnológicos como humanos que necesitamos para cumplir el objetivo que tenemos dentro de las restricciones financieras definidas (presupuesto). En este paso, llegamos a una o varias propuestas iniciales, que presentamos al cliente. Nuestro rol acá es acompañarles a tomar una decisión informada a partir de una presentación concisa y completa de la(s) propuesta(s).
Seguidamente, tenemos el nivel de experimentación. Es en esta fase donde proponemos una serie de experimentos con distintas configuraciones para los diversos parámetros que componen nuestra solución. Estos parámetros pueden ser, por ejemplo, número de instancias a utilizar, capacidad de procesamiento requerida (RAM), cantidad de operaciones necesarias en las bases de datos, entre otros.
Por último, llegamos a la fase de evaluación. En este punto recolectamos las métricas de los experimentos realizados, con el fin de determinar y/o proyectar cuáles son las configuraciones más adecuadas para los parámetros que componen nuestra solución, y a la vez, detectar oportunidades de mejoras tanto en desempeño como en costos.
Las principales características que hemos definido para los experimentos que realizamos son los siguientes:
A más alto nivel, dentro de la experimentación en ingeniería y arquitectura de datos es importante mencionar también los siguientes conceptos en los que basamos la metodología utilizada: DevOps y DataOps, Infraestructura como código, y Monitoreo.
DevOps y DataOps
Las metodologías DevOps y DataOps están siempre reflejadas en las prácticas que utilizamos para desarrollar nuestras experimentaciones. Algunos de los elementos que siempre deben tomarse en cuenta son los siguientes:
Buena parte de lo que necesitamos hacer al diseñar las soluciones finales específicas para un cliente, tendrá que ver con crear, dar de baja y experimentar con diferentes configuraciones o tipos de recursos. Tomemos, por ejemplo, la necesidad de serializar datos provenientes de un sensor en una solución típica del internet de las cosas (IoT). Esto requiere desarrollar un código, posiblemente en Python, R u otro lenguaje, que permita serializar tipos de archivos como XML o JSON.
Sin embargo, la elección de la tecnología para ejecutar este código constituye una decisión distinta. Podríamos optar por considerar una tecnología serverless, como un Function App en Azure, que vincule la recepción de un archivo a un emisor de eventos para gestionar en tiempo real la cola de archivos. Esta opción podría ser especialmente eficiente para ciertos escenarios. Alternativamente, podría ser adecuado ejecutar el código en una Máquina Virtual en la nube, que procese los datos después de leerlos desde una cuenta de almacenamiento. La elección entre estas tecnologías depende de varios factores, y a menudo será necesario experimentar también distintos enfoques para identificar las soluciones más viables y rentables de acuerdo a las necesidades específicas que se tengan.
Uno de los problemas que puede surgir acá, es que crear y eliminar recursos manualmente puede ser un proceso engorroso y laborioso, involucrando numerosos "clicks" en los portales de las plataformas en la nube, lo que no sólo es tedioso, sino que también limita la trazabilidad de las pruebas. La práctica recomendada es gestionar el código que define la infraestructura como código (IaC) en repositorios separados. Esto reduce significativamente el tiempo en los ciclos de experimentación, optimizando así el proceso de desarrollo.
Para el manejo de la infraestructura como código (IaC), hemos encontrado que Terraform es una herramienta sumamente versátil que nos permite entre otras cosas:
En este contexto, una parte imprescindible de un flujo de trabajo basado en la experimentación es el monitoreo (incluido en la fase de Evaluación), pues es la manera en la cual comprobamos nuestras hipótesis, proponemos nuevos experimentos o detectamos puntos de mejora.En cuanto a qué herramientas podemos utilizar para monitorear, dependerá evidentemente de la plataforma de nube en la que estemos trabajando.
Por ejemplo, en Azure contamos con Log Analytics y Application Insights, ambas herramientas capaces de monitorear de manera granular prácticamente cualquier recurso. No obstante, si se utilizan, es altamente aconsejable probarlas en ambientes muy controlados para evitar costos inesperados.
Otra herramienta muy útil en Azure es el Azure Monitor, que nos puede brindar información detallada sobre métricas clave, como por ejemplo el uso de CPU, errores HTTP 404, volumen de archivos recibidos y estadísticas de entrada y salida de datos. Además, Azure Monitor facilita el seguimiento de operaciones de entrada/salida, tanto de escritura como de lectura, entre otros aspectos cruciales para la gestión y optimización del rendimiento de los sistemas.
Como bonus, algunos recursos en Azure cuentan con una sección sobre “Diagnosticar y Resolver Problemas”, que es capaz de brindarnos mucha información no solo sobre potenciales problemas durante el despliegue de las aplicaciones o recursos, si no también acerca del número de ejecuciones, errores, entre otros de acuerdo al recurso monitoreado.
En otras plataformas como GCP y AWS, existen también herramientas específicas para monitorear y evaluar de manera granular el desempeño de nuestros recursos en la nube. En GCP, Cloud Logging y Cloud Monitoring son herramientas esenciales que permiten la recolección y visualización de métricas, logs y eventos en tiempo real, ayudando a resolver e identificar problemas de rendimiento y errores. Por otro lado, en AWS, Cloudwatch es la herramienta principal para monitoreo, ofreciendo capacidades de recopilación de datos y logs, métricas detalladas y alarmas configurables para detectar y evaluar los sistemas de manera proactiva.
En ixpantia, consideramos que la experimentación es un proceso esencial en todas las etapas de desarrollo de las soluciones de ingeniería y arquitectura de datos, desde la concepción, puesta en marcha así como en su tuneo y optimización. Reconocemos que dar este paso puede resultar difícil para muchas empresas, lo que a menudo limita su capacidad para aprovechar al máximo las ventajas de las tecnologías en la nube y desarrollar soluciones cada vez más eficientes y rentables. Sin embargo, creemos firmemente que es un objetivo alcanzable mediante la colaboración y alineación de equipos, la promoción de una cultura de control de versiones y documentación constante, la adopción de la infraestructura como código y el monitoreo constante de los recursos con las tecnologías adecuadas y en ambientes controlados.