A camada silver transforma os dados brutos da bronze em registros normalizados, enriquecidos e prontos para análise, utilizando o formato transacional Iceberg. Esse processamento é responsável por aplicar regras de negócio, compor dimensões com joins e manter um histórico consistente via INSERT, UPDATE e DELETE.
O pipeline é totalmente automatizado e executado diariamente via Step Function (dm-processing-dispatcher), acionada por um evento agendado do EventBridge (cron diário às 6h UTC). O fluxo é dividido em duas etapas principais:
-
Processamento em Paralelo As tabelas
brewery,beer,profileereviewsão processadas individualmente e de forma isolada por jobs Spark executados no EMR Serverless. O código de transformação está empacotado em um arquivo.zipe executado viaspark-submit, com argumentos dinâmicos por tabela. -
Geração da Tabela review_flat Após a execução das tabelas principais, uma nova job Spark constrói a
review_flat, consolidando dados dereview,beer,profileebreweryem um modelo unificado e analítico.
O controle de execução é feito diretamente pela Step Function, com registros de logs armazenados no S3 (dm-observer-bucket), e a arquitetura é altamente resiliente: falhas em qualquer job são capturadas e interrompem o fluxo com mensagens de erro claras para depuração.
O pipeline da camada silver foi originalmente idealizado para ser executado em tempo real, refletindo continuamente as alterações recebidas da camada bronze. No entanto, após validações práticas e testes de custo, performance e robustez, optou-se por adotar uma estratégia de processamento em lote diário. Essa decisão foi motivada por uma série de fatores técnicos e operacionais:
- Custo-benefício: Manter jobs Spark disparados com frequência elevada (event-driven) no EMR Serverless se mostrou custoso, especialmente considerando a granularidade dos eventos e a ociosidade entre execuções.
- Natureza dos dados: A maioria dos dados da plataforma é utilizada para análises históricas, não havendo demanda real por atualização em tempo real.
- Robustez e controle transacional: A execução em lote, via Step Function, permite melhor rastreabilidade, controle de falhas, auditoria dos dados processados e reprocessamentos consistentes.
- Dependência de joins entre tabelas: A geração de estruturas enriquecidas como
review_flatdepende de múltiplas dimensões (review,beer,profile,brewery) estarem completamente carregadas — algo inviável em um fluxo contínuo com baixa latência. - Melhor aproveitamento da partição temporal: O uso de partições como
review_yearereview_monthé mais eficiente em modelos batch, com menor fragmentação e overhead de gerenciamento.
Essa mudança estratégica privilegiou a governança, consistência e otimização de custos, ao mesmo tempo em que mantém a arquitetura escalável e pronta para evoluir. O pipeline é executado diariamente via cron agendado no EventBridge, garantindo uma janela de atualização previsível e confiável para os dados da camada silver.
Ao final do pipeline da camada bronze, cada arquivo Parquet gerado é registrado no DynamoDB, na tabela dm-processing-control, indicando que está pronto para ser processado na camada silver. Esse controle garante rastreabilidade, tentativas, enriquecimento com metadados e consistência entre as camadas.
Esses registros possuem schema_name = dm_silver e status = "pending".
-
Acesse o serviço DynamoDB no AWS Console.
-
No menu lateral, clique em Tables, depois selecione a tabela
dm-processing-control. -
No topo direito, clique em Explore table items.
-
Aplique o seguinte filtro:
- Attribute name:
schema_name - Condition:
Equal to - Type:
String - Value:
dm_silver
- Attribute name:
-
Clique em Run.
Isso exibirá os arquivos que estão aguardando processamento para a silver, um por linha.
- O campo
compute_targetagora é definido como"emr", indicando que os arquivos serão processados por jobs Spark no EMR Serverless. - O campo
object_keyaponta para a localização do arquivo Parquet na bronze. - Os campos
attempt_count,status,created_atetable_namecontinuam sendo utilizados exatamente como no fluxo raw → bronze.
Isso garante uniformidade de controle entre as camadas e facilita a reusabilidade do código e das estratégias de monitoramento.
Durante a fase de testes, nem sempre é viável esperar pelo agendamento do cron para acionar o processamento da camada silver. Por isso, foi criada uma funcionalidade no CLI que permite forçar essa execução manualmente:
>>> process --layer silver
Esse comando dispara a execução manual da Step Function responsável pelo processamento, delegando a execução com base nos arquivos pendentes no DynamoDB (status pending).
- O comando não é síncrono. Ele apenas inicia a execução da Step Function e retorna imediatamente.
- Pode levar alguns segundos até que a execução apareça na interface do Step Functions.
- Acesse o serviço Step Functions na AWS Console.
- No menu lateral esquerdo, clique em State machines.
- Clique na state machine chamada
dm-processing-dispatcher. - Vá até a aba Executions.
- Procure por uma execução com nome similar a
manual-<date>-<time>. - Clique sobre a execução para visualizar os detalhes.
- Você pode acompanhar o progresso da execução em tempo real até o status mudar para
Succeeded(ouFailed, caso haja erro).
Cada etapa da execução corresponde a uma tabela sendo processada via EMR Serverless. Para verificar os detalhes:
-
Acesse o serviço EMR na AWS Console.
-
No menu esquerdo, clique em EMR Serverless.
-
Clique em Manage applications.
-
No primeiro acesso, será necessário clicar em Create and launch EMR Studio — apenas confirme.
-
A EMR Studio abrirá em uma nova aba.
-
Em Applications, clique em
dm-processing-app. -
Em Batch job runs, você verá a lista de execuções por tabela.
-
Clique no Job run ID de interesse para ver os detalhes completos:
- Tempo de execução
- Arguments (ex:
--layer silver --table beer) - Logs
- Uso de recursos (CPU/memória)
>>> process --layer silver
You are about to trigger processing for all tables in layer: silver
Type 'go' to continue: go
Processing started successfully.
Após o processamento manual ou automático da camada silver, os dados são salvos no bucket de dados no formato Iceberg, já organizados com boas práticas de particionamento e tratamento de small files.
Os dados ficam armazenados no bucket:
s3://dm-datalake-<account_id>/silver/
Na raiz do bucket você verá:
bronze/silver/← (essa pasta aparece após a primeira execução bem-sucedida)
A estrutura de diretórios segue a mesma da bronze:
silver/
├── beer/
├── brewery/
├── profile/
├── review/
└── review_flat/ ← tabela nova, gerada a partir de joins
Dentro de cada tabela, os dados são armazenados em partições por data de processamento:
silver/beer/data/partitioned_at=YYYYMMDD/
Cada partição contém um único arquivo .parquet, mesmo que múltiplos arquivos tenham sido gerados na bronze.
Essa compactação diária é uma estratégia para mitigar o problema de small files, comum em arquiteturas com ingestão contínua. O dado é consolidado por dia de processamento.
A camada silver já adota o formato Apache Iceberg, que traz os seguintes benefícios:
- Gerenciamento de partições automático, sem a necessidade de reprocessar metadados manualmente.
- Suporte a schemas evolutivos, permitindo adicionar/remover colunas sem recriar a tabela.
- Operações transacionais (append, update, delete) consistentes.
- Alta performance de leitura com otimizações como pruning de partição.
A estrutura de cada tabela Iceberg segue o padrão:
silver/<table_name>/
├── metadata/ ← arquivos internos do Iceberg (não mexer)
├── data/ ← diretório onde ficam os dados Parquet
│ └── partitioned_at=YYYYMMDD/
Você pode verificar os arquivos manualmente via AWS Console:
- Vá até o serviço S3.
- Acesse o bucket
dm-datalake-<account_id>. - Navegue até a pasta
silver/beer/data/partitioned_at=YYYYMMDD/. - Você verá um único arquivo
.parquet.
Caso queira, repita para outras tabelas para confirmar o processamento completo.
Após o processamento da camada silver, os dados ficam disponíveis para consulta imediata no Amazon Athena, pois as tabelas são registradas no AWS Glue Catalog com suporte total a Apache Iceberg.
- Acesse o Amazon Athena no console da AWS.
- No banco de dados
dm_silver, localize as tabelas comobeer,brewery,profile,review,review_flat. - Execute a seguinte query para validar a tabela
beer:
SELECT * FROM dm_silver.beer LIMIT 10;Se tudo estiver correto, você verá:
- Registros com os dados da tabela
beer; - Campos
created_ateupdated_atjá preenchidos; - E o campo
partitioned_at, correspondente ao dia de processamento (ex:20250721).
- A integração com Iceberg permite consultas com partição automática, ou seja, o Athena lê apenas os dados da partição correspondente.
- Se desejar consultar uma partição específica:
SELECT *
FROM dm_silver.beer
WHERE partitioned_at = '20250721';Essa é a validação final do pipeline Bronze → Silver.
Voltar para a página inicial | Próximo: Geração de Dados Analíticos (Gold)