Exportar datos de Mixpanel para tu analista de datos
Cómo implementar una solución de bajo coste para mantener tus datos Mixpanel disponibles para consultas
¿Cuál es la motivación?
En TheVentureCity apoyamos a nuestras startups durante nuestro programa de aceleración con el objetivo de ayudarlas a crecer más rápido y con este fin, el equipo de “laboratorio” ayuda a las startups en tres áreas de especialidad distintas: Producto, Crecimiento e Ingeniería.
Nuestro enfoque para ayudar a las startups está muy centrado en los datos y nuestro equipo de crecimiento se basa en ciencia de los datos para extraer conocimientos y probar las hipótesis con los datos recopilados por la startup.
La mayoría de startups ya están recopilando datos en sus propias bases de datos “backend”, pero esto normalmente es solo una visión parcial de la interacción entre los usuarios y la aplicación, ya que las bases de datos generalmente almacenan solo el último estado y a lo mucho un historial de transacciones, todas las otras interacciones como pueden ser visitas, vistas de contenido, búsquedas y todos los cambios de estado que sucedieron antes del último valor registrado normalmente no se guardan en la base de datos principal y solo se ven en el “front-end” (aplicación móvil o web).
Sin embargo, es muy probable que estos datos ya están siendo recopilados por herramientas de análisis populares como Mixpanel, Amplitude, etc. Estos servicios tienden a almacenar los datos fuente en sus bases de datos y solo los hacen disponibles de forma agregada a través de sus herramientas de visualización, que frecuentemente no son suficientes para los analistas de datos… Necesitan los datos sin agregar, a nivel de evento: cada visualización de pantalla, cada cambio de estado, cada “click”, etc.
¿Cuál es el problema?
Una de las herramientas más populares entre las startups es Mixpanel. Esta herramienta te ayuda a analizar y realizar un seguimiento del comportamiento de los usuarios cuando interactúan con tu aplicación y también ofrece herramientas de campañas de comunicación automatizadas por medio de notificaciones Push o e-mail.
Cuando tu aplicación móvil o web se haya integrado con el SDK de Mixpanel y hayas realizado las tareas para instrumentar (codificar) los eventos y propiedades interesantes a las que quieras realizar un seguimiento, la herramienta te proporcionará un conjunto de herramientas de visualización para que puedas analizar todo tipo de estadísticas acerca de la adquisición, participación, retención, uso, etc. Sin embargo, todos los datos que estás recolectando se almacenan en los servidores de MixPanel y no puedes realizar fácilmente consultas personalizadas ni combinar los datos con los tuyos para realizar análisis más complejos y extraer conocimientos aplicables.
Los analistas de datos quieren usar sus scripts Python o R directamente en los eventos sin procesar de Mixpanel, pero esto no es posible a menos que se exporten los datos de MixPanel de forma automatizada, se guarde en un almacenamiento escalable y asequible (como AWS S3) y sea disponible para búsquedas SQL (como Amazon Redshift).
Este problema se puede resolver usando herramientas existentes especializadas en ETL (también conocidas como integración de datos). Estas se clasifican en dos categorías:
- Herramientas “Software as a Service” que conllevan un coste mensual o anual
- Software Open Source que instalas y debes operar
Las primeras serán más fáciles de implementar, pero añadirán un coste extra a tu presupuesto mensual encima del coste de tu base de datos AWS Redshift o similar.
Las segundas requieren que aprendas, configures y dediques tiempo e infraestructura a la herramienta añadiendo otras instancias EC2 a tu factura AWS.
La solución
Al tratarse de una startup con un equipo reducido e intentando gastar lo menos posible, tenemos que encontrar una solución que cumpla con los siguientes criterios:
- Extraer periódicamente los datos de eventos con la API de exportación de MixPanel, sin agregar una instancia EC2 o cualquier requerimiento de almacenamiento intermedio.
- Almacenar los datos de eventos sin procesar en un Amazon S3 bucket (nuestro “data lake”).
- (Opcionalmente) Permitir que estos datos estén disponibles para búsquedas SQL a través de Amazon Redshift.
¡Vamos a ello!
Requisitos antes de empezar
- Acceso a tu cuenta AWS a través de la consola web.
- Acceso a tu cuenta Mixpanel API secret
- Acceso a un S3 Bucket que quieras usar para almacenar los eventos exportados de Mixpanel con una llave y secreto IAM que permita leer/modificar el S3 bucket.
- Acceso a AWS ECS para establecer un programa automático del script ETL.
- (Opcional): Deberás acceder a AWS Glue y una base de datos AWS Redshift si quieres realizar búsquedas directamente con SQL.
Script ETL
En TheVentureCity hemos creado un script Python 3 simple, mixpanel-to-s3.py que puedes ejecutar diariamente o realizar la primera extracción manualmente.
Tiene muy pocas dependencias y se puede ejecutar de forma aislada o dentro de un contenedor Docker. De este modo no necesita tener un almacenamiento permanente para guardar el estado o previamente procesar datos antes de subirlos a AWS S3.
Encontrarás el repositorio de GitHub aquí: https://github.com/theventurecity/mixpanel-to-s3
Clona el repositorio a tu ordenador y sigue las instrucciones en el archivo README para usarlo y probarlo.
Deberás establecer tus propios valores en las Variables de Entorno obligatorios para el script:
- S3_BUCKET: el nombre del bucket S3 para cargar los datos de Mixpanel
- S3_PATH: un prefijo en el S3 Bucket donde puedes almacenar los datos, en caso de que el bucket se use para otros fines.
- AWS_REGION: la región AWS donde se encuentra tu S3 bucket.
- AWS_ACCESS_KEY_ID: una cuenta IAM con Access Key ID que tiene permiso para realizar cambios en el S3_BUCKET
- AWS_SECRET_ACCESS_KEY: correspondiente a la cuenta IAM con el Secret Access Key
- MIXPANEL_API_SECRET: la clave secreta de API de tu Proyecto Mixpanel
- START_DATE: (Opcional) una fecha en el pasado desde la que empezar a recuperar datos. Si no se especifica, el script solo buscará datos de 1 día de forma predeterminada con un retraso de 5 días desde la fecha actual. (los eventos Mixpanel pueden ponerse en cola en la aplicación hasta 5 días antes de ser enviados a los servidores de Mixpanel, así que es mejor exportar con un retraso de cinco días)
Si todo va bien, verás algo parecido a esto en tu bucket S3:
El script creará un archivo por cada día con un nombre parecido a este: rawEvents_YYYY-MM-DD.json.gz. Cada archivo estará bajo una carpeta con una jerarquía parecida a esta: S3_BUCKET/S3_PATH/mixpanel/events/year=YYYY/month=MM/day=DD
Esta estructura es conveniente cuando realices búsquedas en estos datos con AWS Redshift. Los nombres de las carpetas year=YYYY/month=MM/day=DD son usados para indicar que los datos están organizados en particiones y puedas usar el año, mes y día en tus búsquedas como si fueran columnas de una tabla.
Ejecutar el script ETL de forma programada
Ahora que ya hemos probado y sabemos que el script funciona, tenemos que ejecutarlo una vez al día, para hacerlo podemos usar el servicio ECS de Amazon (Servicio de contenedores EC2), que te permite ejecutar cualquier imagen Docker (contenedor) en un horario programado al estilo crontab.
- Deberás crear un repositorio Docker privado en el repositorio de contenedores (ECR) de Amazon y guardar la imagen Docker mixpanel-to-s3 (que contiene nuestro script ETL). En la consola AWS, bajo ECR > Repositories > Tu-nombre-de-repositorio, verás un botón “View Push Commands”, donde verás los comandos para llevar a cabo esta acción.
- Cuando la imagen Docker esté en nuestro repositorio AWS ECR, deberás “Create new Task definition” (crear una definición de tarea). Antes de empezar, copia y pega el URI del repositorio del paso anterior, lo necesitarás para especificar qué imagen Docker ejecutará tu tarea. En este paso, puedes establecer las variables de entorno que quieras usar para ejecutar el script ETL.
- A continuación, crea un nuevo Cluster Amazon ECS, y elige la plantilla “Networking only” (patrocinado por AWS Fargate).
- Finalmente, ve a tu Amazon ECS > Clusters > Tu-nombre-de-cluster, crea una nueva “Scheduled Task” (tarea programada), selecciona la definición de la tarea que hayas establecido en el paso anterior y prográmala en formato crontab. Por ejemplo, para que se ejecute cada día a las 6:00h (UTC), puedes usar: cron(0 6 * * ? *)
En el último paso de más arriba, también puedes “Run new Task” (Ejecutar nueva tarea) manualmente si especificas la misma definición de tarea que hayas creado en el paso 2, para comprobar que el script se ejecuta correctamente. También verás un enlace a los registros AWS CloudWatch al lado de las tareas finalizadas para ver los errores y mensajes a consola del script.
En nuestra experiencia, ejecutar esta tarea en AWS ECS (Fargate) cuesta menos de 0.05 USD al mes para una cuenta que use un par de Gbytes al día.
Permitir que AWS Redshift realice búsquedas en los datos
Amazon ha lanzado una función de AWS Redshift, llamada “Spectrum” que permite realizar búsquedas en datos estructurados que estén almacenados en catálogos externos con SQL, como si fueran tablas normales. Esto soluciona el problema de tener que implementar un proceso complejo de ETL para cargar los datos S3 a Redshift.
Para permitir esta función, debes usar AWS Glue, que es una herramienta para realizar tareas ETL pero también es un catálogo de fuentes de datos y sus esquemas. Usaremos solo esta última función. Los pasos son los siguientes:
- En AWS Glue > Databases encontraras el botón “Add database” (Añadir base de datos), elige un nombre.
- En AWS Glue > Crawlers, tenemos que “Add Crawler” (Añadir Crawler). “Crawler” es un proceso que lee todos los archivos en un prefijo S3 e intenta inferir el esquema de datos (nombre de los campos, tipos, etc.). El Crawler creará la definición de tablas automáticamente en la base de datos AWS Glue que hemos creado en el paso anterior.
- Cuando crees o configures el Crawler, establece las opciones: “Database” al nombre que elegiste en el Paso 1, “Create a single schema for each S3 path” a false y finalmente “Include path” a s3://S3_BUCKET/S3_PATH/mixpanel/events (substituir S3_BUCKET y S3_PATH con los nombres que elegiste)
- Ejecuta Crawler manualmente y comprueba si hay Tablas nuevas definidas en AWS Glue > Tables, verás una única tabla llamada “events” y con un esquema similar a este:
Una vez realizado esto, el último paso será conectar AWS Redshift a este esquema de base de datos en AWS Glue. Para realizarlo, deberás acceder a AWS Redshift con una herramienta de búsquedas SQL, como SQLWorkbench/J.
Una vez conectado a tu base de datos AWS Redshift, ejecuta la siguiente SQL:
CREATE EXTERNAL SCHEMA mixpanel FROM DATA CATALOG DATABASE ‘<NOMBRE BASE DE DATOS GLUE>’ IAM_ROLE ‘<IAM ROLE URN CON ACCESO LECTURA AL S3 BUCKET>’ CREATE EXTERNAL DATABASE IF NOT EXISTS;
Solo tienes que hacer esto una vez, y después, Redshift creará el esquema “mixpanel” que puedas acceder y realizar búsquedas. Para más instrucciones detalladas, puedes seguir esta guía: https://docs.aws.amazon.com/redshift/latest/dg/c-using-spectrum.htm
Ahora deberías poder realizar búsquedas en los datos con SQL.
Ten en cuenta que puedes acceder a las propiedades del evento usando la forma properties.nombre_propiedad_del_evento y si el nombre tiene caracteres especiales, puedes usar las comillas, por ejemplo: properties.”$city”
Siguientes pasos
Ahora puedes realizar las búsquedas en los datos, puedes obtener más información en cómo extraer conocimientos escondidos en los datos.
Esperamos que está información te sea útil, haznos llegar tus comentarios o sugerencias.