Parquet i Avro: zdarzenie między modułami i zapis, który czyta superinteligencja

Przyjęcie towaru zostaje potwierdzone na rampie. W tej samej sekundzie moduł handlu musi wiedzieć, że zaległe zamówienie może wyjechać, finanse muszą zacząć dopasowanie faktury, a moduł magazynu musi zmienić stan. Każdy z nich chce całe przyjęcie: dostawcę, pozycję, ilość, partię, kto potwierdził. Trzy miesiące później agent finansowy zadaje inne pytanie: jak często w ciągu ostatnich dwóch lat przyjęcia od tego dostawcy były niekompletne. Chce dwóch kolumn z miliona wierszy i chce ich w kilka sekund.
To dwa różne kształty tego samego faktu. Pierwszy to wiersz, który wędruje. Drugi to kolumna, która spoczywa. System operacyjny firmy musi przechowywać oba i błędem jest przechowywać je tak samo. W warstwie Data Hurukana, która jest w budowie, projekt zakłada, że zdarzenie między modułami niesie Apache Avro, a zapis, który czyta superinteligencja, jest ułożony w Apache Parquet. Ten tekst tłumaczy, skąd ten podział i za co płaci każda ze stron.
Dwa pytania, dwa układy
Format pliku decyduje, jak jeden plik układa bajty: czy rekordy leżą jeden za drugim, czy wszystkie wartości jednego pola leżą razem, jak są skompresowane i gdzie mieszka opis ich typów.
Układ wierszowy. Każdy rekord jest zapisany w całości: wszystkie pola tego przyjęcia, potem wszystkie pola następnego. Zapis jednego rekordu jest tani, odczyt jednego rekordu jest tani, a odczyt samej ilości z miliona przyjęć oznacza czytanie także wszystkich pozostałych pól, bo stoją na drodze.
Układ kolumnowy. Wszystkie ilości leżą razem, wszystkie identyfikatory dostawców leżą razem. Pytanie o dwa pola dotyka dwóch wąskich pasm pliku i pomija resztę. Zapis pojedynczego rekordu jest niewygodny, bo plik trzeba zamknąć, zanim ktokolwiek go przeczyta, więc kolumny zapisuje się paczkami.
Avro to układ wierszowy ze schematem, który podróżuje z danymi. Parquet to układ kolumnowy ze statystykami, które pozwalają czytelnikowi pominąć to, czego nie potrzebuje. Żaden z nich nie wie o drugim i żaden nie wie, czy należy do tabeli; to praca formatu tabeli nad nimi, opisana w tekście stan bieżący i zapis.
Zdarzenie: wiersz z umową
Kiedy przyjęcie opuszcza moduł magazynu, jest komunikatem. Każdy moduł, który je czyta, musi się zgadzać co do znaczenia pól, a ta zgoda musi przetrwać dzień, w którym ktoś doda pole. Avro niesie tę zgodę razem z komunikatem: schemat jest w JSON, rekord jest zwartym binarnym wierszem, a specyfikacja określa, jak czytelnik z jedną wersją schematu rozwiązuje rekord zapisany inną. Pole, którego czytelnik nie zna, jest pomijane. Pole, którego czytelnik oczekuje, a pisarz nie wysłał, dostaje wartość domyślną ze schematu czytelnika albo odczyt kończy się błędem i mówi dlaczego. Aktualne wydanie to 1.12.2 (blog projektu, sprawdzono 21.10.2026).
W systemie, w którym agenci rozbudowują moduły, ta reguła rozwiązywania jest różnicą między zmianą bezpieczną a taką, która zatrzymuje moduł o trzeciej nad ranem. Jak zmiana schematu przechodzi przez propozycję, kontrolę zgodności i zatwierdzenie, opisuje tekst Apache Avro: umowa między modułami.
Zdarzenie nie pozostaje zdarzeniem. Gdy przyjmą je moduły, które go potrzebują, to samo przyjęcie zostaje zapisane do zapisu, a stamtąd będzie czytane w zupełnie inny sposób.
Zapis: kolumny, które czyta superinteligencja
Superinteligencja nie pyta o jedno przyjęcie. Pyta o wzorzec we wszystkich przyjęciach od jednego dostawcy, we wszystkich zamówieniach jednego kwartału, w każdej niezgodności na jednej rewizji pozycji. To pytania o kilka pól w wielu wierszach i do tego zbudowany jest Parquet: plik dzieli się na grupy wierszy, każda grupa na jeden kawałek na kolumnę, każdy kawałek na strony, a stopka opisuje, gdzie co leży. Czytelnik prosi o dwie kolumny i dostaje dwie kolumny. Każda grupa wierszy niesie wartości minimalne i maksymalne, więc całe odcinki pliku są pomijane, gdy pytanie dotyczy jednego dostawcy. Specyfikacja formatu ma wersję 2.14.0 (blog projektu, sprawdzono 21.10.2026).
Sedno dla systemu suwerennego to koszt. Zapis żyje na infrastrukturze, którą firma wybiera, a za każde pytanie superinteligencji płaci się przeczytanymi bajtami i czasem procesora na tej infrastrukturze. Zapis ułożony w kolumny, skompresowany słownikiem i posortowany po polach, po których filtruje większość pytań, to zapis, na którego czytanie przez agentów firmę stać tak często, jak trzeba. Jak układ wewnątrz jednego pliku zamienia się w ten koszt, opisuje tekst Apache Parquet: jak ułożony jest zapis.
Gdzie zapada podział
| Fakt jest | Kształt | Format w warstwie Data |
|---|---|---|
| W drodze między modułami albo z konektora | jeden cały rekord, teraz | Avro, pod zarejestrowanym schematem |
| W zapisie, czytany przez agentów i ludzi | wiele rekordów, kilka pól | Parquet, wewnątrz formatu tabeli |
| Przychodzi pojedynczo, ale czytany hurtowo później | oba, po kolei | Avro na wejściu, paczkowane do Parquet |
Trzeci wiersz to miejsce, gdzie jest najwięcej inżynierii. Zdarzenia przychodzą pojedynczo; Parquet chce paczek. Coś musi zebrać minutę albo godzinę zdarzeń, zapisać je jako jeden plik i powiedzieć tabeli, który plik jest nowy. Rób to za często, a zapis staje się stertą drobnych plików, które wolno się czyta. Rób to za rzadko, a agent, który potrzebuje dzisiejszych przyjęć, czyta wczorajszy zapis. Odstęp jest decyzją o tym, które pytania muszą być świeże, i jest to decyzja człowieka, a nie wartość domyślna.
Co agent może tu zmienić, a czego nie
Agenci rozbudowują Hurukana i warstwa Data nie jest wyjątkiem. Agent może zaproponować nowe pole w zdarzeniu przyjęcia, przygotować zadanie paczkujące, które składa zdarzenia do zapisu, albo zasugerować posortowanie tabeli po dostawcy, bo ostatni miesiąc pytań filtrował właśnie po nim. Każda z tych rzeczy jest propozycją z dołączonym uzasadnieniem i każda zostaje zapisana.
Dwie rzeczy zostają przy ludziach. Sama umowa: zmiana schematu zdarzenia to zmiana porozumienia między modułami i zatwierdza ją właściciel modułu odbierającego. I kształt zapisu: jak długo zdarzenia są przechowywane, które pola opuszczają zapis na żądanie usunięcia i jak często zamykają się paczki. To decyduje o koszcie i zobowiązaniach, a agent nie podpisuje się pod żadnym z nich.
Test, który możesz zrobić dziś
Weź jeden fakt, który dziś przechodzi między dwoma systemami w Twojej firmie: potwierdzenie zamówienia albo przyjęcie towaru. Zapisz trzy rzeczy: gdzie zdefiniowana jest lista jego pól, kto zostałby poinformowany o dodaniu pola i gdzie ten sam fakt jest później czytany hurtowo do raportu.
Jeśli lista pól jest zdefiniowana w dwóch miejscach, umowy jeszcze nie ma. Jeśli nikt nie zostałby poinformowany, następne dodane pole zepsuje coś po cichu. Jeśli hurtowe czytanie odbywa się na tym samym magazynie, który przyjmuje zdarzenia, dwa kształty dzielą jeden układ i jeden z nich za to płaci. Strona warstwy Data opisuje, gdzie ma mieszkać każdy kształt; przegląd Hurukana pokazuje warstwy wokół niej.
- Apache Parquet
- Apache Avro
- umowy zdarzeń
- zapis
- warstwa danych