Catalogando metadados do MinIO com o DataHub
Durante meu Projeto de Graduação em Computação (PGC) — que é o Trabalho de Conclusão de Curso do Bacharelado em Ciência da Computação da Universidade Federal do ABC (UFABC) — , utilizei o MinIO na parte aplicada do projeto. A qual denominei de Solarié (vide o GitHub), o MinIO é um Object Storage e foi utilizado para armazenar tanto dados não estruturados do frontend, quanto dados semiestruturados, em arquivos json, referentes ao contexto analítico.
MinIO
A escolha pelo MinIO foi devido à compatibilidade com o AWS S3 e por ser open source. Executei o MinIO em contêiner Docker, utilizando o docker compose, mas ele tem o Kubernetes operator integration de forma nativa. Dessa forma, oferece suporte a grande parte das versões do Kubernetes disponíveis em nuvens públicas e privadas.
Além da versão Community, o MinIO também possui as versões Standard e Enterprise, as quais são gerenciadas e pagas. A versão Community, possui uma ampla comunidade conforme indicadores do repositório oficial disponível na Fig. 1:
A documentação oficial ainda destaca a simplicidade de deploy e a alta perfomance. De fato, não houve dificuldades para realizar os testes e integrar com outras tecnologias como o Trino e o DataHub. Entretanto, não tive a oportunidade de testar o MinIO em um ambiente produtivo com alta demanda.
Quanto a interface, se mostrou intuitiva e com grande diversidade de recursos como para controle de acesso, configuração de buckets e monitoração. A Fig. 2 disponível na documentação oficial traz um dashboard com algumas métricas do MinIO:
No projeto, utilizei o DataHub para catalogar os arquivos json armazenados no MinIO. Estes arquivos foram colocados em buckets separados, uma vez que possuem lógicas e contexto de negócios distintos. A Fig. 3 mostra essa estrutura de buckets:
Os arquivos json foram armazenados nos buckets de dadosdeclientes e dadosdeprodutos. Um exemplo de um desses arquivos pode ser visto no json a seguir:
{"indicator": "product_count_by_brand", "group": "Sunglasses", "value": 12}
{"indicator": "product_count_by_brand", "group": "Sports", "value": 8}
{"indicator": "product_count_by_brand", "group": "Vision", "value": 9}
DataHub
O DataHub é uma Plataforma de Metadados open source que foi originalmente desenvolvido pelo LinkedIn. Além da versão Community, o DataHub possui uma versão paga e gerenciada, desenvolvida pela Acryl Data. A versão Community, possui uma comunidade ampla, conforme pode ser visto nos indicadores do repositório oficial na Fig. 4:
No projeto, utilizei o DataHub em contêineres Docker, através de um docker compose customizado, a versão original está disponível no repositório do DataHub no Github. Contudo, há a possibilidade de fazer deploy no Kubernetes utilizando o Helm, o qual estou testando atualmente e pretendo compartilhar a experiência posteriormente. Outra possibilidade, é fazer deploy do quickstart, utilizando para isso o CLI em Python (talvez seja interessante criar uma venv antes):
python3 -m pip install --upgrade pip wheel setuptools
python3 -m pip install --upgrade acryl-datahub
datahub docker quickstart
A interface do DataHub é em React, sendo agradável, intuitiva e com boa responsividade. Nela, além dos metadados, há guias para Gestão de Acessos, Configuração de APIs, Glossário de dados, entre outras. A Fig. 5 exibe a interface do DataHub utilizado no projeto:
Ingestão
Em termos de ingestão, o DataHub possui uma ampla variedade de conectores, abrangendo os principais bancos SQL, NoSQL e serviços de nuvens públicas. Entretanto, não há um conector específico para o MinIO, dessa forma utilizou-se a compatibilidade que o MinIO tem com o S3. Assim, no DataHub, a ingestão é feita com o conector do S3, como se o MinIO fosse um AWS S3.
O DataHub permite a ingestão por dois caminhos: por CLI ou pela interface. Por CLI é necessário instalar a seguinte biblioteca via pip:
pip install 'acryl-datahub[s3]'
Em seguida é preciso criar uma recipe que é um arquivo yaml. No caso do projeto, criei duas recipes uma para cada bucket cujo código está disponibilizado no Github. A recipe para o bucket dadosdeprodutos foi o seguinte:
source:
type: s3
config:
path_specs:
-
include: 's3://dadosdeprodutos/*.*'
aws_config:
aws_access_key_id: minio_user
aws_secret_access_key: minio_password
aws_endpoint_url: 'http://172.21.0.9:9000'
aws_region: us-east-1
env: DEV
Como pode ser percebido, no include foi atribuído o caminho do bucket como se este estivesse no S3. Assim como, as configurações de usuário e senha. Um ponto importante, é que o campo aws_region é um requisito obrigatório de preenchimento, utilizei por padrão a us-east-1, mas isso é apenas um requisito do conector, de fato não há essa configuração no MinIO, uma vez que ele foi executado em contêiner Docker local.
Para executar a recipe utilizando o CLI é necessário indicar o caminho para o arquivo yaml. No caso do Solarié, é possível fazer isso a partir da raiz do repositório executando o seguinte comando:
datahub ingest -c ca
talog/connectors/minio_products_indicators.yml
Em caso de sucesso, será exibida uma mensagem como da Fig. 6:
Após isso, na guia de Ingestion da UI do DataHub ficará disponível alguns detalhes do processo, conforme exibido na Fig. 7:
Ainda na UI, como dito anteriormente, é possível criar as recipes sem necessidade de utilizar o CLI. Para isso, é necessário clicar em Create new source na guia de Ingestion e escolher o conector. No caso do MinIO a opção a ser escolhida é a de Other, em seguida, basta inserir o conteúdo do arquivo yaml. Desta vez, a Fig. 8 mostra o exemplo para o bucket dadosdeclientes:
Pela UI é possível configurar o agendamento das execuções, definir um nome para a ingestão e editar as configurações posteriormente, conforme pode ser observado na Fig. 9:
Um ponto que observei é que, geralmente, pela UI a primeira execução falha, mas a segunda costuma funcionar. Talvez na primeira execução, ele faça o download de alguma biblioteca e isso gere um timeout no processo.
Considerações Finais
O MinIO é uma opção interessante e funcionou bem em um ambiente de testes. A compatibilidade com o S3 permite estudar integrações e armazenamento de dados sem a necessidade de ter uma conta na AWS. Em ambientes produtivos, o MinIO parece ter um bom potencial, embora não tenha tido a oportunidade de avaliar.
Já o DataHub, é uma Plataforma de Metadados com uma ampla quantidade de recursos, permitindo catalogar metadados das mais diversas origens, além de, oferecer recursos relacionados a linhagem e qualidade dos dados. Além do MinIO, utilizei o DataHub com outras fontes de dados como MongoDB e PostgreSQL no Solarié. Em próximos posts pretendo descrever um pouco mais dessa experiência, assim como, o uso do DataHub no Kubernetes.
Referências
FERREIRA LIMA, R. NOVAS ARQUITETURAS DE DADOS E SUAS PERSPECTIVAS. PDF — UNIVERSIDADE FEDERAL DO ABC — UFABC: https://github.com/lima-renan/solarie/blob/main/relatorio/NOVAS%20ARQUITETURAS%20DE%20DADOS%20E%20SUAS%20PERSPECTIVAS%20-%20Renan%20Ferreira%20Lima%20-%20PGC3.pdf
Aplicação Solarié : https://github.com/lima-renan/solarie
Página Oficial do MinIO: https://min.io/
Repositório oficial do MinIO no Github: https://github.com/minio/minio
Página Oficial do DataHub: https://datahubproject.io/
Repositório oficial do DataHub no Github: https://github.com/datahub-project/datahub
Página Oficial da Acryl Data: https://www.acryldata.io/
Docker Hub MinIO: https://hub.docker.com/r/minio/minio