Estou executando alguns testes nos formatos de armazenamento disponíveis com Hive e usando Parquet e ORC como opções principais. Eu incluí ORC uma vez com compressão padrão e uma vez com Snappy.
Eu li muitos documentos que afirmam que o Parquet é melhor em complexidade de tempo / espaço em comparação ao ORC, mas meus testes são opostos aos documentos que examinei.
Segue alguns detalhes dos meus dados.
Table A- Text File Format- 2.5GB
Table B - ORC - 652MB
Table C - ORC with Snappy - 802MB
Table D - Parquet - 1.9 GB
Parquet foi o pior no que diz respeito à compressão da minha mesa.
Meus testes com as tabelas acima produziram os seguintes resultados.
Operação de contagem de linha
Text Format Cumulative CPU - 123.33 sec
Parquet Format Cumulative CPU - 204.92 sec
ORC Format Cumulative CPU - 119.99 sec
ORC with SNAPPY Cumulative CPU - 107.05 sec
Soma de uma operação de coluna
Text Format Cumulative CPU - 127.85 sec
Parquet Format Cumulative CPU - 255.2 sec
ORC Format Cumulative CPU - 120.48 sec
ORC with SNAPPY Cumulative CPU - 98.27 sec
Média de uma operação de coluna
Text Format Cumulative CPU - 128.79 sec
Parquet Format Cumulative CPU - 211.73 sec
ORC Format Cumulative CPU - 165.5 sec
ORC with SNAPPY Cumulative CPU - 135.45 sec
Seleção de 4 colunas de um determinado intervalo usando a cláusula where
Text Format Cumulative CPU - 72.48 sec
Parquet Format Cumulative CPU - 136.4 sec
ORC Format Cumulative CPU - 96.63 sec
ORC with SNAPPY Cumulative CPU - 82.05 sec
Isso significa que o ORC é mais rápido que o Parquet? Ou há algo que posso fazer para que funcione melhor com o tempo de resposta da consulta e a taxa de compactação?
Obrigado!
Respostas:
Eu diria que ambos os formatos têm suas próprias vantagens.
Parquet pode ser melhor se você tiver dados altamente aninhados, porque ele armazena seus elementos como uma árvore como o Google Dremel faz ( veja aqui ).
O Apache ORC pode ser melhor se sua estrutura de arquivos for simplificada.
E, pelo que eu sei, o parquet ainda não suporta índices. ORC vem com um índice leve e desde Hive 0.14 um filtro Bloom adicional que pode ser útil para melhorar o tempo de resposta da consulta, especialmente quando se trata de operações de soma.
A compressão padrão do Parquet é SNAPPY. As tabelas A - B - C e D contêm o mesmo conjunto de dados? Se sim, parece que há algo obscuro sobre isso, quando ele é compactado apenas para 1,9 GB
fonte
Você está vendo isso porque:
O Hive tem um leitor ORC vetorizado, mas nenhum leitor de parquete vetorizado.
O Spark tem um leitor de parquete vetorizado e nenhum leitor ORC vetorizado.
Spark tem melhor desempenho com parquete, hive tem melhor desempenho com ORC.
Eu vi diferenças semelhantes ao executar ORC e Parquet com Spark.
Vetorização significa que as linhas são decodificadas em lotes, melhorando drasticamente a localização da memória e a utilização do cache.
(correto a partir do Hive 2.0 e Spark 2.1)
fonte
Ambos Parquet e ORC têm suas próprias vantagens e desvantagens. Mas eu simplesmente tento seguir uma regra prática simples - "Quão aninhados estão seus dados e quantas colunas existem" . Se você seguir o Dremel do Google, poderá descobrir como o parquet é projetado. Eles usam uma estrutura semelhante a uma árvore hierárquica para armazenar dados. Mais o aninhamento mais profundo na árvore.
Mas o ORC foi projetado para um armazenamento de arquivos simplificado. Portanto, se seus dados forem nivelados com menos colunas, você pode usar ORC, caso contrário, o parquet seria adequado para você. A compactação em dados nivelados funciona de maneira incrível no ORC.
Fizemos alguns benchmarking com um arquivo maior achatado, convertido para spark Dataframe e armazenamos em ambos os formatos parquet e ORC no S3 e fez consultas com ** Redshift-Spectrum **.
Em breve, faremos alguns benchmarking para dados aninhados e atualizaremos os resultados aqui.
fonte
Fizemos alguns benchmarks comparando os diferentes formatos de arquivo (Avro, JSON, ORC e Parquet) em diferentes casos de uso.
https://www.slideshare.net/oom65/file-format-benchmarks-avro-json-orc-parquet
Os dados estão todos disponíveis publicamente e o código de referência é totalmente de código aberto em:
https://github.com/apache/orc/tree/branch-1.4/java/bench
fonte
Ambos têm suas vantagens. Usamos Parquet no trabalho junto com o Hive e o Impala, mas só queríamos apontar algumas vantagens do ORC sobre o Parquet: durante consultas de longa execução, quando o Hive consulta as tabelas ORC, o GC é chamado cerca de 10 vezes menos frequentemente . Pode não ser nada para muitos projetos, mas pode ser crucial para outros.
O ORC também leva muito menos tempo, quando você precisa selecionar apenas algumas colunas da tabela. Algumas outras consultas, especialmente com joins, também levam menos tempo por causa da execução de consulta vetorizada, que não está disponível para Parquet
Além disso, a compressão ORC às vezes é um pouco aleatória, enquanto a compressão Parquet é muito mais consistente. Parece que quando a tabela ORC tem muitas colunas numéricas - ela também não compacta. Afeta a compressão zlib e rápida
fonte