{"id":32624591,"url":"https://github.com/vinitg96/elt-data-lakehouse","last_synced_at":"2026-04-12T08:41:05.493Z","repository":{"id":315842278,"uuid":"1061003037","full_name":"vinitg96/elt-data-lakehouse","owner":"vinitg96","description":"Data Lakehouse moderno com MinIO, DuckDB, dbt, metabase e airflow","archived":false,"fork":false,"pushed_at":"2025-11-03T23:25:54.000Z","size":13250,"stargazers_count":12,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-11-04T01:17:16.353Z","etag":null,"topics":["airflow","data-engineering","dbt","duckdb","lakehouse","metabase","minio","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vinitg96.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-21T03:18:24.000Z","updated_at":"2025-11-03T23:25:58.000Z","dependencies_parsed_at":"2025-10-24T03:34:38.287Z","dependency_job_id":null,"html_url":"https://github.com/vinitg96/elt-data-lakehouse","commit_stats":null,"previous_names":["vinitg96/elt-data-lakehouse"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/vinitg96/elt-data-lakehouse","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vinitg96%2Felt-data-lakehouse","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vinitg96%2Felt-data-lakehouse/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vinitg96%2Felt-data-lakehouse/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vinitg96%2Felt-data-lakehouse/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vinitg96","download_url":"https://codeload.github.com/vinitg96/elt-data-lakehouse/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vinitg96%2Felt-data-lakehouse/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31709294,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-12T06:22:27.080Z","status":"ssl_error","status_checked_at":"2026-04-12T06:21:52.710Z","response_time":58,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["airflow","data-engineering","dbt","duckdb","lakehouse","metabase","minio","python"],"created_at":"2025-10-30T20:02:34.935Z","updated_at":"2026-04-12T08:41:05.486Z","avatar_url":"https://github.com/vinitg96.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Data Lakehouse Moderno\n\n![arquitetura Local](https://cdn.jsdelivr.net/gh/vinitg96/elt-data-lakehouse@main/misc/arquitetura_local.drawio.png)\n\nEste projeto simula um ambiente moderno de Data Lakehouse em execução local, permitindo estudar conceitos de ingestão, transformação (dbt), orquestração (Airflow) e visualização (Metabase).\n\nA stack é ideal para cenários de dados estáticos (sem necessidade de ingestão incremental) ou para a criação de provas de conceito (POCs) voltadas à exploração e análise de dados, antes de uma eventual migração para a nuvem.\n\nO pipeline segue a abordagem ELT (Extract, Load, Transform), onde:\n1. Os dados são extraídos das fontes (ERP e CRM) em formato csv e carregados no Lake (armazenado no MinIO) via script Python;\n\n2. O DuckDB atua como data warehouse local, conectando-se diretamente aos arquivos no Lake para consulta e processamento;\n\n3. O dbt direciona as transformações, utilizando a engine do warehouse (DuckDB) para processar as queries SQL. As transformações seguem a arquitetura em camadas: Bronze → Silver → Gold, garantindo rastreabilidade, qualidade e organização dos dados.\n\n\n# Contexto\nA empresa de e-commerce tem como objetivo integrar dados provenientes de duas origens distintas (CRM e ERP) para construir uma visualização unificada que consolide informações comerciais e operacionais.\n\nO sistema CRM concentra os dados relacionados a clientes, produtos e vendas, refletindo as interações comerciais e o desempenho de vendas da empresa.\nJá o sistema ERP armazena informações cadastrais complementares sobre clientes (como data de nascimento e gênero), dados geográficos e a estrutura hierárquica de categorias e subcategorias de produtos, que servem como base para análises de portfólio e segmentação de mercado.\n\nEssa integração visa enriquecer as análises de desempenho e comportamento do cliente, possibilitando uma visão 360° do negócio e apoiando a tomada de decisão estratégica.\n\n# Arquitetura Local\n\n- **MinIO**: Camada de armazenamento de objetos, simulando um Data Lake.  \n\n- **DuckDB**: Atua como um Data Warehouse local sendo responsável por processar as consultas SQL.\n\n- **dbt**: Responsável por gerenciar a transformação dos dados seguindo a arquitetura medalhão ilustrada abaixo.  \n  - **Bronze**: dados brutos, sem alterações e sem inferência de tipos.  \n  - **Silver**: dados limpos e padronizados; valores inconsistentes corrigidos, datas e tipos ajustados, códigos e categorias normalizados.  \n  - **Gold**: dados agregados e refinados, voltados ao negócio. Modelos em star schema: 2 tabelas dimensões (clientes e produtos) e 1 fato (vendas).  \n\n ![arquitetura medalhão](https://cdn.jsdelivr.net/gh/vinitg96/elt-data-lakehouse@main/misc/lineage_models_dbt_otimizado.png)\n\n- **Metabase**: Ferramenta de self-service BI, possibilitando a exploração e visualização dos dados refinados.\n\n- **Airflow**: Gerencia a orquestração do pipeline.\n\n- **Docker**: Containeriza todos os serviços, garantindo reprodutibilidade, isolamento e fácil execução do ambiente.\n\n\n## Como executar  \n\n### Pré-requisitos  \n- [Docker](https://docs.docker.com/get-docker/)  \n- [Docker Compose](https://docs.docker.com/compose/install/) \n- [Astronomer CLI](https://www.astronomer.io/docs/astro/cli/install-cli) \n\n### Passos  \n1. Clone este repositório:\n\n   ```\n   git clone https://github.com/vinitg96/elt-data-lakehouse.git\n   cd elt-data-lakehouse\n   ```\n2. Suba os serviços do MinIO, Metabase e Postgres:\n    ```\n    make infra\n    ```\n3. Suba o airflow:\n    ```\n    make airflow\n    ````\n\n4. Acesse o Airflow em http://localhost:8080\n    - As DAGs **extract_load_minio** e **transformation_dbt** serão executadas automaticamente, com as dependências entre elas definidas pelo TriggerDagRunOperator.\n    - Aguarde a conclusão da DAG **transformation_dbt**. Ao final da execução, será gerado o arquivo **dw.duckdb** no diretório **./services/dbt_workflow/datawarehouse/.**\n    - Um detalhe interessante é que o pacote [Cosmos](https://github.com/astronomer/astronomer-cosmos) permite visualizar cada modelo SQL definido no dbt como uma task, conforme imagem abaixo.\n\n![Airflow_UP](https://cdn.jsdelivr.net/gh/vinitg96/elt-data-lakehouse@main/misc/airflow_up_video.gif)\n\n5. Acesse o Metabase em http://localhost:80 \n    - Na etapa 4 da criação do usuário (\"Adicione seus Dados\"), busque por DuckDB e no campo **\"Database File\"** informe o caminho **/app/datawarehouse/dw.duckdb**\n    - Após a conexão ser estabelecida com sucesso, será possível interagir com as tabelas pelo Metabase, conforme demonstrado no GIF abaixo.\n\n![Metabase UP](https://cdn.jsdelivr.net/gh/vinitg96/elt-data-lakehouse@main/misc/metabase_up_video_otimizado.gif)\n\n6. O MiniIO console pode ser acessado em http://localhost:9001\n    - usuario: minio123\n    - senha: minio123\n\n\n# Observações\n- O MinIO e o banco de aplicação do Metabase (postgres) fazem usos de volumes nomeados. Dessa forma os dados, configurações, queries, dashboards, etc irão persistir mesmo com os containers sendo removidos ou desligados.\n- O duckdb não permite acessos simultaneos, logo, caso queira executar a DAG **transformation_dbt**  após a configuração do metabase, é necessário desligar o container metaduck\n\n# Próximos Passos\n- Implementar testes e documentação dos modelos SQL com o dbt\n- Melhorar logs\n- Migrar arquitetura para nuvem usando os seguintes serviços:\n    - S3 como storage (lake)\n    - Motherduck: substitui o duckDB como warehouse eliminando o problema da concorrencia\n    - EC2 para subir o metabase\n    - RDS como banco de aplicação do metabse, garantindo a persistencia\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvinitg96%2Felt-data-lakehouse","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvinitg96%2Felt-data-lakehouse","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvinitg96%2Felt-data-lakehouse/lists"}