Construyendo una canalización de datos de transmisión de Formula 1 con Kafka y Risingwave

Construyendo canalización de datos de Fórmula 1 con Kafka y Risingwave

 

Los datos en tiempo real han llegado para quedarse. No hay duda de que cada día la cantidad de datos en streaming aumenta exponencialmente y necesitamos encontrar la mejor manera de extraer, procesar y visualizar esos datos. Por ejemplo, cada coche de Fórmula 1 produce alrededor de 1.5 terabytes de datos durante un fin de semana de carrera (fuente).

En este artículo, no vamos a transmitir los datos del coche, pero vamos a transmitir, procesar y visualizar los datos de la carrera simulando que estamos en vivo en una carrera de Fórmula 1. Antes de empezar, es importante mencionar que este artículo no se centrará en qué es cada tecnología, sino en cómo implementarlas en una tubería de datos en streaming, por lo que se espera tener ciertos conocimientos sobre Python, Kafka, SQL y visualización de datos.

 

Prerrequisitos

 

  • Fuente de datos de F1: Los datos de la Fórmula 1 utilizados en esta tubería de datos en streaming se descargaron de Kaggle y se pueden encontrar como Campeonato Mundial de Fórmula 1 (1950 – 2023).
  • Python: Se utilizó Python 3.9 para construir esta tubería, pero cualquier versión superior a 3.0 debería funcionar. Más detalles sobre cómo descargar e instalar Python se pueden encontrar en el sitio web oficial de Python.
  • Kafka: Kafka es una de las principales tecnologías utilizadas en esta tubería de datos en streaming, por lo que es importante tenerlo instalado antes de comenzar. Esta tubería de datos en streaming se construyó en MacOS, por lo que se utilizó brew para instalar Kafka. Se pueden encontrar más detalles en el sitio web oficial de brew. También necesitamos una biblioteca de Python para usar Kafka con Python. Esta tubería utiliza kafka-python. Los detalles de instalación se pueden encontrar en su sitio web oficial.
  • RisingWave (Base de datos en streaming): Hay varias bases de datos en streaming disponibles en el mercado, pero la que se utiliza en este artículo y una de las mejores es RisingWave. Comenzar con RisingWave es bastante sencillo y solo lleva unos minutos. Se puede encontrar un tutorial completo sobre cómo empezar en su sitio web oficial.
  • Panel de control de Grafana: Grafana se utilizó en esta tubería de datos en streaming para visualizar los datos de la Fórmula 1 en tiempo real. Los detalles sobre cómo empezar se pueden encontrar en este sitio web.

 

Transmitiendo los datos fuente

 

Ahora que tenemos todos los prerrequisitos, es hora de empezar a construir la tubería de datos en streaming de la Fórmula 1. Los datos fuente se almacenan en un archivo JSON, por lo que tenemos que extraerlos y enviarlos a través de un tema de Kafka. Para hacerlo, utilizaremos el siguiente script de Python.

Código por el autor

 

Configuración de Kafka

 

El script de Python para transmitir los datos está listo para empezar a transmitir los datos, pero el tema de Kafka F1Topic aún no se ha creado, así que vamos a crearlo. Primero, necesitamos inicializar Kafka. Para hacerlo, tenemos que iniciar Zookeeper, luego iniciar Kafka y finalmente crear el tema con los siguientes comandos. Recuerda que Zookeeper y Kafka deben estar en ejecución en una terminal aparte.

Código por el autor

 

 

Configuración de la base de datos en streaming RisingWave

 

Una vez instalado RisingWave, es muy fácil iniciarlo. Primero, necesitamos inicializar la base de datos y luego tenemos que conectarnos a ella a través de la terminal interactiva de Postgres psql. Para inicializar la base de datos en streaming RisingWave, tenemos que ejecutar el siguiente comando.

Código por el autor

El comando anterior pone en marcha RisingWave en modo de prueba, donde los datos se almacenan temporalmente en la memoria. El servicio está diseñado para finalizar automáticamente después de 30 minutos de inactividad y cualquier dato almacenado se eliminará al finalizar. Este método se recomienda solo para pruebas, RisingWave Cloud debe usarse para entornos de producción.

Después de que RisingWave esté en funcionamiento, es hora de conectarse a él en una nueva terminal a través de la terminal interactiva de Postgres con el siguiente comando.

Código por Autor

   

Con la conexión establecida, es hora de comenzar a extraer los datos del tema de Kafka. Para obtener los datos en tiempo real en RisingWave, necesitamos crear una fuente. Esta fuente establecerá la comunicación entre el tema de Kafka y RisingWave, así que ejecutemos el siguiente comando.

Código por Autor

   

Si el comando se ejecuta correctamente, veremos el mensaje “CREAR FUENTE” y la fuente se habrá creado. Es importante destacar que una vez creada la fuente, los datos no se ingieren automáticamente en RisingWave. Necesitamos crear una vista materializada para comenzar a mover los datos. Esta vista materializada también nos ayudará a crear el panel de control de Grafana en el siguiente paso.

Creemos la vista materializada con el mismo esquema que los datos de origen con el siguiente comando.

Código por Autor

   

Si el comando se ejecuta correctamente, veremos el mensaje “CREAR VISTA MATERIALIZADA” y la vista materializada se habrá creado, ¡y ahora es hora de probarla!

Ejecuta el script de Python para comenzar a transmitir los datos y en la terminal de RisingWave consulta los datos en tiempo real. RisingWave es una base de datos SQL compatible con Postgres, por lo que si estás familiarizado con PostgreSQL o cualquier otra base de datos SQL, todo fluirá sin problemas para consultar tus datos en tiempo real.

   

Como puedes ver, el flujo de datos en tiempo real ahora está en funcionamiento, pero no estamos aprovechando todas las ventajas de la base de datos en tiempo real RisingWave. Podemos agregar más tablas para unir datos en tiempo real y construir una aplicación completamente funcional.

Creemos la tabla de carreras para que podamos unir los datos en tiempo real con la tabla de carreras y obtener el nombre real de la carrera en lugar del ID de la carrera.

Código por Autor

   

Ahora, insertemos los datos para el ID de carrera específico que necesitamos.

Código por Autor

   

Sigamos el mismo procedimiento pero con la tabla de pilotos.

Código por Autor

   

Y finalmente, insertemos los datos de los pilotos.

Código por Autor

Tenemos las tablas listas para comenzar a unir los datos en tiempo real, pero necesitamos la vista materializada donde ocurrirá toda la magia. Creemos una vista materializada donde podamos ver las 3 posiciones principales en tiempo real, uniendo el ID del piloto y el ID de la carrera para obtener los nombres reales.

Código por Autor

Por último, pero no menos importante, creemos la última vista materializada para ver cuántas veces un piloto obtuvo la posición número uno durante toda la carrera.

Código por Autor

Y ahora, es hora de construir el panel de control de Grafana y ver todos los datos unidos en tiempo real gracias a las vistas materializadas.

 

Configuración del panel de control de Grafana

 

El último paso en esta canalización de datos en tiempo real es visualizar los datos en un panel de control en tiempo real. Antes de crear el panel de control de Grafana, necesitamos crear una fuente de datos para establecer la conexión entre Grafana y nuestra base de datos en tiempo real RisingWave siguiendo los siguientes pasos.

  • Ve a Configuración > Fuentes de datos.
  • Haz clic en el botón Agregar fuente de datos.
  • Selecciona PostgreSQL de la lista de bases de datos compatibles.
  • Rellena los campos de conexión de PostgreSQL de la siguiente manera:

   

Desplázate hacia abajo y haz clic en el botón de guardar y probar. La conexión a la base de datos ahora está establecida.

   

Ahora ve a los paneles en el panel izquierdo, haz clic en la opción de nuevo panel y añade un nuevo panel. Selecciona la visualización de tabla, cambia a la pestaña de código y consultemos la vista materializada live_positions en la que podemos ver los datos unidos de las 3 posiciones principales.

Código por el autor

   

Añadamos otro panel para visualizar la vuelta actual. Selecciona la visualización de indicador y en la pestaña de código consulta la vuelta máxima disponible en los datos en tiempo real. La personalización del indicador es a tu elección.

Código por el autor

   

Finalmente, añadamos otro panel para consultar la vista materializada times_in_position_one y ver en tiempo real cuántas veces un conductor obtuvo la posición número uno durante toda la carrera.

Código por el autor

 

 

Visualizando los Resultados

 

Finalmente, todos los componentes de la canalización de datos en tiempo real están en funcionamiento. El script de Python se ha ejecutado para comenzar a transmitir los datos a través del tema de Kafka, la base de datos en tiempo real RisingWave está leyendo, procesando y uniendo los datos en tiempo real. La vista materializada f1_lap_times lee los datos del tema de Kafka y cada panel en el tablero de Grafana es una vista materializada diferente que une datos en tiempo real para mostrar datos detallados gracias a las uniones realizadas por las vistas materializadas a las tablas de carreras y conductores. El tablero de Grafana consulta las vistas materializadas y todo el procesamiento se ha simplificado gracias a las vistas materializadas procesadas en la base de datos en tiempo real RisingWave.

   

  Javier Granados es un Ingeniero de Datos Senior a quien le gusta leer y escribir sobre canalizaciones de datos. Se especializa en canalizaciones en la nube, principalmente en AWS, pero siempre está explorando nuevas tecnologías y tendencias. Puedes encontrarlo en VoAGI en https://medium.com/@JavierGr