La tercera parte de mi serie en curso sobre la construcción de una disciplina de ciencia de datos en una startup. Puedes encontrar enlaces a todas las publicaciones en la introducción, y un libro basado en esta serie en Amazon.
La construcción de pipelines (tuberias) de datos es un componente básico de la ciencia de datos en una startup. Para poder construir productos basados en datos, es necesario ser capaz de recolectar puntos de datos de millones de usuarios y procesar los resultados casi en tiempo real. Mientras que mi anterior entrada en el blog hablaba de qué tipo de datos hay que recolectar y cómo enviar los datos a un endpoint de una API, esta entrada tratará de cómo procesar los datos que se han recolectado, permitiendo a los científicos de datos trabajar con los datos.
La próxima entrada del blog sobre la producción de modelos discutirá cómo desplegar modelos en esta plataforma de datos.
Típicamente, el destino de una tubería de datos es un lago de datos (data lake), como Hadoop o archivos de parquetes en S3, o una base de datos relacional, como Redshift. Un conducto de datos ideal debería tener las siguientes propiedades:
- Baja latencia de eventos: Los científicos de datos deberían ser capaces de consultar los datos de eventos recientes en la tubería, en cuestión de minutos o segundos después de que el evento sea enviado al punto final de recolección de datos. Esto es útil para fines de testing y para construir productos de datos que necesitan actualizarse casi en tiempo real.
- Escalabilidad: Una tubería de datos debería poder escalar a miles de millones de puntos de datos, y potencialmente a trillones a medida que el producto se va escalando. Un sistema de alto rendimiento no sólo debería poder almacenar estos datos, sino también poner a disposición el conjunto completo de datos para su consulta.
- Consulta interactiva: Un sistema de datos de alto rendimiento debería permitir tanto consultas por lotes de larga duración como consultas interactivas más pequeñas que permitan a los científicos de los datos explorar tablas y comprender el esquema sin tener que esperar minutos u horas al tomar muestras de los datos.
- Versiones: Debería ser capaz de hacer cambios en su tubería de datos y en las definiciones de los eventos sin que la tubería se caiga y se pierdan los datos. En este post se discutirá cómo construir una tubería que soporte con diferentes definiciones de eventos, en el caso de cambiar un esquema de eventos.
- Monitoreo: Si un evento ya no se recibe, o si ya no se reciben datos de seguimiento para una región en particular, entonces el conducto de datos debería generar alertas a través de herramientas como PagerDuty.
- Testing: Debería poder probar su tubería de datos con eventos de prueba que no terminen en su lago de datos o base de datos, pero que sí prueben los componentes en la tubería.
Hay una serie de otras propiedades útiles que un conducto de datos debe tener, pero este es un buen punto de partida para una startup. A medida que comience a construir componentes adicionales que dependen de su tubería de datos, querrá configurar herramientas para la tolerancia a las fallas y la automatización de tareas.
Este artículo mostrará cómo configurar un conducto de datos escalable que envíe datos de seguimiento a un lago de datos, una base de datos y un servicio de suscripción para su uso en productos de datos. Discutiré los diferentes tipos de datos en un conducto, la evolución de los conductos de datos, y recorreré un ejemplo de conducto implementado en GCP con PubSub, DataFlow y BigQuery.
Antes de desplegar una tubería de datos, querrá responder a las siguientes preguntas, que se asemejan a nuestras preguntas sobre las especificaciones de rastreo o tracking:
- ¿Quién es el propietario del conducto de datos?
- ¿Qué equipos consumirán los datos?
- ¿Quién controlará la tubería?
En una organización pequeña, un científico de datos puede ser el responsable del conducto, mientras que las organizaciones más grandes suelen tener un equipo de infraestructura que se encarga de mantener el conducto en funcionamiento.
También es útil saber qué equipos consumirán los datos, de modo que se puedan transmitir los datos a los equipos apropiados. Por ejemplo, es posible que el departamento de marketing necesite datos en tiempo real de las visitas a una landing page para realizar la atribución de las campañas de marketing.
Y, por último, la calidad de los datos de los eventos pasados al conducto debe ser inspeccionada minuciosamente de manera regular.
A veces, la actualización de un producto hará que un evento de tracking deje caer datos relevantes, por lo que se debe establecer un proceso para capturar estos tipos de cambios en los datos.
Tipos de datos
Los datos en una tuberia suelen denominarse con diferentes nombres en función de la cantidad de modificación que se haya realizado. Los datos se clasifican típicamente con las siguientes etiquetas:
- Datos en bruto (Raw data): Es el seguimiento de datos sin procesamiento aplicado. Son datos almacenados en el formato de codificación de mensajes utilizado para enviar eventos de rastreo, como JSON. Los datos brutos no tienen todavía un esquema aplicado. Es común enviar todos los eventos de rastreo como eventos sin procesar, porque todos los eventos pueden ser enviados a un solo endpoint y los esquemas pueden ser aplicados más tarde en la tubería.
- Datos procesados (Proceseed Data): Los datos procesados son datos sin procesar que han sido decodificados en formatos específicos de eventos, con un esquema aplicado. Por ejemplo, los eventos de seguimiento JSON que se han traducido en eventos de inicio de sesión con un esquema fijo se consideran datos procesados. Los eventos procesados suelen almacenarse en diferentes tablas de eventos/destinos en un conducto de datos.
- Datos cocinados (Cooked Data): Los datos procesados que han sido agregados o resumidos se denominan datos cocinados. Por ejemplo, los datos procesados podrían incluir eventos de inicio y fin de sesión y utilizarse como entrada de datos cocinados que resumen la actividad diaria de un usuario, como el número de sesiones y el tiempo total de permanencia en el sitio para una página web.
Los científicos de los datos trabajarán normalmente con datos procesados y utilizarán herramientas para crear datos cocinados para otros equipos.
En este post se discutirá cómo construir un pipeline de datos que produzca datos procesados, mientras que en el post de Inteligencia de Negocios se discutirá cómo agregar datos cocinados a su pipeline.
La evolución de los data pipelines
En las últimas dos décadas el paisaje para la recolección y análisis de datos ha cambiado significativamente. En lugar de almacenar datos localmente a través de archivos de registro, los sistemas modernos pueden rastrear la actividad y aplicar machine learning casi en tiempo real.
Las startups podrían querer utilizar uno de los enfoques anteriores para los testing iniciales, pero realmente deberían buscar enfoques más recientes para construir tuberías de datos.
Basándome en mi experiencia, he observado cuatro enfoques diferentes para las tuberías:
- La era de archivo plano: Los datos se guardan localmente en servidores
- La era la base de datos: Los datos se ponen en escena en archivos planos y luego se cargan en una base de datos
- La era del Data Lake: Los datos se almacenan en Hadoop/S3 y luego se cargan en un DB
- La era sin servidores (Serverless): Los servicios administrados se utilizan para el almacenamiento y la consulta
Cada uno de los pasos de esta evolución apoya la recopilación de conjuntos de datos más grandes, pero puede introducir una complejidad operacional adicional.
Para una startup, el objetivo es ser capaz de escalar la recolección de datos sin escalar los recursos operacionales, y la progresión hacia los servicios administrados proporciona una buena solución para el crecimiento.
La tubería de datos por la que caminaremos en la siguiente sección de este post se basa en la era más reciente de tuberías de datos, pero es útil caminar a través de diferentes enfoques porque los requisitos para diferentes empresas pueden encajar mejor con diferentes arquitecturas.
La era de los archivos planos
Components in a pre-database Analytics Architecture
Nota: Hablaremos sobre "Game" servers debido a que el autor trabaja en Zynga
Me inicié en la ciencia de los datos en Electronic Arts en 2010, antes de que EA tuviera una organización construida alrededor de los datos. Mientras que muchas compañías de juegos ya estaban recolectando cantidades masivas de datos sobre la jugabilidad, la mayoría de la telemetría se almacenaba en forma de archivos de registro u otros formatos de archivos planos que se almacenaban localmente en los servidores.
Nada podía ser consultado directamente, y calcular las métricas básicas como los usuarios activos mensuales (MAU) requería un esfuerzo considerable.
En Electronic Arts, se incorporó un feature de "replay" en el Madden NFL 11 que proporcionó una fuente inesperada de telemetría del juego.
Después de cada juego, se enviaba un resumen del mismo en formato XML a un servidor de juegos que enumeraba cada jugada llamada, los movimientos realizados durante el juego y el resultado de la caída.
Esto resultó en millones de archivos que podían ser analizados para aprender más sobre cómo los jugadores interactuaban con el videojuego de fútbol de Madden en la vida real.
Almacenar los datos localmente es, con mucho, el enfoque más fácil de tomar cuando se recogen datos de juego.
Por ejemplo, el enfoque PHP presentado en el último post es útil para establecer un endpoint de análisis ligero. Pero este enfoque tiene inconvenientes significativos.
Este enfoque es simple y permite a los equipos guardar los datos en cualquier formato que se necesite, pero no tiene tolerancia a fallos, no almacena los datos en una ubicación central, tiene una latencia significativa en la disponibilidad de los datos, y tiene herramientas estándar para construir un ecosistema para el análisis.
Los archivos planos pueden funcionar bien si sólo tienes unos pocos servidores, pero no es realmente una tubería de análisis a menos que muevas los archivos a una ubicación central.
Puedes escribir scripts para llevar los datos de los servidores de registro a una ubicación central, pero generalmente no es un enfoque escalable.
La era de las bases de datos
Componentes de una arquitectura analítica basada en ETL
Mientras estaba en Sony Online Entertainment, teníamos servidores de juegos que guardaban archivos de eventos en un servidor de archivos central cada dos minutos.
El servidor de archivos luego ejecutaba un proceso ETL una vez por hora que cargaba rápidamente estos archivos de eventos en nuestra base de datos de análisis, que era Vertica en ese momento.
Este proceso tenía una latencia razonable, alrededor de una hora desde que un cliente de un videojuego enviaba un evento a los datos que se podían consultar en nuestra base de datos analítica.
También se escaló a un gran volumen de datos, pero requirió el uso de un esquema fijo para los datos de evento.
Cuando era empleado en Twitch, usábamos un proceso similar para una de nuestras bases de datos analíticas.
La principal diferencia con el enfoque de Sony era que en lugar de tener los archivos scp de los servidores de juegos en una ubicación central, usábamos Amazon Kinesis para transmitir eventos de los servidores a un área de montaje en el S3.
Luego usamos un proceso ETL para cargar rápidamente los datos en Redshift para su análisis. Desde entonces, Twitch ha cambiado a un enfoque de lago de datos, con el fin de escalar a un mayor volumen de datos y proporcionar más opciones para la consulta de los conjuntos de datos.
Las bases de datos utilizadas en Sony y Twitch eran inmensamente valiosas para ambas compañías, pero nos encontramos con desafíos a medida que escalábamos la cantidad de datos almacenados.
A medida que recogíamos información más detallada sobre el juego, ya no podíamos mantener un historial completo de eventos en nuestras tablas y necesitábamos truncar los datos más antiguos de unos pocos meses.
Esto está bien si se pueden crear tablas de resumen que mantengan los detalles más importantes sobre estos eventos, pero no es una situación ideal.
Uno de los problemas de este enfoque es que el servidor staging se convierte en un punto central de fracaso. También es posible que surjan cuellos de botella cuando un juego envía demasiados eventos, haciendo que los eventos se eliminen en todos los títulos.
Otro problema es el rendimiento de las consultas al aumentar el número de analistas que trabajan con la base de datos. Un equipo de unos pocos analistas que trabajen con unos pocos meses de datos de juego puede funcionar bien, pero después de recopilar años de datos y aumentar el número de analistas, el rendimiento de las consultas puede ser un problema importante, lo que hace que algunas consultas tarden horas en completarse.
Los principales beneficios de este enfoque son que todos los datos de los eventos están disponibles en un solo lugar que puede ser consultado con SQL y que se dispone de grandes herramientas, como Tableau y DataGrip, para trabajar con bases de datos relacionales.
Las desventajas son que es costoso mantener todos los datos cargados en una base de datos como Vertica o Redshift, los eventos deben tener un esquema fijo, y puede ser necesario truncar las tablas para mantener el rendimiento de los servidores.
Otro problema de la utilización de una base de datos como interfaz principal para los datos es que las herramientas de machine learning, como MLlib de Spark, no pueden utilizarse eficazmente, ya que los datos pertinentes deben descargarse de la base de datos antes de que se puedan utilizar.
Una de las formas de superar esta limitación es almacenar los datos de juego en un formato y una capa de almacenamiento que funcionen bien con las herramientas de Big Data, como por ejemplo, guardar eventos como archivos de parquete en S3.
Este tipo de configuración se hizo más poblada en la siguiente era, y evita las limitaciones de tener que truncar las tablas y reduce el costo de mantener todos los datos.
La era del Data Lake
Components in a Data Lake Analytics Architecture
El patrón general es almacenar datos semiestructurados en una base de datos distribuida, y ejecutar procesos ETL para extraer los datos más relevantes a bases de datos analíticas.
Para la base de datos distribuida se pueden utilizar diferentes herramientas: en Electronic Arts usamos Hadoop, en Microsoft Studios usamos Cosmos, y en Twitch usamos S3.
Este enfoque permite a los equipos escalar a volúmenes masivos de datos, y proporciona una tolerancia adicional a las fallas.
El principal inconveniente es que introduce una complejidad adicional, y puede dar lugar a que los analistas tengan acceso a menos datos que si se utilizara un enfoque de base de datos tradicional, debido a la falta de herramientas o políticas de acceso.
La mayoría de los analistas interactuarán con los datos de la misma manera en este modelo, utilizando una base de datos analítica poblada de ETLs de lago de datos.
Una de las ventajas de este enfoque es que admite una variedad de esquemas de eventos diferentes, y puede cambiar los atributos de un evento sin afectar a la base de datos analítica.
Otra ventaja es que los equipos de análisis pueden utilizar herramientas como Spark SQL para trabajar directamente con el lago de datos.
Sin embargo, en la mayoría de los lugares en los que trabajé se restringió el acceso al lago de datos, eliminando muchos de los beneficios de este modelo.
Este enfoque se escala a una cantidad masiva de datos, soporta esquemas de eventos flexibles, y proporciona una buena solución para consultas por lotes de larga duración.
La desventaja es que puede implicar una sobrecarga operacional significativa, puede introducir grandes latencias de eventos, y puede carecer de herramientas maduras para los usuarios finales del lago de datos.
Un inconveniente adicional de este enfoque es que normalmente se necesita un equipo completo sólo para mantener el sistema operativo. Esto tiene sentido para las grandes organizaciones, pero puede ser exagerado para las empresas más pequeñas.
Una de las formas de aprovechar la utilización del lago de datos sin el costo de los gastos generales de funcionamiento es utilizar servicios gestionados.
Era sin servidores
Components in a managed Analytics Architecture (GCP)
En la era actual, las plataformas analíticas incorporan una serie de servicios gestionados, que permiten a los equipos trabajar con los datos casi en tiempo real, ampliar los sistemas según sea necesario y reducir los gastos de mantenimiento de los servidores.
Nunca experimenté esta era mientras trabajaba en la industria de los videojuegos, pero vi señales de que esta transición estaba ocurriendo.
Riot Games está usando Spark para los procesos de ETL y el machine learning, y necesitaba hacer girar la infraestructura según la demanda. Algunos equipos están usando métodos de computación elástica para los servicios de juegos, y tiene sentido utilizar este enfoque para el análisis también.
Este enfoque tiene muchos de los mismos beneficios que el uso de un lago de datos, auto-escalas basadas en las necesidades de consulta y almacenamiento, y tiene un mínimo de gastos operativos.
Las principales desventajas son que los servicios gestionados pueden ser costosos, y la adopción de este enfoque probablemente dará lugar a la utilización de herramientas específicas de la plataforma que no son portables a otros proveedores de nubes.
En mi carrera tuve el mayor éxito trabajando con el enfoque de la era de la base de datos, ya que proporcionaba al equipo de análisis acceso a todos los datos relevantes. Sin embargo, no fue una configuración que continuara escalando y la mayoría de los equipos en los que trabajé se han trasladado desde entonces a entornos de lago de datos.
Para que un entorno de lago de datos tenga éxito, los equipos de análisis necesitan acceso a los datos subyacentes, y herramientas maduras para apoyar sus procesos.
Para una startup, el enfoque sin servidores suele ser la mejor manera de empezar a construir un conducto de datos, porque puede escalarse para ajustarse a la demanda y requiere un mínimo de personal para mantener el conducto de datos.
En la siguiente post se explicará cómo construir un conducto de muestra con servicios gestionados.
Continua con la segunda parte de este post aqui.