Este proyecto tiene como objetivo recolectar, procesar y analizar datos financieros en tiempo real utilizando la API de Binance a través de WebSockets. La arquitectura del proyecto se basa en la recolección de datos en Golang, transmisión a través de Apache Kafka, procesamiento en tiempo real con Apache Spark Streaming, almacenamiento en ScyllaDB, y visualización mediante Apache Superset. Todos los servicios se gestionan y ejecutan en contenedores Docker para facilitar la implementación y escalabilidad.
-
Data Source (Binance): La fuente de datos proviene de Binance, y se accede mediante WebSockets, o atraves de Endpoints que proporciona.
-
Recolector de Datos (Golang): Utilice Go para consumir datos de la API de Binance a traves de WebSockets. Este componente es responsable de la recoleccion de datos en tiempo real desde diferentes topics.
-
Transmision de datos (Apache Kafka): Actúa como un broker de mensajes para la transmisión de datos en tiempo real entre los diferentes componentes del sistema. Los datos recolectados se envían a Kafka y se consumen según sea necesario.
-
ZooKeeper: Se utiliza como coordinador y gestor de configuraciones para mantener la sincronización y el estado entre los nodos en el clúster de Kafka.
-
Procesamiento en tiempo real (Apache Spark Streaming): Spark se encarga de consumir datos desde los topics de Kafka y realizar analisis en tiempo real. Pueden aplicarse transformaciones, agregaciones y logica de procesamiento segun los requerimientos de cada topic.
-
Spark Streaming Cluster:
-
Driver Program (SparkContext): Inicia la aplicación Spark y coordina la ejecución en el clúster.
-
Cluster Manager (Master): Gestiona los recursos en el clúster Spark y distribuye tareas a los nodos de trabajo.
-
Executor (Worker): Nodos de trabajo que ejecutan tareas Spark en paralelo.
-
-
Almacenamiento de Datos (ScyllaDB): ScyllaDB actúa como la base de datos de almacenamiento persistente para los datos procesados. Proporciona escalabilidad y rendimiento para manejar grandes volúmenes de datos relacionados con el mercado financiero.
-
Motor de Consulta con Presto:
- Presto Coordinator: Coordina y gestiona las consultas en el cluster.
- Presto Worker: Ejecuta tareas de consulta en el cluster.
- Results Query: Almacena temporalmente los resultados de las consultas.
- Connector ScyllaDB: Permite a Presto conectarse y consultar ScyllaDB.
-
Visualizacion de Datos (Apache Superset): Utilice Apache Superset para visualizar los datos almacenados en ScyllaDB, proporcionando paneles interactivos y dashboards para el analisis y la toma de decisiones.
- Client: Interfaz de usuario para construir dashboards y visualizaciones.
- Redis: Sistema de almacenamiento en caché para mejorar el rendimiento.
- Metadata DB (PostgreSQL): Base de datos para almacenar metadatos de dashboards y gráficos.
- Connector Presto: Permite a Superset conectarse y ejecutar consultas en Presto.
-
Orquestacion de Contenedores (Docker): Todos los servicios se gestionan y ejecutan en contenedores Docker, lo que simplifica la implementacion, la gestion de dependencias y la escalabilidad de la infraestructura.
Ejecuta el siguiente script para levantar todos los servicios en contenedores Docker:
setup-all.sh
Este script también proporcionará la IP de Presto para su configuración en Superset.
Despues de levantar los contenedores, ingresa al contenedor de ScyllaDB y ejecuta el script setup-cassandra.sh
:
docker exec -it scylladb bash #Una vez dentro del contenedor
cd docker-entrypoint-initdb.d/
bash setup-cassandra.sh #Este script creara las tablas
- Una vez que se ejecuta los contenedores y esta todo ok. Accede a http://localhost:8088/superset/welcome/
- Coloca las credenciales. En este caso el usuario es admin, y la contraseña es admin.
- Dirigite a "Data" -> "Databases Connections" en el menu de Superset
- Haz click en el boton "Create" para agregar una nueva base de datos
- Completa los detalles, y en la seccion "SQLALCHEMY URI", ingresa la URL de conexion a Presto:
presto://172.19.0.3:8085/scylladb
!Acordate de poner la IP que se imprime cuando se ejecuta el script setup-all.sh
- Despues de la configuracion, movete al directorio
cmd
, donde se encuentra el archivomain.go
, que comienza a recolectar los datos y enviarlos al topic.
cd cmd
go run main.go
- Primero accede a http://localhost:8080 en tu navegador.
- Copia la IP de Spark Master que se muestra en la interfaz web, es la que dice
URL
. - Luego, entra al contenedor
fintechstream-spark-master-1
y cambia al directorio principal:
docker exec -it fintechstream-spark-master-1 bash
cd ..
- Ejecuta el siguiente comando para enviar el job al cluster de Spark, reemplazando
IP_de_Spark_Master
con la IP que copiaste anteriormente:
spark-submit --master spark://IP_de_Spark_Master:7077 --packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.1.3,com.datastax.spark:spark-cassandra-connector_2.12:3.0.0 data_pipeline/scripts/spark_kafka_connection.py
-
Descripción: Este análisis examina la evolución de las máximas ofertas de compra (best_bid_price) y de venta (best_ask_price) para diferentes símbolos, como BTCUSDT y ETHUSDT, a lo largo del tiempo, según los datos del libro de órdenes de Binance.
-
Visualización: El gráfico "Evolución de Máximas Ofertas de Compra y Venta por Símbolo" ilustra cómo han variado las ofertas de compra y venta para los símbolos seleccionados en cada actualización de datos.
-
Descripción: El análisis de los "Datos de Transacciones" (Binance Ticker Data) se centra en el número total de operaciones (total_number_of_trades) para los pares de criptomonedas BTCUSDT y ETHUSDT a lo largo del tiempo.
-
Visualización: Este gráfico de barras representa el número total de operaciones (total_number_of_trades) para los pares de criptomonedas BTCUSDT y ETHUSDT a lo largo del tiempo, según los datos de transacciones de Binance.