Como colocar dados do MongoDB em Parquet em 10 segundos ou menos
Benjamin Flast5 min read • Published Jun 11, 2021 • Updated Jun 28, 2023
Avalie esse Tutorial
Para aqueles que não estão familiarizados com o Parquet, é um formato de arquivo surpreendente que faz muito do trabalho pesado para garantir um desempenho de query extremamente rápido em dados armazenados em arquivos. Esse é um formato de arquivo popular no espaço de Data Sync e Data Lake, bem como para uma variedade de tarefas de machine learning.
Uma coisa com a qual frequentemente vemos os usuários lutarem é colocar dados NoSQL no Parquet, pois é um formato colunar. Historicamente, você teria que escrever algum código personalizado para obter os dados do banco de dados, transformá-los em uma estrutura apropriada e, em seguida, provavelmente utilizar uma biblioteca de terceiros para gravá-los no Parquet. Felizmente, com o $out da MongoDB Atlas Data Federation para armazenamento de objetos em nuvem - Amazon S3 ou Microsoft Azure Blob Storage, agora você pode converter dados do MongoDB em Parquet com pouco esforço.
Nesta publicação do blog, guiarei você pelas etapas necessárias para escrever dados do seu MongoDB Atlas cluster diretamente no armazenamento de objetos na cloud no formato Parquet e, em seguida, terminará revisando algumas coisas a serem lembradas ao usar o Parquet com dados NoSQL . Vou usar um conjunto de dados de amostra que contém dados de viagens de táxi da cidade de Nova York.
Para acompanhar este tutorial por conta própria, você precisará do seguinte: um cluster Atlas com alguns dados nele. (Podem ser os dados de amostra.) Uma conta da AWS com privilégios para criar roles IAM e buckets de armazenamento de objetos na cloud (para nos dar acesso para gravar dados em seu bucket de armazenamento de objetos na cloud).
A primeira coisa que você precisa fazer é navegar até a aba "Data Federation" no lado esquerdo do seu Atlas Dashboard e clicar em “set up manually” no menu suspenso "criar novo banco de dados federado" no canto superior direito da interface do usuário.
Em seguida, você precisa conectar seu bucket de armazenamento de objetos em nuvem à sua instância do banco de dados federado. É aqui que escreveremos os arquivos Parquet. O assistente de configuração deve guiá-lo rapidamente, mas você precisará de acesso às suas credenciais da AWS. (Não deixe de conceder ao Atlas Data Federation "Read and Write acesso ao bucket para que ele possa gravar os arquivos Parquet lá.)
Depois de conectar seu bucket de armazenamento de objetos na cloud, criaremos uma fonte de dados simples para consultar os dados no armazenamento de objetos na cloud para que possamos verificar se gravamos os dados no armazenamento de objetos na cloud no final deste tutorial. Nossa nova ferramenta de configuração torna mais fácil do que nunca configurar sua Instância do Banco de Dados Federado para aproveitar o particionamento de dados no armazenamento de objetos na cloud. O particionamento nos permite selecionar apenas os dados relevantes a serem processados para satisfazer sua query. (Coloquei um arquivo de amostra lá para este teste que se encaixa em como vamos particionar os dados por _cab_type).
1 mongoimport --uri mongodb+srv://<USERNAME>:<PASSWORD>@<MONGODB_URI>/<DATABASE> --collection <COLLECTION> --type json --file <FILENAME>
Agora vamos conectar nosso cluster do Atlas, para que possamos escrever dados dele nos arquivos Parquet. Isso inclui escolher o cluster em uma lista de clusters em seu projeto Atlas e, em seguida, selecionar os banco de dados e coleções dos quais você deseja criar fonte de dados e arrastá-los para sua instância do banco de dados federado.
Agora vamos nos conectar à nossa Instância do Banco de Dados Federado usando o shell mongo e executar o seguinte comando. Isso fará várias coisas, portanto, vou explicar as mais importantes.
- Primeiro, você pode usar o campo 'filename' do estágio $out para que sua Instância de Banco de Dados Federado particione os arquivos em “_cab_type”, de forma que todos os táxis verdes Go em um conjunto de arquivos e todos os táxis amarelos em outro.
- Então no formato, vamos especificar parquet e determinar um maxFileSize e maxRowGroupSize. -- maxFileSize vai determinar o tamanho máximo de cada partição. -- maxRowGroupSize determinará como os registros serão agrupados dentro do arquivo Parquet em “row groups”, o que afetará o desempenho da consulta de seus arquivos Parquet, de forma semelhante ao tamanho do arquivo.
- Por fim, estamos usando uma agregação especial do Atlas Data Federation "background: true" que simplesmente informa à Instância de Banco de Dados Federado para continuar executando a consulta mesmo que o cliente se desconecte. (Isso é útil para consultas de longa duração ou ambientes em que sua conexão de rede não é estável.)
1 db.getSiblingDB("clusterData").getCollection("trips").aggregate([ 2 { 3 "$out" : { 4 "s3" : { 5 "bucket" : "ben.flast", 6 "region" : "us-east-1", 7 "filename" : { 8 "$concat" : [ 9 "taxi-trips/", 10 "$_cab_type", 11 "/" 12 ] 13 }, 14 "format" : { 15 "name" : "parquet", 16 "maxFileSize" : "10GB", 17 "maxRowGroupSize" : "100MB" 18 } 19 } 20 } 21 } 22 ], { 23 background: true 24 })
Agora, para dar uma ideia das possíveis melhorias de desempenho para os dados do armazenamento de objetos que você pode ver, escrevi três conjuntos de dados, cada um com 10 milhão de documentos: um em Parquet, um em JSON não compactado e outro em JSON compactado. E corri um comando de contagem em cada um deles com os seguintes resultados.
db.trips.count() 10,000,000
Tipo | Tamanho dos dados (GB) | Latência de comando de contagem (segundos) |
---|---|---|
JSON (descompactado) | ~16.1 | 297.182 |
JSON (compactado) | ~1.1 | 78.070 |
Parquet | ~1.02 | 1.596 |
Então, o que fizemos e o que aprendemos?
- Vimos com que rapidez e facilidade você pode criar uma Instância de Banco de Dados Federado no MongoDB Atlas.
- Conectamos um cluster do Atlas à nossa Instância do Banco de Dados Federado.
- Usamos nossa Instância de Banco de Dados Federado para escrever dados do cluster do Atlas no armazenamento de objetos no cloud no formato Parquet.
- Demonstramos como o Parquet é rápido e eficiente em termos de espaço quando comparado ao JSON.
- O Parquet é um formato colunar super rápido que pode ser lido e gravado com o Atlas Data Federation.
- O Atlas Data Federation aproveita vários metadados contidos nos arquivos Parquet, não apenas o maxRowGroupSize. Por exemplo, se seu primeiro estágio em um pipeline de agregação fosse $project: {fieldA: 1, filedB: 1}, leríamos apenas as duas colunas do arquivo Parquet, o que resulta em desempenho mais rápido e custos mais baixos, pois estamos verificando menos dados.
- O Atlas Data Federation grava arquivos Parquet de forma flexível, portanto, se você tiver dados polimórficos, criaremos colunas de união para que você possa ter 'Coluna A - string' e 'Coluna A - Int'. O Atlas Data Federation lerá as colunas de união de volta como um campo, mas outras ferramentas podem não lidar com tipos de união. Portanto, se você for usar esses arquivos Parquet com outras ferramentas, deverá transformar seus dados antes do estágio $out para garantir que não haja colunas de união.
- O Atlas Data Federation também gravará arquivos com esquemas diferentes se encontrar dados com esquemas variáveis ao longo da agregação. Ele pode lidar com esquemas diferentes entre arquivos em uma coleção, mas outras ferramentas podem exigir um esquema consistente entre arquivos. Portanto, se você for usar esses arquivos Parquet com outras ferramentas, faça uma $project com $convert antes do estágio $out para garantir um esquema consistente entre os arquivos gerados.
- O Parquet é um ótimo formato para seus dados do MongoDB quando você precisa usar ferramentas orientadas por colunas, como o Tableau, para visualizações ou frameworks de aprendizado de máquina que usam quadros de dados. O Parquet pode ser convertido de forma rápida e fácil em Pandas Data Frames no Python.