Esse PR utiliza o Badger para acelerar o processo de ETL. O Badger é um armazenamento em disco de pares chave e valor, com alta performance em escrita e leitura de dados, e 100% escrito em Go — o que permite que ele seja utilizado no Minha Receita sem adicionar nenhum outro serviço externo.
Criar um JSON com as informações de cada estabelecimento (hoje, aprox. 54 milhões de linhas de CSV, uma linha por CNPJ)
Enriquecer esse JSON, direto no banco de dados, com informações extras (base do CNPJ, quadro societário, e informações sobre o Simples e MEI; aproximadamente 107 milhões de linhas de CSV)
Hoje, o processo todo leva mais de 12h no meu computador pessoal, pois o “enriquecer” é uma sequência de UPDATE no Postgres editando o conteúdo do JSON — uma operação cara, computacionalmente falando. Esse PR inicia com um protótipo eadadbe144aa636d6b111d2f4a640bb5cefbbd2f mudando esse funcionamento para:
Criar um “cache” simples, de escrita e leitura rápida, para o conteúdo do enriquecimento (as 107 milhões de linhas de CSV)
Ler cada CNPJ (as 54 milhões de linha), enriquecer utilizando o cache, e só então escrever o JSON no Postgres
Prós e contras
Esse novo formato requer um espaço extra em disco de aproximadamente 8Gb, mas roda em pouco mais de 1h (ao invés de mais de 12h, como era antes).
Como 8Gb é relativamente pouco para um projeto que por si seo requer cerca de 150Gb, acho a alternativa interessante.
O que falta
[x] Refatorar o código para separar melhor as responsabilidades entre uma asbração de chave e valor (por exemplo, kv.go) e a implementação utilizando o Badger (por exemplo, badger.go) 89095cd52f71f225bb98bcd94260707ccd4b06f8
[x] Escrever testes (basicamente a funcionalidade está testada com testes mais de integração, mas seria melhor ter também testes mais unitários da abstração de chave e valor, bem como da integração com o Badger
[x] transform/bases_test.go para testar newBaseData e loadBaseRow a4daeb0
[x] transform/partners_test.go para testar newPartner e loadPartnerRow 4cef1aa
[x] transform/taxes_test.go para testar newTaxesData e loadTaxesRow 3f54b0f
[x] transform/kv_test.go para testar os métodos da interface kvStorage incluindo exclusão do diretório do banco de dados a7421bc4ae070fd7f01e2a0db0d74dc0b2b41b57
[x] transform/badger_test.go para testar os métodos de leitura e escrita de dados, bom como de criação do Badger 07ed0b9
[x] Atualizar guia de contribuição com nova estratégia de carregar dados 41d1b05
[x] Limpar módulo db removendo código desnecessário como o de atualizar quadro societário ou enriquecer CNPJ com outros dados, bem como as configurações de auto-vacuum 0da70c8
Possibilidades que o uso do Badger proporciona no futuro (fora do escopo desse PR)
substituição da estrutura de lookups no código do ETL pelo Badger
opção de uso do Badger em memória (ao invés de em disco) feito em 9354c2e
Resumo
Esse PR utiliza o Badger para acelerar o processo de ETL. O Badger é um armazenamento em disco de pares chave e valor, com alta performance em escrita e leitura de dados, e 100% escrito em Go — o que permite que ele seja utilizado no Minha Receita sem adicionar nenhum outro serviço externo.
Contexto
Como explicado no guia de contribuição, o processo de ETL era o seguinte:
Hoje, o processo todo leva mais de 12h no meu computador pessoal, pois o “enriquecer” é uma sequência de
UPDATE
no Postgres editando o conteúdo do JSON — uma operação cara, computacionalmente falando. Esse PR inicia com um protótipo eadadbe144aa636d6b111d2f4a640bb5cefbbd2f mudando esse funcionamento para:Prós e contras
Esse novo formato requer um espaço extra em disco de aproximadamente 8Gb, mas roda em pouco mais de 1h (ao invés de mais de 12h, como era antes).
Como 8Gb é relativamente pouco para um projeto que por si seo requer cerca de 150Gb, acho a alternativa interessante.
O que falta
kv.go
) e a implementação utilizando o Badger (por exemplo,badger.go
) 89095cd52f71f225bb98bcd94260707ccd4b06f8transform/bases_test.go
para testarnewBaseData
eloadBaseRow
a4daeb0transform/partners_test.go
para testarnewPartner
eloadPartnerRow
4cef1aatransform/taxes_test.go
para testarnewTaxesData
eloadTaxesRow
3f54b0ftransform/kv_test.go
para testar os métodos da interfacekvStorage
incluindo exclusão do diretório do banco de dados a7421bc4ae070fd7f01e2a0db0d74dc0b2b41b57transform/badger_test.go
para testar os métodos de leitura e escrita de dados, bom como de criação do Badger 07ed0b9db
removendo código desnecessário como o de atualizar quadro societário ou enriquecer CNPJ com outros dados, bem como as configurações de auto-vacuum 0da70c8Possibilidades que o uso do Badger proporciona no futuro (fora do escopo desse PR)
lookups
no código do ETL pelo Badgeropção de uso do Badger em memória (ao invés de em disco)feito em 9354c2e