Ir para o conteúdo

Apache Spark com MinIO e SQL Server

Sobre o trabalho

Este é o Trabalho 2 da disciplina de Arquitetura de Dados. O objetivo é construir um pipeline completo seguindo a arquitetura Medallion, utilizando Apache Spark (PySpark) para extração e transformação, SQL Server como banco fonte, MinIO como object storage compatível com S3 e Delta Lake como formato de tabela aberta com suporte a transações ACID.

Toda a infraestrutura sobe via Docker Compose — não é necessário instalar Java, Spark ou Python localmente.

Escopo

Este trabalho não implementa Apache Iceberg. A conversão para Iceberg é requisito exclusivo do Trabalho 1.


Stack utilizada

  •   SQL Server 2022


    Banco de dados fonte com 11 tabelas relacionais do domínio seguradora

  •   MinIO


    Object storage compatível com S3, hospedando os buckets landing-zone e bronze

  •   Apache Spark 3.5


    Engine de processamento distribuído, lê CSV e grava Delta no MinIO via S3A

  •   Delta Lake 3.2


    Open table format com ACID, Time Travel e DML nativo (INSERT/UPDATE/DELETE)

  •   Python + pyodbc + boto3


    Extração das tabelas do SQL Server e upload em CSV para o MinIO

  •   Docker Compose


    Orquestração dos containers SQL Server, MinIO e Jupyter Lab


Pipeline

graph LR
    A[(SQL Server<br/>seguradora)] -->|pyodbc + boto3| B[MinIO<br/>landing-zone<br/>CSV]
    B -->|Apache Spark 3.5| C[MinIO<br/>bronze<br/>Delta Lake]
    C -.->|ACID · Time Travel| D[INSERT · UPDATE · DELETE]

    style A fill:#cc2927,stroke:#7a1717,color:#fff
    style B fill:#c72e29,stroke:#7a1c19,color:#fff
    style C fill:#00add4,stroke:#005f74,color:#fff
    style D fill:#5e6ee4,stroke:#3a44a0,color:#fff
Camada Bucket Formato Descrição
Landing Zone landing-zone CSV Dados brutos extraídos do SQL Server
Bronze bronze Delta Lake Dados em formato transacional com DML nativo

Banco de dados — seguradora

O banco seguradora modela um sistema de seguro de automóveis com 11 tabelas relacionais.

erDiagram
    REGIAO ||--o{ ESTADO : tem
    ESTADO ||--o{ MUNICIPIO : possui
    MUNICIPIO ||--o{ ENDERECO : localiza
    ENDERECO ||--o{ CLIENTE : reside
    CLIENTE ||--o{ TELEFONE : tem
    CLIENTE ||--o{ APOLICE : possui
    APOLICE ||--o{ SINISTRO : gera
    APOLICE }o--|| CARRO : cobre
    MARCA ||--o{ MODELO : produz
    MODELO ||--o{ CARRO : define
Tabela Registros Descrição
regiao 5 Regiões do Brasil
estado 15 Estados brasileiros
municipio 10 Municípios
endereco 10 Endereços dos clientes
cliente 10 Clientes da seguradora
telefone 10 Telefones de contato
marca 8 Marcas de veículos
modelo 15 Modelos de veículos
carro 10 Veículos segurados
apolice 10 Apólices de seguro
sinistro 8 Sinistros registrados

Notebooks

A execução do pipeline é feita em quatro notebooks, executados em ordem:

  •   00 — Setup SQL Server


    Cria o banco seguradora, as 11 tabelas e importa os CSVs da pasta data/

    Detalhes

  •   01 — Extração para landing-zone


    Lê todas as tabelas via pyodbc e faz upload para o MinIO como CSV via boto3

    Detalhes

  •   02 — Bronze Delta


    Lê os CSVs com Spark e converte para Delta Lake no bucket bronze

    Detalhes

  •   03 — DML no Delta


    INSERT, UPDATE, DELETE e Time Travel sobre as tabelas Delta

    Detalhes


Referências