Myślę, że główna różnica, jaką mogę opisać, dotyczy formatów zorientowanych na rekordy i formatów zorientowanych na kolumny. Formaty zorientowane na nagrania są tym, do czego wszyscy jesteśmy przyzwyczajeni - pliki tekstowe, formaty rozdzielane, takie jak CSV, TSV. AVRO jest nieco fajniejsze niż te, ponieważ z czasem może zmieniać schemat, np. Dodając lub usuwając kolumny z rekordu. Inne sztuczki różnych formatów (szczególnie w tym kompresji) dotyczą tego, czy format można podzielić - to znaczy, czy możesz odczytać blok rekordów z dowolnego miejsca w zbiorze danych i nadal znać jego schemat? Ale tutaj jest więcej szczegółów na temat formatów kolumnowych, takich jak Parkiet.
Parkiet i inne formaty kolumnowe bardzo wydajnie radzą sobie z typową sytuacją na platformie Hadoop. Często tabele (zestawy danych) mają o wiele więcej kolumn, niż można by oczekiwać w dobrze zaprojektowanej relacyjnej bazie danych - sto lub dwieście kolumn nie jest niczym niezwykłym. Dzieje się tak, ponieważ często używamy Hadoop jako miejsca do denormalizacji danych z formatów relacyjnych - tak, otrzymujesz wiele powtarzających się wartości i wiele tabel spłaszczonych w jedną. Ale zapytanie staje się znacznie łatwiejsze, ponieważ wszystkie łączenia są opracowane. Istnieją inne zalety, takie jak zachowywanie danych stanu w czasie. Tak czy inaczej, często mamy w tabeli mnóstwo kolumn.
Załóżmy, że mamy 132 kolumny, a niektóre z nich to naprawdę długie pola tekstowe, każda inna kolumna jedna po drugiej i zajmują może 10 KB na rekord.
Podczas wykonywania zapytań dotyczących tych tabel z punktu widzenia SQL, często chcesz uzyskać pewien zakres rekordów na podstawie tylko kilku z tych ponad stu kolumn. Na przykład możesz potrzebować wszystkich rekordów z lutego i marca dla klientów ze sprzedażą> 500 USD.
Aby to zrobić w formacie wierszowym, kwerenda musiałaby przeskanować każdy rekord zbioru danych. Przeczytaj pierwszy wiersz, przeanalizuj rekord na pola (kolumny) i pobierz kolumny z datą i sprzedażą, dołącz je do wyniku, jeśli spełnia warunek. Powtarzać. Jeśli masz 10 lat (120 miesięcy) historii, czytasz każdy rekord tylko po to, aby znaleźć 2 z tych miesięcy. Oczywiście jest to świetna okazja, aby użyć partycji dla roku i miesiąca, ale mimo to czytasz i analizujesz 10 000 każdego rekordu / wiersza przez te dwa miesiące, aby sprawdzić, czy sprzedaż klienta przekracza 500 USD.
W formacie kolumnowym każda kolumna (pole) rekordu jest przechowywana razem z innymi tego rodzaju, rozłożonymi na wiele różnych bloków na dysku - kolumny na rok razem, kolumny na miesiąc razem, kolumny z podręcznika pracownika klienta (lub inne) długi tekst) i wszystkie inne, które sprawiają, że te rekordy są tak ogromne, wszystko w osobnym miejscu na dysku i oczywiście kolumny do sprzedaży razem. No cóż, data i miesiące to liczby, podobnie jak sprzedaż - to tylko kilka bajtów. Czy nie byłoby wspaniale, gdybyśmy musieli odczytać tylko kilka bajtów dla każdego rekordu, aby określić, które rekordy pasują do naszego zapytania? Kolumnowy magazyn na ratunek!
Nawet bez partycji skanowanie małych pól potrzebnych do spełnienia naszego zapytania jest superszybkie - wszystkie są uporządkowane według rekordów i mają ten sam rozmiar, więc dysk szuka o wiele mniej danych w poszukiwaniu dołączonych rekordów. Nie musisz czytać tego podręcznika pracownika ani innych długich pól tekstowych - po prostu je zignoruj. Tak więc, grupując kolumny ze sobą, zamiast wierszy, prawie zawsze można przeskanować mniej danych. Zdobyć!
Zaczekaj, robi się coraz lepiej. Gdyby zapytanie wymagało tylko podania tych wartości i kilku innych (powiedzmy 10 ze 132 kolumn) i nie przejmowało się tą kolumną z podręcznikiem pracownika, po wybraniu odpowiednich rekordów do zwrócenia wystarczyłoby teraz tylko przejść z powrotem do 10 kolumn potrzebnych do wyrenderowania wyników, ignorując pozostałe 122 ze 132 w naszym zbiorze danych. Ponownie pomijamy dużo czytania.
(Uwaga: z tego powodu formaty kolumnowe są kiepskim wyborem podczas wykonywania prostych przekształceń, na przykład, jeśli łączysz wszystkie dwie tabele w jeden duży (ger) zestaw wyników, który zapisujesz jako nową tabelę, źródła i tak zostaną całkowicie przeskanowane, więc nie ma dużej korzyści z wydajności odczytu, a ponieważ formaty kolumnowe muszą pamiętać więcej o miejscu, w którym się znajdują, zużywają więcej pamięci niż podobny format wierszy).
Jeszcze jedna zaleta kolumnowości: dane są rozproszone. Aby uzyskać pojedynczy rekord, możesz mieć 132 pracowników, z których każdy odczytuje (i zapisuje) dane z / do 132 różnych miejsc w 132 blokach danych. Brawo za zrównoleglenie!
A teraz dla klinczera: algorytmy kompresji działają znacznie lepiej, gdy mogą znaleźć powtarzające się wzorce. Można skompresować AABBBBBBCCCCCCCCCCCCCCCC
tak 2A6B16C
, ale ABCABCBCBCBCCCCCCCCCCCCCC
nie dostać tak małe (no, rzeczywiście, w tym przypadku, że będzie, ale uwierzcie mi :-)). Więc jeszcze raz mniej czytania. I pisanie też.
Dlatego czytamy dużo mniej danych, aby odpowiedzieć na typowe zapytania, równoległe odczytywanie i zapisywanie jest potencjalnie szybsze, a kompresja zwykle działa znacznie lepiej.
Kolumnowy jest świetny, gdy strona wejściowa jest duża, a wyjście jest przefiltrowanym podzbiorem: od dużego do małego jest świetne. Nie tak korzystne, gdy dane wejściowe i wyjściowe są mniej więcej takie same.
Ale w naszym przypadku Impala zajęła się naszymi starymi zapytaniami Hive, które trwały 5, 10, 20 lub 30 minut i zakończyły się w ciągu kilku sekund lub minuty.
Mam nadzieję, że pomoże to odpowiedzieć przynajmniej na część pytania!