Avro vs. Parquet


95

Estou planejando usar um dos formatos de arquivo hadoop para meu projeto relacionado ao hadoop. Eu entendo parquet é eficiente para consulta baseada em colunas e avro para varredura completa ou quando precisamos de todos os dados das colunas!

Antes de prosseguir e escolher um dos formatos de arquivo, quero entender quais são as desvantagens / desvantagens de um em relação ao outro. Alguém pode me explicar em termos simples?

Respostas:


55

Se você ainda não decidiu, eu iria em frente e escreveria esquemas Avro para seus dados. Feito isso, escolher entre arquivos de contêiner Avro e arquivos Parquet é tão simples quanto trocar, por exemplo,

job.setOutputFormatClass(AvroKeyOutputFormat.class);
AvroJob.setOutputKeySchema(MyAvroType.getClassSchema());

para

job.setOutputFormatClass(AvroParquetOutputFormat.class);
AvroParquetOutputFormat.setSchema(job, MyAvroType.getClassSchema());

O formato Parquet parece ser um pouco mais computacionalmente intensivo no lado da gravação - por exemplo, exigindo RAM para armazenamento em buffer e CPU para solicitar os dados, etc., mas deve reduzir os custos de E / S, armazenamento e transferência, além de ser eficiente lê especialmente com consultas semelhantes a SQL (por exemplo, Hive ou SparkSQL) que abordam apenas uma parte das colunas.

Em um projeto, acabei revertendo de contêineres Parquet para Avro porque o esquema era muito extenso e aninhado (sendo derivado de algumas classes orientadas a objetos razoavelmente hierárquicas) e resultou em milhares de colunas Parquet. Por sua vez, nossos grupos de linhas eram realmente largos e rasos, o que significa que demorou uma eternidade antes que pudéssemos processar um pequeno número de linhas na última coluna de cada grupo.

Ainda não tive muita chance de usar o Parquet para dados mais normalizados / sãos, mas entendo que, se bem usado, permite melhorias significativas de desempenho.


2
Parquet também oferece suporte a conjuntos / coleções de dados aninhados.
Tagar

@Ruslan: Sim, ele suportava tecnicamente as estruturas aninhadas. O problema era o número muito alto de colunas devido à extensa desnormalização dos dados. Funcionou, mas foi muito lento.
steamer 25

4
Sim, escrever dados em parquet é mais caro. As leituras são o contrário, especialmente se suas consultas normalmente leem um subconjunto de colunas.
Tagar,

4
Acho que Parquet é adequado para a maioria dos casos de uso, exceto, os dados na mesma coluna variam muito e sempre analisados ​​em quase todas as colunas.
Rockie Yang

Apache Arrow também não suporta aninhamento misto (listas com dicionários ou dicionários com listas). Portanto, se você deseja trabalhar com aninhamento complexo no Parquet, você está preso ao Spark, Hive, etc. e ferramentas que não dependem do Arrow para ler e escrever Parquet.
Josiah

51

Avro é um formato baseado em linha. Se você deseja recuperar os dados como um todo, você pode usar o Avro

Parquet é um formato baseado em coluna. Se seus dados consistirem em muitas colunas, mas você estiver interessado em um subconjunto de colunas, você pode usar Parquet

O HBase é útil quando há atualização frequente de dados. Avro é rápido na recuperação, Parquet é muito mais rápido.


7
Por favor, corrija suas 2 últimas frases no último parágrafo. Eles são absolutamente incompreensíveis.
Cbhihe de

42

Avro

  • Amplamente usado como plataforma de serialização
  • Baseado em linha, oferece um formato binário compacto e rápido
  • O esquema é codificado no arquivo para que os dados possam ser desmarcados
  • Os arquivos suportam compressão de bloco e são dividíveis
  • Suporta evolução de esquema

Parquet

  • Formato de arquivo binário orientado a coluna
  • Usa o algoritmo de fragmentação e montagem de registros descrito no artigo da Dremel
  • Cada arquivo de dados contém os valores para um conjunto de linhas
  • Eficiente em termos de E / S de disco quando colunas específicas precisam ser consultadas

Da escolha de um formato de armazenamento de dados HDFS - Avro vs. Parquet e mais


32

Tanto Avro quanto Parquet são formatos de armazenamento "autodescritivos", o que significa que ambos incorporam dados, informações de metadados e esquema ao armazenar dados em um arquivo. O uso de qualquer um dos formatos de armazenamento depende do caso de uso. Três aspectos constituem a base sobre a qual você pode escolher qual formato será o ideal para o seu caso:

  1. Operação de leitura / gravação : Parquet é um formato de arquivo baseado em coluna. Suporta indexação. Por isso, ele é adequado para consultas de dados de baixa latência, consultas complexas ou analíticas com gravação única e leitura intensiva. Isso geralmente é usado por usuários finais / cientistas de dados.
    Enquanto isso, Avro, sendo um formato de arquivo baseado em linha, é melhor usado para operação de gravação intensiva. Isso geralmente é usado por engenheiros de dados. Ambos suportam formatos de serialização e compactação, embora o façam de maneiras diferentes.

  2. Ferramentas : Parquet é um bom ajuste para Impala. (Impala é um mecanismo de consulta RDBM SQL de processamento paralelo maciço (MPP) que sabe como operar em dados que residem em um ou alguns mecanismos de armazenamento externo.) Mais uma vez, o Parquet se presta bem a consultas complexas / interativas e rápido (baixa latência ) emite dados em HDFS. Isso é suportado pelo CDH (Cloudera Distribution Hadoop). O Hadoop suporta os formatos Optimized Row Columnar (ORC) do Apache (as seleções dependem da distribuição do Hadoop), enquanto o Avro é mais adequado para o processamento do Spark.

  3. Evolução do esquema : a evolução de um esquema de banco de dados significa mudar a estrutura do banco de dados, portanto seus dados e, portanto, seu processamento de consultas.
    Tanto Parquet quanto Avro oferecem suporte à evolução do esquema, mas em graus variáveis.
    Parquet é bom para operações de 'anexação', por exemplo, adicionar colunas, mas não para renomear colunas, a menos que 'ler' seja feito pelo índice.
    Avro é mais adequado para anexar, excluir e transformar colunas em geral do que Parquet. Historicamente, Avro forneceu um conjunto mais rico de possibilidades de evolução de esquema do que Parquet e, embora suas capacidades de evolução de esquema tendam a se confundir, Avro ainda brilha nessa área, quando comparado ao Parquet.


5
A parte "Ferramentas" é um pouco enganosa. Parquet é usado com eficiência por muitas outras estruturas como Spark, Presto, Hive etc. Avro não é específico para Spark, ele é amplamente usado como um formato de armazenamento HDFS e cenários de passagem de mensagens como no Kafka.
ᐅ devrimbaris

2
Aakash Aggarwal: Você pode explicar o que quer dizer no parágrafo 2 com "Avro é o mais adequado para processamento do Spark"? Conforme mencionado pela devrimbaris, o Parquet também está muito bem integrado no ambiente de processamento do Spark. o_O?!?
Cbhihe

12

Seu entendimento está certo. Na verdade, passamos por uma situação semelhante durante a migração de dados em nosso DWH. Escolhemos Parquet em vez de Avro porque a economia de disco que obtivemos foi quase o dobro do que obtivemos com AVro. Além disso, o tempo de processamento da consulta foi muito melhor do que Avro. Mas sim, nossas consultas foram baseadas em agregação, operações baseadas em colunas, etc., portanto, Parquet foi previsivelmente um vencedor claro.

Estamos usando o Hive 0.12 da distro CDH. Você mencionou que está tendo problemas com o Hive + Parquet, quais são? Não encontramos nenhum.


4

Silver Blaze colocou uma descrição bem com um caso de uso de exemplo e descreveu como Parquet foi a melhor escolha para ele. Faz sentido considerar um sobre o outro, dependendo de seus requisitos. Estou colocando uma breve descrição de diferentes outros formatos de arquivo, juntamente com a comparação da complexidade do espaço de tempo. Espero que ajude.

Existem vários formatos de arquivo que você pode usar no Hive. As menções notáveis ​​são AVRO, Parquet. RCFile e ORC. Existem alguns bons documentos disponíveis online que você pode consultar se quiser comparar o desempenho e a utilização do espaço desses formatos de arquivo. Segue alguns links úteis que o ajudarão.

Esta postagem do blog

Este link do MapR [Eles não discutem Parquet, no entanto]

Este link da Inquidia

Os links fornecidos acima irão ajudá-lo. Espero que isso responda a sua consulta.

Obrigado!


0

Apenas para obter uma descrição do Parquet, você pode consultar aqui: http://bigdata.devcodenote.com/2015/04/parquet-file-format.html

Pretendo escrever muito em breve no Avro e uma comparação entre os 2 também. Vou postar aqui quando terminar.


Esperando pela comparação. Atualmente eu escolhi Avro para meu projeto porque o parquet tem problemas de compatibilidade com a colmeia :)
Abhishek

1
@Abshinek, você pode fornecer algumas informações sobre os problemas de compatibilidade com colmeia e avro
EB

@EB Não deve haver nenhum problema, se houver, eles seriam mencionados em cwiki.apache.org/confluence/display/Hive/AvroSerDe
OneCricketeer
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.