Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!
Snowflake to jedno z tych pojęć, które w ogłoszeniach o pracę i na konferencjach pojawia się coraz częściej, a mimo to wiele osób nie potrafi krótko powiedzieć, czym właściwie jest. Baza danych? Hurtownia? Kolejna chmura? W tym przewodniku wyjaśnimy to po kolei, bez żargonu i na prawdziwych przykładach. Wszystkie zrzuty pochodzą z żywego konta Snowflake, na którym naprawdę uruchamialiśmy zapytania, więc widzisz autentyczne wyniki.
Snowflake to hurtownia danych działająca w chmurze i dostarczana jako usługa (ang. Software as a Service, w skrócie SaaS, czyli gotowe oprogramowanie, z którego korzystasz przez przeglądarkę, bez instalowania i utrzymywania go u siebie). Mówiąc prościej: to miejsce, w którym firma trzyma duże ilości danych i zadaje im pytania językiem SQL, a całą maszynerię pod spodem, czyli serwery, dyski, aktualizacje i kopie zapasowe, utrzymuje dostawca. Ty logujesz się do przeglądarki i pracujesz z danymi.
Hurtownia danych (ang. data warehouse) to wyspecjalizowana baza, w której gromadzi się dane z wielu systemów firmy po to, żeby je analizować: liczyć raporty, budować pulpity, szukać wzorców. Różni się od zwykłej bazy aplikacyjnej tym, że jest zoptymalizowana pod ciężkie zapytania analityczne przechodzące przez miliony wierszy, a nie pod pojedyncze, szybkie operacje typu „dodaj zamówienie". Snowflake jest właśnie taką hurtownią, tyle że w całości w chmurze.
Warto od razu rozwiać trzy nieporozumienia. Snowflake nie jest programem, który się instaluje na własnym serwerze, bo działa wyłącznie w chmurze. Snowflake nie jest przywiązany do jednej chmury: to samo konto możesz założyć na infrastrukturze Amazona (AWS), Microsoftu (Azure) albo Google (GCP), a sposób pracy jest identyczny. I wreszcie Snowflake nie jest kolejnym silnikiem, który trzeba stroić ręcznie: nie zakładasz w nim indeksów, nie planujesz partycji, nie dobierasz parametrów serwera. Większość tej pracy platforma bierze na siebie, a Ty skupiasz się na danych i na pytaniach, które chcesz im zadać.
Darmowe konto próbne z zapasem kredytów założysz w kilka minut na signup.snowflake.com, bez podawania karty płatniczej. Pierwsze, co widzimy po zalogowaniu, to Snowsight, czyli przeglądarkowy interfejs Snowflake. To z niego pisze się zapytania, przegląda dane, buduje pulpity i zarządza kontem. Poniżej jego strona główna zaraz po założeniu darmowego konta próbnego:
Skąd w ogóle wziął się Snowflake? Powstał z prostego spostrzeżenia: klasyczne hurtownie danych łączyły na sztywno moc obliczeniową z dyskami. Jeśli chciałeś liczyć szybciej, musiałeś dokupić większy serwer razem z dyskami, nawet jeśli danych wcale nie przybyło. A gdy dwa zespoły odpytywały hurtownię naraz, wchodziły sobie w drogę i czekały w kolejce. Snowflake rozwiązał to, rozdzielając te dwie rzeczy od siebie. To jest sedno całej platformy i właśnie od architektury zaczniemy.
Snowflake jest zbudowany z trzech niezależnych warstw. To nie jest szczegół dla inżynierów, tylko klucz do zrozumienia, dlaczego platforma działa tak, jak działa. Każda warstwa skaluje się osobno i odpowiada za inną część pracy.
Na samym dole są dane. Snowflake trzyma je w chmurze obiektowej, czyli w usłudze do przechowywania plików w chmurze (na przykład Amazon S3), i sam zajmuje się ich organizacją. Zapisuje je w formacie kolumnowym, mocno je kompresuje i dzieli na małe fragmenty zwane micro-partycjami, o których opowiemy dokładniej przy okazji wydajności. Ważne jest jedno: tych danych nie widzisz jako plików i nie musisz nimi zarządzać. Dla Ciebie to po prostu tabele, do których piszesz SQL.
Nad danymi jest moc obliczeniowa (ang. compute), która wykonuje zapytania. W Snowflake dostarczają jej wirtualne magazyny (ang. warehouses), czyli klastry serwerów uruchamiane na żądanie. To one czytają dane, łączą tabele, liczą sumy i zwracają wynik. Magazynów może działać wiele naraz i, co najważniejsze, są od siebie niezależne. Za chwilę poświęcimy im osobną sekcję, bo to najczęściej mylona część Snowflake.
Na górze jest warstwa, która spina całość. To ona przyjmuje Twoje logowanie, pilnuje uprawnień, przechowuje informacje o tym, jakie masz tabele i co w nich jest (tak zwane metadane, czyli dane o danych), planuje i optymalizuje zapytania oraz dba o spójność transakcji. Nazywamy ją mózgiem, bo sama nic nie liczy, ale steruje tym, co robią pozostałe warstwy. Działa w tle i zwykle w ogóle o niej nie myślisz, a to dobrze, bo to znak, że robi swoje.
Dlaczego ten podział jest tak istotny? Bo pozwala skalować każdą warstwę osobno. Masz dużo danych, ale liczysz rzadko? Płacisz głównie za składowanie, a moc włączasz na chwilę. Masz mało danych, ale liczysz je intensywnie i przez wielu użytkowników naraz? Dokładasz mocy obliczeniowej, nie ruszając składowania. W klasycznej hurtowni jedno ciągnęło drugie. Tutaj są rozłączone.
To jest pojęcie, które najłatwiej zrozumieć na przykładzie, więc spójrzmy na listę magazynów na naszym koncie. Widać na niej trzy magazyny w rozmiarze X-Small. Jeden ma status Started, bo przed chwilą liczyliśmy na nim zapytanie z początku artykułu, a dwa pozostałe są Suspended, czyli uśpione, i nie generują żadnego kosztu.
Rozmiar magazynu decyduje o jego mocy. Zaczyna się od X-Small, a kolejne rozmiary, Small, Medium, Large i dalej, to za każdym razem mniej więcej podwojenie mocy obliczeniowej. Zmiana rozmiaru to jedno kliknięcie, bez przenoszenia danych i bez przerwy w pracy:
Najciekawsze jest to, jak magazyny się włączają i wyłączają. Możesz ustawić, żeby magazyn sam się usypiał po chwili bezczynności (auto-suspend) i sam wybudzał przy pierwszym zapytaniu (auto-resume). Dzięki temu nie płacisz za moc, której nikt nie używa. Poniższa animacja pokazuje ten cykl: powiększamy magazyn na czas ciężkiej pracy, a gdy nikt nie odpytuje, magazyn gaśnie i koszt obliczeń spada do zera.
Definicję magazynu zapisuje się zwykłym poleceniem SQL, więc całą tę logikę możesz mieć opisaną w kodzie i wersjonowaną razem z projektem:
-- Magazyn, ktory sam sie usypia po minucie bezczynnosci
CREATE WAREHOUSE analityka
WAREHOUSE_SIZE = 'X-SMALL'
AUTO_SUSPEND = 60 -- uspij po 60 sekundach ciszy
AUTO_RESUME = TRUE; -- wznow sam przy pierwszym zapytaniu
Skoro moc obliczeniowa jest oddzielona od danych, wynika z tego coś bardzo praktycznego: kilka zespołów może pracować na tych samych danych jednocześnie, każdy na własnym magazynie, nie wchodząc sobie w drogę. W klasycznej hurtowni ciężki raport potrafił spowolnić pracę wszystkich, bo wszyscy dzielili tę samą moc. W Snowflake każdy zespół dostaje osobne mięśnie, a dane pozostają jedną, wspólną kopią.
To rozwiązuje jeden z najstarszych bólów hurtowni danych: konflikt między tymi, którzy dane ładują, a tymi, którzy je analizują. Nocny proces ładowania może działać na swoim magazynie, analitycy na swoim, a zespół uczenia maszynowego na jeszcze innym. Jeśli któryś z magazynów okaże się za mały, powiększasz tylko jego, nie ruszając reszty. Dane cały czas są jedne i te same, więc nie ma mowy o rozjeżdżających się kopiach.
Od strony użytkownika Snowflake to przede wszystkim pisanie SQL w przeglądarce. Zapytanie z początku artykułu policzyło roczne przychody wg segmentu rynku na zbiorze przykładowym, który Snowflake udostępnia każdemu nowemu kontu. Oto dokładnie to zapytanie, gotowe do skopiowania:
-- Roczne przychody wg segmentu rynku (dane przykladowe TPC-H, ~1,5 mln zamowien)
SELECT YEAR(o_orderdate) AS rok,
c_mktsegment AS segment,
ROUND(SUM(o_totalprice)/1000000, 1) AS przychod_mln_usd,
COUNT(*) AS liczba_zamowien
FROM snowflake_sample_data.tpch_sf1.orders o
JOIN snowflake_sample_data.tpch_sf1.customer c
ON c.c_custkey = o.o_custkey
GROUP BY rok, segment
ORDER BY rok, segment;
Zwróć uwagę, że to zwykły, standardowy SQL. Nie ma tu niczego specyficznego dla Snowflake poza nazwą zbioru danych. Ktokolwiek zna SQL z innej bazy, odnajdzie się tu od pierwszej minuty, i to jedna z głównych przyczyn popularności platformy.
Wynik nie musi zostać suchą tabelą. W Snowsight ten sam rezultat jednym kliknięciem zamieniamy na wykres, bez eksportowania danych do innego narzędzia. Poniżej ten sam zestaw przychodów pokazany jako wykres słupkowy wg segmentu:
Dane w Snowflake są zorganizowane w bazy i schematy, czyli foldery na tabele. Wbudowany eksplorator pokazuje tę strukturę i pozwala przeglądać zawartość konta. Na naszym zrzucie widać rozwinięty zbiór przykładowy z kilkoma schematami w różnych rozmiarach:
Wróćmy do pytania, które zadaje sobie każdy, kto przesiada się na Snowflake z klasycznej bazy: skoro nie zakładam indeksów ani nie planuję partycji, to skąd bierze się szybkość? Odpowiedzią są micro-partycje.
Snowflake sam, bez Twojego udziału, dzieli każdą tabelę na wiele małych, skompresowanych fragmentów zwanych micro-partycjami. Dla każdego z nich zapamiętuje, jakie wartości się w nim znajdują, na przykład najmniejszą i największą datę czy kwotę. Dzięki temu, gdy pytasz o konkretny zakres, silnik od razu wie, które fragmenty w ogóle mogą zawierać wynik, a resztę pomija. Zamiast czytać całą tabelę, czyta jej ułamek.
To dlatego w Snowflake zwykle nie zakłada się indeksów. Ten mechanizm działa z automatu na każdej tabeli i w większości przypadków wystarcza. Efekt widać na liczbach. Nasze zapytanie łączące półtora miliona zamówień z bazą klientów policzyło się poniżej dwóch sekund, a gdy zajrzymy w jego szczegóły, zobaczymy dokładnie, ile trwało i na jakim magazynie:
Jeśli zapytanie działa wolno, Snowflake pokazuje jego profil wykonania, czyli rozbicie na kolejne kroki (odczyt tabel, łączenie, grupowanie) wraz z udziałem każdego z nich w czasie. To pierwsze miejsce, do którego zagląda się przy optymalizacji:
Wszystkie zapytania, które kiedykolwiek uruchomiono na koncie, trafiają do historii. Można je filtrować, przeszukiwać i wracać do nich później, co jest bezcenne przy rozliczaniu kosztów i szukaniu tego jednego zapytania, które zamula system:
Poza samym liczeniem SQL Snowflake ma kilka funkcji, które w codziennej pracy robią dużą różnicę. Nie sposób omówić tu wszystkich, więc wybraliśmy te, o które najczęściej pytają uczestnicy naszego szkolenia z Snowflake.
Snowflake przez zadany czas pamięta wcześniejsze wersje danych. Możesz odpytać tabelę taką, jaka była godzinę czy dzień temu, a nawet przywrócić tabelę skasowaną przez pomyłkę. Pomyłkowy UPDATE albo DROP przestaje być katastrofą, bo do stanu sprzed błędu wracasz jednym zapytaniem.
W praktyce wygląda to tak jak niżej. Pierwsze zapytanie pokazuje dane sprzed godziny, drugie przywraca właśnie usuniętą tabelę:
-- Tabela taka, jaka byla godzine temu
SELECT * FROM zamowienia AT(OFFSET => -3600);
-- Ups, skasowalismy tabele. Przywracamy ja jednym poleceniem
UNDROP TABLE zamowienia;
Snowflake pozwala udostępnić dane innej firmie lub innemu kontu bez wysyłania plików i bez robienia kopii. Odbiorca widzi u siebie zawsze aktualne dane, a Ty zachowujesz nad nimi kontrolę. Dokładnie tak działa zbiór przykładowy, który odpytywaliśmy: nie został skopiowany na nasze konto, tylko udostępniony przez Snowflake, co widać w jego szczegółach jako pole „Shared by" na jednym z wcześniejszych zrzutów. Wokół tego mechanizmu wyrósł Snowflake Marketplace, czyli miejsce, gdzie firmy wymieniają się gotowymi zbiorami danych.
Snowflake radzi sobie nie tylko z klasycznymi tabelami. Dane półstrukturalne, na przykład w formacie JSON (popularny sposób zapisu danych, w którym wartości opisane są nazwami), można wczytać do specjalnej kolumny i odpytywać SQL-em bez wcześniejszego rozkładania ich na kolumny:
-- 'dane' to kolumna typu VARIANT, w ktorej siedzi cale JSON
SELECT dane:klient.miasto::string AS miasto,
dane:kwota::number AS kwota
FROM zdarzenia;
Kto woli programować, może pracować z danymi w Pythonie przy pomocy biblioteki Snowpark, w której zapytania pisze się w kodzie, a wykonują się po stronie Snowflake, blisko danych. Do tego dochodzi warstwa funkcji sztucznej inteligencji (Snowflake Cortex), która pozwala wołać gotowe modeli językowe wprost z SQL. To już temat na osobny artykuł, ale warto wiedzieć, że platforma daleko wyszła poza samo raportowanie.
Rozliczenia w Snowflake bywają źródłem nieporozumień, więc uprośćmy je do dwóch niezależnych osi. Płacisz osobno za moc obliczeniową i osobno za składowanie danych.
Moc obliczeniową rozlicza się w kredytach. Magazyn zużywa je tylko wtedy, gdy pracuje, a naliczanie idzie co sekundę. Większy magazyn zużywa więcej kredytów na godzinę, ale ciężkie zapytanie kończy na nim szybciej, więc bywa, że większy rozmiar wychodzi podobnie kosztowo, za to daje wynik wcześniej. Kluczowe jest to, że uśpiony magazyn nie kosztuje nic, dlatego auto-suspend jest tak ważny.
Składowanie danych to zupełnie osobna opłata, liczona ryczałtem za terabajt miesięcznie, podobnie jak za dysk w chmurze. Ponieważ Snowflake mocno kompresuje dane, w praktyce zajmują one mniej miejsca niż w zwykłej bazie. Dzięki rozdzieleniu tych dwóch osi możesz trzymać ogromne ilości danych stosunkowo tanio i płacić więcej tylko wtedy, gdy naprawdę je przeliczasz.
Snowflake nie jest odpowiedzią na każdy problem z danymi, więc warto wiedzieć, do czego pasuje, a do czego lepiej wziąć coś innego.
Sprawdzi się, gdy masz dużo danych z wielu systemów i chcesz je wspólnie analizować, gdy zależy Ci na tym, by nie utrzymywać serwerów samodzielnie, gdy wiele zespołów potrzebuje pracować na tych samych danych naraz, oraz gdy obciążenie jest nierówne, raz spokojnie, raz skokowo, bo wtedy model płatności za użycie naprawdę się opłaca.
Będzie gorszym wyborem jako baza pod aplikację obsługującą tysiące drobnych, pojedynczych zapytań na sekundę, bo do tego służą bazy operacyjne takie jak PostgreSQL. Nie jest też darmowy, więc przy małych, prostych zbiorach danych zwykła baza często wystarczy taniej. I choć upraszcza bardzo wiele, nie zwalnia z myślenia o kosztach, bo łatwość skalowania działa w obie strony.
Najlepszą wiadomością jest to, że próg wejścia jest niski. Snowflake udostępnia bezpłatne konto próbne z zapasem kredytów, a wszystkie zrzuty w tym artykule powstały właśnie na takim koncie. Zakładasz je w kilka minut, dostajesz gotowy zbiór przykładowy i możesz od razu pisać zapytania w przeglądarce, bez instalowania czegokolwiek.
Sensowna kolejność nauki wygląda tak. Najpierw dobrze opanuj SQL, bo to fundament pracy w Snowflake. Potem zrozum architekturę trzech warstw i wirtualne magazyny, bo bez tego trudno panować nad wydajnością i kosztami. Następnie naucz się ładować własne dane i modelować je w tabele. Na koniec zajmij się rzeczami, które odróżniają Snowflake od zwykłej bazy: Time Travel, współdzieleniem, danymi półstrukturalnymi i bezpieczeństwem. Najszybciej przechodzi się tę drogę na żywym koncie, pod okiem kogoś, kto pokaże także pułapki, których na własnej skórze wolałbyś uniknąć.
Snowflake to hurtownia danych w chmurze dostarczana jako usługa, której siła bierze się z jednego pomysłu: rozdzielenia mocy obliczeniowej od składowania danych. Dane leżą w jednej, wspólnej warstwie, a liczą je niezależne wirtualne magazyny, które włączasz, powiększasz i usypiasz zależnie od potrzeb, płacąc tylko za czas realnej pracy. Nad tym wszystkim czuwa warstwa usług, która planuje zapytania, pilnuje uprawnień i spójności. Zapytania są szybkie dzięki automatycznym micro-partycjom, a nie ręcznemu strojeniu, a funkcje takie jak Time Travel czy współdzielenie danych rozwiązują problemy, z którymi klasyczne hurtownie radziły sobie z trudem. Dla firmy oznacza to mniej utrzymania infrastruktury i elastyczne koszty, a dla osoby pracującej z danymi znajomy SQL w przeglądarce i platformę, która skaluje się razem z ambicjami. To właśnie jest Snowflake i do tego służy.
Komentarze (0)
Brak komentarzy...