Codificação, Compressão, Parquet e Colmeia
No cluster CDH 5.14, estava a fazer a comparação de tamanho para inserções feitas usando impala de colmeia Vs para tabela com formato de ficheiro de parquet. Estava sob impressão, sendo ambos os formatos de ficheiro iguais, deveria ter um comportamento semelhante (com codec de compressão padrão) para resultar em aproximadamente o mesmo tamanho. No entanto, reparei que – o ficheiro de parquet escrito pela Impala é muito pequeno do que um escrito pela colmeia para os mesmos dados de entrada.
Então, comecei a olhar para o ficheiro de parquet escrito pela colmeia e deparei-me com observações que na realidade ajudaram a compreender o ponto em que talvez todos os principiantes deveriam ter-se deparado com um tipo de confusão na codificação da compressão Vs (aqui relacionada com tabelas de colmeia Vs). Isto é, a diferença específica entre codificação e compressão e como funciona a colmeia nisto.
A diferença geral entre codificação e compressão é –
- Encodificação: É mais a nível de aplicação onde a representação de dados é alterada. A codificação pode também minimizar o uso de espaço, o que nos pode dar uma espécie de compressão.
- Compressão: Em geral, é a técnica de reduzir o armazenamento de dados em bytes, independentemente de os dados sublinhados já estarem codificados ou não.
O acima mencionado confirma-se com a observação abaixo.
- A colmeia criada com formato de ficheiro parquet.
- Inseriu alguns dados que tinham criado cerca de 1GB de ficheiros parquet como parte do insert.
- Para ver o ficheiro parquet, copiei ficheiro de hdfs para o local para o despejar (só para notar – também há forma de despejar de hdfs). Depois validado usando o utilitário parquet-meta que pode despejar o ficheiro parquet.
- …/parquet-meta < nome do ficheiro>
- onde nele aparece, cada coluna é codificada com várias técnicas de codificação (valor de ENC) como Run length, Bit packed, etc (não discutiremos a codificação em si). No entanto, o ficheiro de parquet escrito da colmeia por defeito não emprega qualquer compressão. O tamanho do ficheiro era de 1GB.
Então seguinte
- tabela truncada utilizada no teste acima referido.
- Na colmeia (linha de comando beeline) definida abaixo das definições que irão definir explicitamente o codec de compressão e forçar a colmeia a comprimir o ficheiro de parquet escrito da colmeia.
SET hive.exec.compress.output=true;
SET parquet.compression=SNAPPY
- Inserido a mesma quantidade de dados. Desta vez, criou aproximadamente 350 MB de ficheiros parquet.
- Again copied file from hdfs to local to dump it using parquet-meta utility.
- Aqui podemos ver isso, mostra que o ficheiro está comprimido com SNAPPY juntamente com a codificação. Quando permitimos explicitamente a compressão, haverá uma redução substancial no tamanho do ficheiro de parquet para a mesma quantidade de dados como resultado da compressão.
Então a observação é que a codificação e a compressão são diferentes e podem ser usadas separadamente ou em conjunto. Tenho observado na colmeia ( a partir de CDH 5.14), quando escrevemos na tabela de parquet, por defeito utiliza apenas a codificação e não a compressão. Para permitir a compressão na colmeia, precisamos de definir explicitamente na colmeia como abaixo.
SET hive.exec.compress.output=true;
SET parquet.compression=<Código de compressão>
Que então resultaria quase no mesmo tamanho que as inserções Impala (Impala por defeito faz tanto a codificação como a compressão).