Skip to content

Vinasque/framework-ce

Repository files navigation

Framework CE - Pipeline de Processamento de Dados Escalável

Framework para desenvolvimento de pipelines de processamento de dados utilizando técnicas de Computação Escalável.

Membros do Grupo

  • Guilherme Buss
  • Guilherme Carvalho
  • Gustavo Bianchi
  • João Gabriel Machado
  • Vinícius Nascimento

Dependências e Configuração

Bibliotecas Necessárias

Abaixo as bibliotecas em python para rodar o dashboard. O dashboard puxa os dados que são adicionados no SQlite (no Database.db)

  • SQLite3: Biblioteca de banco de dados embarcado (armazenamento eficiente em arquivo único)
  • Streamlit: Biblioteca utilizada para a criação do dashboard
  • pandas: Biblioteca para análise e manipulação de dados
  • plotly: Biblioteca para visualização de dados interativos

Instalação no Windows (MSYS2/bash)

pacman -S make
pacman -S mingw-w64-x86_64-sqlite3
pip install streamlit pandas plotly

Criando 'mock data'

Caso opte por gerar novamente os dados mock, basta executar os arquivos .py que estão dentro da pasta generator/. Atenção: certifique-se de executar os arquivos user_generator.py e flight_generator.py antes do orders_generator.py, já que as reservas devem ser de usuários e voos já criados.

cd generator/  # Entre na pasta generator
python3 user_generator.py
python3 flight_generator.py
python3 orders_generator.py

Compilação do Dashboard em Streamlit

python3 -m streamlit run main.py

Compilação e Execução do Código em C++

Usando o makeFile

make       # Compila o projeto (gera main.exe)
make clean # Remove arquivos temporários

Ou, dentro da pasta src, gerar o executável e rodá-lo.

g++ -std=c++17 main.cpp sqlite3.o -o exes/main
\exes\main.exe


GRPC - A2

Na solução inicial, a comunicação entre o simulador das fontes de dados e o pipeline ETL era feita por meio de arquivos intermediários (CSVs, Json, etc.), onde os dados eram gerados por scripts Python em arquivos CSV/JSON, que eram lidos e processados pelo ETL posteriormente. A abordagem limitava a execução a um único computador e introduzia latências relacionadas à escrita e leitura de disco, que é bem mais lenta que apenas passar os dados diretamente após serem "criados". Essa entregra permite que, através de um mecanismo de comunicação via gRPC, o que permite uma simulaçao de cargas reais distribuídas em rede de forma mais realista, facilita a expansão para o uso de múltiplas máquinas simultaneamente e menor latência, já que não depende mais da criação de arquivos no disco.

Pré-requisitos

  • gRPC e Protobuf: você deve ter o gRPC e o protoc (instalador do Protocol Buffers) disponíveis no seu sistema.
  • C++17: compilador compatível (gcc ou clang).
  • Python 3.8+: para o cliente e geração de stubs Python.

Instalação

Para rodar o código em uma máquina Windows, foi-se utilizado do WSL (Windows Subsystem for Linux), já que o gRPC em C++ depende de várias bibliotecas e ferramentas que possuem suporte limitado ou apresentam instabilidades no ambiente Windows tradicional.

1. Windows (via WSL)

Se você não estiver em Linux (se estiver, pode ignorar esse passo), instale o WSL e Ubuntu 22.04:

wsl --install
wsl --install -d Ubuntu-22.04

2. Dependências do Sistema e Protocol Buffers (protoc)

Após baixar o WSL, reinicie o seu PC e instale as dependências abaixo (já dentro do CMD do WSL, e não no CMD comum Windows):

# Dependências do Linux que serão necessárias para fazer o código rodar, como o sqlite, python, cmake, etc.
sudo apt update
sudo apt install -y \
  build-essential autoconf libtool pkg-config cmake git curl unzip \
  libgrpc++-dev libc-ares-dev libre2-dev libabsl-dev libabsl-synchronization-dev \
  libssl-dev sqlite3 libsqlite3-dev python3 python3-pip

# Protocol Buffers, usado para serializar dados, será utilizado no projeto
PROTOC_ZIP=protoc-21.12-linux-x86_64.zip
curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v21.12/$PROTOC_ZIP
sudo unzip -o $PROTOC_ZIP -d /usr/local bin/protoc
sudo unzip -o $PROTOC_ZIP -d /usr/local 'include/*'
rm -f $PROTOC_ZIP

3.1. gRPC em C++

git clone --recurse-submodules -b v1.56.0 https://github.com/grpc/grpc
cd grpc
mkdir -p cmake/build && cd cmake/build
cmake ../..
make -j$(nproc)
sudo make install
sudo ldconfig

3.2. gRPC em Python

sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 1
python -m venv ~/grpc-env
source ~/grpc-env/bin/activate
pip install grpcio grpcio-tools protobuf

Geração de Código & Build

Servidor C++ (stubs e compilação) e como Executar

Dentro da pasta do projeto, gere os exes através do make, que você deve rodar dentro da pasta src, que contem o Makefile, que contém instruções sobre como construir e compilar o projeto, onde o make automatiza o processo de compilação.

protoc --grpc_out=. --plugin=protoc-gen-grpc=$(which grpc_cpp_plugin) event.proto
protoc --cpp_out=. event.proto

cd .\src\
make        # gera executáveis em ./exes
./exes/server.exe
./exes/etl.exe

Cliente Python (stubs) e como Executar

Para rodar os clientes, o código dos clientes está disponível na pasta grpc, onde temos o código cliente.py, que gera os dados que serão enviados para o ETL pelo python e envia ao servidor em C++, que já foi aberto.

cd grpc
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. event.proto

# Execução dentro da pasta grpc
python grpc/cliente.py <num_eventos> <intervalo_ms>  # roda os clientes

Execução e Resultados

Ao rodar ambos os arquivos, você deve obter um resultado como esse, onde os terminais conseguem trocar mensagens:

image

Os resultados de forma mais detalhada estão disponíveis no relatório gRPC.pdf disponível neste repositório do GitHub.

Estrutura do Projeto

framework-ce/
├── dashboard/
│ ├── main.py              # Executável principal do dashboard
│ └── requirements.txt     # Bibliotecas necessárias
│
├── databases/
│ └── Database.db          # Banco SQLite principal
│
├── generator/             # Onde os dados eram gerados (antes de começarmos a usar gRPC)
│ ├── flights.csv
│ ├── orders.json
│ ├── users.csv
│ └── flight_generator.py
│ ...
│
├── grpc/
│ ├── pycache/ 
│ ├── client.py             # Cliente que envia eventos via gRPC
│ ├── event.proto           # Definição dos eventos (Protobuf)
│ ├── event_pb2.py          # Código gerado do .proto (Python)
│ ├── event_pb2_grpc.py     # Código gRPC gerado (Python)
│ ├── event.pb.cc           # Código gerado do .proto (C++)
│ ├── event.pb.h            
│ ├── event.pb.o            # Objeto compilado (C++)
│ ├── event.grpc.pb.cc      # Código gRPC gerado (C++)
│ ├── event.grpc.pb.h       
│ └── event.grpc.pb.o       # Objeto compilado (C++)
│
├── src/
│ ├── exes/                 # Executáveis gerados (ex: server.exe)
│ ├── dataAdder.cpp         # Componente auxiliar de dados
│ ├── database.h            # Definições do banco SQLite
│ ├── dataframe.hpp
│ ├── extractor.hpp
│ ├── handler.hpp
│ ├── json.hpp
│ ├── loader.hpp
│ ├── main.cpp              # Entrada principal
│ ├── main2.cpp             # Variante de execução (debug/teste)
│ ├── Makefile              # Script de build principal
│ ├── queue.hpp
│ ├── series.hpp
│ ├── server.cpp            # Servidor gRPC que recebe os eventos
│ ├── server.o              # Objeto compilado
│ ├── sqlite3.o             # Objeto SQLite
│ ├── test.cpp            
│ ├── threadPool.hpp        # Gerenciamento de threads
│ └── trigger.hpp           # Lógica de triggers/ativadores
│
├── tests/                  # Testes do projeto
│
├── README.md               # Este arquivo
├── gRPC.pdf                # Relatório da Entrega 1 da A2
└── Relatório.pdf           # Relatório final da A1

About

Criação de framework para desenvolver pipelines de processamento de dados utilizando os mecanismos apresentados durante as aulas de Computação Escalável.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages