Articles

Kodowanie, Kompresja, Parquet i Hive

Na klastrze CDH 5.14, robiłem porównanie rozmiarów dla wstawek wykonanych przy użyciu hive Vs impala do tabeli z formatem pliku parquet. Miałem wrażenie, że skoro oba formaty plików są takie same, to powinny mieć podobne zachowanie (z domyślnym kodekiem kompresji), co skutkuje mniej więcej takim samym rozmiarem. Zauważyłem jednak, że plik parquet napisany przez Impalę jest znacznie mniejszy niż ten napisany przez ul dla tych samych danych wejściowych.

Zacząłem więc przyglądać się plikowi parquet napisanemu przez ul i natknąłem się na obserwacje, które faktycznie pomogły mi zrozumieć punkt, w którym być może wszyscy początkujący powinni natknąć się na rodzaj zamieszania związanego z kodowaniem Vs kompresją (tutaj związane z tabelami hive hdfs). Tzn. specyficzna różnica pomiędzy kodowaniem a kompresją i jak ule na tym działają.

To co myślę, że ogólnie różnica pomiędzy kodowaniem a kompresją jest –

  • Kodowanie: Jest to bardziej na poziomie aplikacji, gdzie reprezentacja danych jest zmieniana. Kodowanie może również zminimalizować wykorzystanie przestrzeni, co może dać nam rodzaj kompresji.
  • Kompresja: Ogólnie rzecz biorąc, jest to technika zmniejszania pamięci dla danych w bajtach, niezależnie od tego, czy dane są już zakodowane, czy nie.

Powyższe potwierdza poniższa obserwacja.

  • Stworzyłem ul z formatem plików parkietowych.
  • Wstawiłem dane, które utworzyły ok. 1GB plików parkietowych jako część wstawki.
  • Aby przyjrzeć się plikom parkietowym, skopiowałem je z hdfs na lokalny, aby je zrzucić (dla przypomnienia – istnieją sposoby na zrzucenie plików z hdfs). Następnie zweryfikowałem go używając narzędzia parquet-meta, które potrafi zrzucić plik parquet.
  • …/parquet-meta < nazwa pliku>

Wyciąg z parkietu – meta dump
.meta dump
  • Gdzie w nim widać, każda kolumna jest zakodowana za pomocą różnych technik kodowania (wartość ENC), takich jak długość przebiegu, pakowanie bitów itp (nie będziemy omawiać samego kodowania). Jednak plik parkietowy zapisany przez ul domyślnie nie stosuje żadnej kompresji. Rozmiar pliku wynosił 1GB.

Następnie

  • Tablica skrócona użyta w powyższym teście.
  • W linii poleceń hive(beeline) ustaw poniższe ustawienia, które jawnie ustawią kodek kompresji i zmuszą hive do kompresji pliku parkietowego.

SET hive.exec.compress.output=true;

SET parquet.compression=SNAPPY

  • Wprowadziliśmy taką samą ilość danych. Tym razem utworzył około 350 MB plików parquet.
  • Ponownie skopiował plik z hdfs do lokalnego, aby zrzucić go używając narzędzia parquet-meta.

Excerpt from parquet-meta dump
  • Tutaj możemy to zobaczyć, widać, że plik jest skompresowany za pomocą SNAPPY wraz z kodowaniem. Kiedy jawnie włączymy kompresję, nastąpi znaczne zmniejszenie rozmiaru pliku parkietu dla tej samej ilości danych w wyniku kompresji.

Więc obserwacja jest taka, że kodowanie i kompresja są różne i mogą być używane oddzielnie lub razem. Zaobserwowałem w hive (od CDH 5.14), że gdy piszemy do tabeli parquet, domyślnie używa tylko kodowania, a nie kompresji. Aby włączyć kompresję w ulu, musimy jawnie ustawić w ulu, jak poniżej.

SET hive.exec.compress.output=true;

SET parquet.compression=<Compression Codec>

W wyniku czego pliki będą miały prawie taki sam rozmiar jak pliki wstawiane przez Impalę (Impala domyślnie wykonuje zarówno kodowanie jak i kompresję).

Wyniki kompresji są prawie takie same jak pliki wstawiane przez Impalę.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *