Quais são os prós e os contras do formato parquet em comparação com outros formatos?

136

As características do Apache Parquet são:

  • Auto-descrição
  • Formato colunar
  • Independente do idioma

Em comparação com o Avro, Sequence Files, RC File etc. Quero uma visão geral dos formatos. Eu já li: Como o Impala funciona com os formatos de arquivo Hadoop , ele fornece algumas informações sobre os formatos, mas eu gostaria de saber como o acesso aos dados e o armazenamento de dados são feitos em cada um desses formatos. Como o parquet tem uma vantagem sobre os outros?

Ani Menon
fonte
2
Um bom resumo pode ser encontrado nesta apresentação: link
Dominik
@ ani-menon O link está morto.
Sajjad Hossain
@SajjadHossain atualizado.
Ani Menon

Respostas:

282

Penso que a principal diferença que posso descrever diz respeito aos formatos orientados a registros vs. orientados a colunas. Formatos orientados a registros são o que estamos acostumados - arquivos de texto, formatos delimitados como CSV, TSV. O AVRO é um pouco mais frio do que aqueles, pois pode alterar o esquema ao longo do tempo, por exemplo, adicionar ou remover colunas de um registro. Outros truques de vários formatos (especialmente incluindo a compactação) envolvem se um formato pode ser dividido - ou seja, você pode ler um bloco de registros de qualquer lugar do conjunto de dados e ainda sabe que é o esquema? Mas aqui estão mais detalhes sobre formatos colunares como o Parquet.

Parquet e outros formatos colunares lidam com uma situação comum do Hadoop com muita eficiência. É comum ter tabelas (conjuntos de dados) com muito mais colunas do que você esperaria em um banco de dados relacional bem projetado - cem ou duzentas colunas não são incomuns. Isso ocorre porque geralmente usamos o Hadoop como um local para desnormalizar dados de formatos relacionais - sim, você obtém muitos valores repetidos e muitas tabelas achatadas em uma única. Mas fica muito mais fácil consultar, pois todas as junções são trabalhadas. Existem outras vantagens, como a retenção de dados de estado no tempo. De qualquer forma, é comum ter um monte de colunas em uma tabela.

Digamos que existam 132 colunas, e algumas delas são realmente campos de texto longos, cada coluna diferente uma após a outra e que consomem talvez 10 mil por registro.

Embora a consulta dessas tabelas seja fácil com o ponto de vista do SQL, é comum que você deseje obter algum intervalo de registros com base em apenas algumas dessas centenas de colunas. Por exemplo, você pode querer todos os registros de fevereiro e março para clientes com vendas> US $ 500.

Para fazer isso em um formato de linha, a consulta precisaria verificar todos os registros do conjunto de dados. Leia a primeira linha, analise o registro em campos (colunas) e obtenha a data e as colunas de vendas, inclua-o no resultado se ele satisfizer a condição. Repetir. Se você tem 10 anos (120 meses) de história, está lendo todos os registros apenas para encontrar dois desses meses. Obviamente, essa é uma ótima oportunidade para usar uma partição no ano e no mês, mas mesmo assim, você está lendo e analisando 10K de cada registro / linha nesses dois meses apenas para descobrir se as vendas do cliente são> US $ 500.

Em um formato colunar, cada coluna (campo) de um registro é armazenada com outras de seu tipo, espalhadas por muitos blocos diferentes no disco - colunas por ano juntos, colunas por mês juntos, colunas para o manual do funcionário do cliente (ou outro texto longo) e todos os outros que tornam esses registros tão grandes, todos em um lugar separado no disco e, claro, colunas para vendas juntos. Bem, dia e mês são números e vendas - eles são apenas alguns bytes. Não seria ótimo se tivéssemos que ler apenas alguns bytes para cada registro para determinar quais registros correspondiam à nossa consulta? Armazenamento colunar para o resgate!

Mesmo sem partições, a varredura dos pequenos campos necessários para atender à nossa consulta é super rápida - eles estão todos em ordem por registro e com o mesmo tamanho, de modo que o disco procura muito menos verificação de dados para registros incluídos. Não é necessário ler esse manual do funcionário e outros campos de texto longos - apenas ignore-os. Portanto, agrupando colunas entre si, em vez de linhas, você quase sempre pode verificar menos dados. Ganhar!

Mas espere, fica melhor. Se sua consulta apenas precisasse conhecer esses valores e mais alguns (digamos 10 das 132 colunas) e não se importasse com a coluna do manual do funcionário, uma vez que ela selecionasse os registros corretos para retornar, agora seria necessário apenas ir de volta às 10 colunas necessárias para renderizar os resultados, ignorando os outros 122 dos 132 em nosso conjunto de dados. Novamente, pulamos muitas leituras.

(Observação: por esse motivo, os formatos colunares são uma péssima escolha ao fazer transformações diretas, por exemplo, se você estiver juntando todas as duas tabelas em um grande conjunto de resultados (ger) que está salvando como uma nova tabela, as fontes serão digitalizados completamente de qualquer maneira, portanto, não há muitos benefícios no desempenho da leitura e, como os formatos colunares precisam lembrar mais sobre o local, eles usam mais memória que um formato de linha semelhante).

Mais um benefício do colunar: os dados são espalhados. Para obter um único registro, é possível ter 132 trabalhadores cada um lendo (e gravando) dados de / para 132 locais diferentes em 132 blocos de dados. Yay para paralelização!

E agora para o argumento decisivo: algoritmos de compressão funcionam muito melhor quando podem encontrar padrões repetidos. Você pode comprimir AABBBBBBCCCCCCCCCCCCCCCCcomo 2A6B16CmasABCABCBCBCBCCCCCCCCCCCCCC não iria ficar tão pequena (bem, na verdade, neste caso seria, mas confia em mim :-)). Então, mais uma vez, menos leitura. E escrevendo também.

Portanto, lemos muito menos dados para responder a consultas comuns, é potencialmente mais rápido ler e escrever em paralelo, e a compactação tende a funcionar muito melhor.

Colunar é ótimo quando seu lado de entrada é grande e sua saída é um subconjunto filtrado: de grande a pequeno é ótimo. Não é tão benéfico quando as entradas e saídas são praticamente as mesmas.

Porém, no nosso caso, a Impala levou nossas consultas antigas do Hive, que duravam 5, 10, 20 ou 30 minutos, e terminavam a maioria em alguns segundos ou um minuto.

Espero que isso ajude a responder pelo menos parte de sua pergunta!

Tom Harrison
fonte
7
Excelente. Obrigado. É um resumo muito útil que está faltando em muitos documentos do projeto apache. Você menciona: "pequenos campos ... estão todos em ordem por registro". Suponha que eu tenha uma tabela simples de userid: long e age: int e queira encontrar todos os usuários entre algumas idades. Aqui eu tenho duas colunas. Preciso especificar quando é o índice da ordem ou TODAS as colunas são indexáveis ​​com eficiência?
user48956
1
E se eu usar parquet em uma série de tempo? Várias colunas (100+), cada coluna são dados de sensores com diferentes frequências (100Hz a 0,25Hz). Seria uma decisão inteligente?
guilhermecgs
53

O Avro é um formato de armazenamento baseado em linha para o Hadoop.

Parquet é um formato de armazenamento baseado em coluna para o Hadoop.

Se o seu caso de uso normalmente varre ou recupera todos os campos em uma linha em cada consulta, o Avro geralmente é a melhor opção.

Se seu conjunto de dados possui muitas colunas e seu caso de uso geralmente envolve trabalhar com um subconjunto dessas colunas em vez de com registros inteiros, o Parquet é otimizado para esse tipo de trabalho.

Fonte

afuc func
fonte
26

A resposta de Tom é bastante detalhada e exaustiva, mas você também pode se interessar por este estudo simples sobre Parquet vs Avro feito na Allstate Insurance, resumido aqui:

"No geral, o Parquet apresentou resultados semelhantes ou melhores em todos os testes [que o Avro]. As diferenças de desempenho da consulta nos conjuntos de dados maiores em favor do Parquet são parcialmente devidas aos resultados da compactação; ao consultar o amplo conjunto de dados, o Spark teve que ler 3,5x menos dados para o Parquet que o Avro. O Avro não teve um bom desempenho ao processar todo o conjunto de dados, como se suspeita. "

Justin Kestelyn
fonte