Blog JSystems - uwalniamy wiedzę!

Szukaj

W tym artykule przechodzimy przez ten stos warstwa po warstwie i pokazujemy każdy element na żywo: zrzuty pochodzą z prawdziwego klastra Apache Spark, prawdziwego magazynu obiektowego MinIO, działającego brokera Apache Kafka i silnika zapytań Trino, które postawiliśmy na potrzeby tego tekstu. Bez slajdów poglądowych tam, gdzie da się pokazać realne wyjście.

Mapa nowoczesnego stosu danych

Zacznijmy od lotu ptaka. Dane wpływają ze źródeł operacyjnych (aplikacje, urządzenia, logi, bazy transakcyjne), trafiają do taniego składowania obiektowego, są przetwarzane wsadowo (czyli porcjami, ang. batch) i strumieniowo (na bieżąco), zapisywane w transakcyjnym formacie tabel, a na końcu udostępniane przez wspólny SQL do raportów i modeli uczenia maszynowego.

Krajobraz Big Data 2026: źródła, Kafka, MinIO, Spark, Delta/Iceberg, Trino, BI/ML
Współczesny stos Big Data od źródła do decyzji - każda warstwa ma jedno zadanie.

W skrócieWspółczesny stos Big Data zatarł granicę między hurtownią danych a jeziorem danych: dane leżą w tanim magazynie obiektowym, a warstwa tabelaryczna daje im porządek i transakcyjność. Do tego dochodzi przetwarzanie w Apache Spark, strumienie w Kafce i zapytania w Trino.

Przez lata świat dużych zbiorów danych dzielił się prosto: albo hurtownia danych (uporządkowana, droga, świetna do raportów), albo „jezioro danych" (data lake - tanie składowisko plików, ale bez ładu). W 2026 roku ta granica się zatarła. Powstał spójny zestaw narzędzi, w którym tanie składowanie obiektowe, rozproszone przetwarzanie, transakcyjne tabele i jeden wspólny język SQL grają w jednej drużynie.

Kluczowa zmiana ostatnich lat: te warstwy przestały być osobnymi światami. Ten sam zbiór danych obsługujemy wsadowo i strumieniowo, trzymamy go tanio w obiektach, a mimo to mamy nad nim transakcje i jeden język zapytań. Zobaczmy każdą warstwę z osobna.

Jeśli sam język SQL chcesz dopiero opanować od podstaw, przygotowaliśmy bezpłatny kurs SQL w Microsoft SQL Server prowadzący przez składnię krok po kroku.

Fundament: tanie składowanie obiektowe

Podstawą jest składowanie obiektowe (object storage) - sposób przechowywania danych jako „obiektów" w pojemnikach zwanych kubełkami (ang. bucket), dostępny przez proste API zgodne z Amazon S3. Jest tanie, praktycznie nieograniczone i oddziela miejsce przechowywania danych od mocy obliczeniowej. W chmurze to Amazon S3, Google Cloud Storage czy Azure Blob; lokalnie i prywatnie - MinIO, które jest zgodne z tym samym API S3.

Co konkretnie tu leży? Na potrzeby artykułu posłużył nam zbiór RetailLab - dane fikcyjnej sieci handlowej, które będziemy przetwarzać w dalszych sekcjach. To ponad ćwierć miliona transakcji sprzedaży (z datą, sklepem, produktem, ilością, ceną i kanałem), słownik 6 sklepów w polskich regionach oraz katalog 30 produktów z kategoriami. Tak wygląda ten zbiór wczytany przez Spark wprost z magazynu obiektowego:

Zbiór RetailLab: 263 323 transakcje, 6 sklepów, 30 produktów - schemat tabeli sprzedaży i próbka danych
Zbiór RetailLab w magazynie obiektowym - 263 323 transakcje, 6 sklepów i 30 produktów: schemat tabeli sprzedaży oraz próbka danych odczytane przez Spark.

Na potrzeby artykułu Spark zapisał tu komplet danych w formacie kolumnowym Parquet (skompresowany, zoptymalizowany pod analitykę). Poniżej konsola MinIO z plikami tabeli oraz katalogiem dziennika transakcji _delta_log - czyli cały lakehouse leży wprost na zwykłym magazynie obiektowym:

Konsola MinIO: bucket lakehouse z plikami Parquet i katalogiem _delta_log
Magazyn obiektowy MinIO (zgodny z S3): pliki Parquet tabeli i dziennik transakcji Delta - fundament lakehouse.

Silnik obliczeń: Apache Spark

Apache Spark to silnik rozproszonego przetwarzania danych - dzieli pracę na wiele maszyn (węzłów) i liczy je równolegle. W trybie klastra mamy węzeł zarządzający (master) i węzły robocze (workery), które wykonują zadania na swoich rdzeniach. Postawiliśmy mały klaster: jeden master i dwa workery, razem cztery rdzenie. Tak wygląda jego panel w trakcie pracy zadania:

Panel Spark Master: 2 żywe workery, 4 rdzenie, działająca aplikacja
Panel Apache Spark - dwa żywe workery, cztery rdzenie i aplikacja licząca rozłożona na klaster.

Na tym klastrze policzyliśmy rozproszoną agregację na zbiorze ponad ćwierć miliona transakcji: liczbę wierszy oraz przychód i średni koszyk w podziale na regiony. Cały skrypt analiza.py jest krótki - łączy się z klastrem, wczytuje sprzedaż i sklepy, liczy transakcje rozproszonym count() i agreguje wynik w podziale na regiony:

from pyspark.sql import SparkSession, functions as F

# połączenie z klastrem standalone (master + 2 workery)
spark = (SparkSession.builder
         .appName("RetailLab - rozproszona analiza sprzedaży")
         .master("spark://192.168.1.210:7077")
         .config("spark.cores.max", "4")
         .getOrCreate())

# wczytanie danych wprost z magazynu obiektowego
sales  = spark.read.option("header", True).option("inferSchema", True).csv("/opt/data/sales.csv")
stores = spark.read.option("header", True).option("inferSchema", True).csv("/opt/data/stores.csv")

# rozproszony count - Spark liczy go na wszystkich workerach naraz
print("sales.count() =", sales.count())

# przychod, liczba transakcji i sredni koszyk w podziale na regiony
enr = sales.withColumn("amount", F.round(F.col("qty") * F.col("unit_price"), 2))
raport = (enr.join(stores, "store_id")
          .groupBy("region")
          .agg(F.round(F.sum("amount"), 2).alias("przychod"),
               F.count("*").alias("transakcje"),
               F.round(F.avg("amount"), 2).alias("sr_koszyk"))
          .orderBy(F.desc("przychod")))
raport.show(truncate=False)

Uruchamiamy go na klastrze poleceniem spark-submit, a Spark sam rozsyła obliczenia na workery i zbiera wynik:

Wynik zadania PySpark: count 263323 oraz przychód per region
Rozproszone zadanie PySpark - count() na 263 323 transakcjach i agregacja przychodu per region.

Warstwa SQL i wspólny katalog: Apache Hive

Apache Hive to najstarszy sposób na SQL nad wielkimi zbiorami plików. Powstał po to, by analitycy pisali zwykłe zapytania (HiveQL - dialekt SQL) zamiast programów w MapReduce. Dziś, w stosie z 2026 roku, jego najważniejszą rolą jest Hive Metastore: wspólny katalog (rejestr) tabel, który opisuje pliki w magazynie obiektowym - nazwy kolumn, typy, partycje i lokalizacje. Z tego samego katalogu korzystają też Spark i Trino, dlatego to on spina cały stos w jedną całość.

Hive Metastore jako wspólny katalog tabel dla Hive, Spark i Trino nad plikami w magazynie obiektowym
Hive Metastore - jeden katalog tabel nad plikami, z którego korzystają Hive, Spark i Trino.

Na potrzeby tej sekcji postawiliśmy Apache Hive 4.0.1 i nałożyliśmy tabelę wprost na te same pliki RetailLab, które liczył wcześniej Spark. Hive pracuje w modelu schema-on-read („najpierw dane, potem schemat”): polecenie CREATE EXTERNAL TABLE niczego nie kopiuje - mówi tylko Hive, jak odczytać pliki jako tabelę.

-- Hive naklada schemat na pliki w magazynie obiektowym (schema-on-read)
CREATE EXTERNAL TABLE sales (
  sale_id     INT,
  sale_date   DATE,
  store_id    INT,
  product_id  INT,
  qty         INT,
  unit_price  DOUBLE,
  channel     STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION 's3a://lakehouse/sales';
Hive DESCRIBE tabeli sales - schemat nalozony na pliki: sale_id, sale_date, store_id, product_id, qty, unit_price, channel
Schema-on-read - DESCRIBE pokazuje te same kolumny, które czytał Spark w poprzedniej sekcji.

Na tym samym zbiorze 263 323 transakcji Hive liczy zwykłym SQL. Zapytania kompiluje do zadań rozproszonych i wykonuje na silniku Tez - następcy wolnego MapReduce, który ogranicza kosztowne zapisy na dysk między krokami. Najpierw prosty COUNT, żeby potwierdzić, że to dokładnie ten sam zbiór danych:

Hive COUNT na zbiorze RetailLab - wynik 263 323 transakcje
Ten sam zbiór co w sekcji Spark - Hive naliczył dokładnie 263 323 transakcje.

A tu realna agregacja wsadowa: liczba transakcji i sprzedanych sztuk w podziale na kanał sprzedaży. Hive uruchamia ją jako zadanie Tez i zwraca wynik w ułamku sekundy:

Hive GROUP BY wg kanalu na 263 323 wierszach - transakcje i sztuki dla kanalow sklep, online, mobile
Agregacja HiveQL na 263 323 wierszach - GROUP BY wg kanału, policzony przez silnik Tez.

To nie jest zabawka - pod spodem pracuje prawdziwy serwer. Panel HiveServer2 pokazuje nasze zapytania RetailLab z kolumną silnika wykonawczego (tez), każde zakończone statusem FINISHED:

Panel HiveServer2 - lista zapytan HiveQL na zbiorze RetailLab wykonanych na silniku Tez, status FINISHED
Panel HiveServer2 - realne zapytania HiveQL na zbiorze RetailLab, wykonane na silniku Tez.

Skoro Spark też potrafi SQL, po co jeszcze Hive? Bo to dwie różne role. Hive to warstwa hurtowni i wspólny katalog - najlepszy do wsadowej analityki w czystym SQL i do trzymania definicji tabel. Spark to ogólny silnik obliczeniowy - wygrywa przy wielokrokowych potokach, strumieniach i uczeniu maszynowym. W praktyce nie jest to wybór albo-albo: Spark potrafi czytać tabele zdefiniowane w Hive Metastore, więc Hive bywa katalogiem, a Spark silnikiem - na tych samych danych, bez przepisywania czegokolwiek.

Lakehouse: hurtownia i jezioro w jednym

Samo wrzucenie plików do magazynu obiektowego daje jezioro danych - tanie, ale bez gwarancji spójności: brak transakcji, łatwo o bałagan (tzw. „data swamp", czyli bagno danych). Hurtownia daje porządek i szybki SQL, ale jest droga i słabo radzi sobie z plikami oraz uczeniem maszynowym. Lakehouse łączy zalety obu: transakcyjne tabele wprost na tanim składowaniu obiektowym.

Porównanie: data warehouse, data lake i lakehouse
Hurtownia, jezioro i lakehouse - lakehouse bierze tanie składowanie z jeziora i rygor transakcji z hurtowni.

Magię lakehouse robią otwarte formaty tabel: Delta Lake i Apache Iceberg. To one dokładają do zwykłych plików Parquet dziennik transakcji, dzięki któremu dostajemy ACID (gwarancję, że operacja zapisu albo wykona się w całości, albo wcale - bez połowicznych, uszkodzonych stanów), wersjonowanie i ewolucję schematu.

Delta Lake - ACID i podróż w czasie

Na tej samej tabeli wykonaliśmy zapis, a potem operacje UPDATE i DELETE - coś, czego na surowych plikach w jeziorze zrobić się nie da bezpiecznie. Delta zapisała każdą zmianę jako kolejną wersję, a dzięki temu możliwa jest „podróż w czasie" (time travel) - odczyt tabeli w stanie sprzed zmian przez VERSION AS OF. Cały zapis i operacje to zwykły SQL na tabeli leżącej na MinIO:

# zapis tabeli sprzedaży w formacie Delta wprost na MinIO (S3)
sales.write.format("delta").mode("overwrite").save("s3a://lakehouse/sales_delta")
spark.sql("CREATE TABLE IF NOT EXISTS sales_delta "
          "USING delta LOCATION 's3a://lakehouse/sales_delta'")

# operacje ACID na plikach w jeziorze - na surowym Parquecie niemozliwe
spark.sql("UPDATE sales_delta SET amount = ROUND(amount*1.10, 2) WHERE product_id = 101")
spark.sql("DELETE FROM sales_delta WHERE qty = 1")

# historia: kazda zmiana to osobna wersja tabeli
spark.sql("DESCRIBE HISTORY sales_delta").show()

# podroz w czasie - odczyt stanu sprzed zmian (wersja 0)
spark.sql("SELECT COUNT(*) FROM sales_delta VERSION AS OF 0").show()
Delta Lake: UPDATE, DELETE, historia wersji i odczyt VERSION AS OF 0
Delta Lake - operacje ACID, historia wersji (WRITE, UPDATE, DELETE) i odczyt stanu sprzed zmian (wersja 0).

Zwróć uwagę: po DELETE tabela ma 118 590 wierszy, ale odczyt VERSION AS OF 0 nadal pokazuje pełne 263 323 - historia jest zachowana i audytowalna.

Apache Iceberg - migawki tabeli

Apache Iceberg rozwiązuje ten sam problem nieco inaczej: każda zmiana tworzy migawkę (snapshot) - spójny obraz tabeli w danym momencie. Tu zapisaliśmy tabelę, dopisaliśmy partię danych (append) i odczytaliśmy listę migawek wprost z metadanych tabeli:

# utworzenie tabeli Iceberg i zapis (katalog 'ice' wskazuje na s3a://lakehouse/iceberg)
sales.writeTo("ice.db.sales_ice").using("iceberg").createOrReplace()

# dopisanie kolejnej partii danych = nowa migawka (snapshot)
sales.where("qty >= 3").writeTo("ice.db.sales_ice").append()

# lista migawek wprost z metadanych tabeli
spark.sql("SELECT committed_at, snapshot_id, operation, "
          "summary['added-records'] AS added "
          "FROM ice.db.sales_ice.snapshots").show()
Apache Iceberg: migawki tabeli i liczba wierszy po dopisaniu partii
Apache Iceberg - dwie migawki (operacja append) widoczne w metadanych tabeli.

Porządek w lakehouse: architektura medallion

Żeby lakehouse nie zamienił się w bałagan, dane porządkuje się w trzy warstwy jakości - to tzw. architektura medallion. Surowe dane (bronze) lądują 1:1 ze źródła, warstwa silver je czyści i łączy, a warstwa gold zawiera gotowe agregaty i tabele pod raporty oraz modele:

Architektura medallion: warstwy bronze, silver, gold
Architektura medallion - trzy warstwy jakości danych w lakehouse, każda czystsza od poprzedniej.

Dane na bieżąco: streaming z Apache Kafka

Nie wszystko da się liczyć raz na dobę. Gdy dane mają wartość „teraz" (zamówienia, zdarzenia z aplikacji, telemetria), potrzebujemy przetwarzania strumieniowego - reagowania na zdarzenia w miarę, jak napływają. Sercem takich rozwiązań jest Apache Kafka - rozproszony dziennik zdarzeń, do którego producenci dopisują komunikaty, a konsumenci je odczytują.

Spark potrafi czytać Kafkę przez Structured Streaming - ten sam interfejs co do danych wsadowych, tyle że źródłem jest nieskończony strumień. Najpierw producent wysyła do tematu (topic) transakcje 300 zdarzeń sprzedażowych - każde to mały JSON z regionem, produktem, ilością i kwotą:

# producent: 300 zdarzeń sprzedażowych JSON -> temat "transakcje"
import json, random
from kafka import KafkaProducer   # pip install kafka-python

producer = KafkaProducer(bootstrap_servers="192.168.1.213:9092",
                         value_serializer=lambda v: json.dumps(v).encode())
regiony  = ["Mazowieckie", "Slaskie", "Malopolskie", "Pomorskie", "Dolnoslaskie"]
produkty = ["Laptop", "Monitor", "Klawiatura", "Dysk SSD", "Router"]

for _ in range(300):
    ilosc = random.randint(1, 5)
    cena  = random.choice([199, 299, 499, 899, 2999])
    producer.send("transakcje", {"region":  random.choice(regiony),
                                  "produkt": random.choice(produkty),
                                  "ilosc":   ilosc,
                                  "kwota":   round(ilosc * cena, 2)})
producer.flush()

Po stronie Sparka czytamy ten strumień jako źródło kafka, parsujemy JSON wg schematu i agregujemy zdarzenia na bieżąco w podziale na regiony - tym samym kodem, którym liczylibyśmy dane wsadowe:

from pyspark.sql import SparkSession, functions as F
from pyspark.sql.types import StructType, StructField, StringType, IntegerType, DoubleType

spark = SparkSession.builder.appName("Streaming - Kafka + Spark").getOrCreate()
schema = StructType([StructField("region",  StringType()),
                     StructField("produkt", StringType()),
                     StructField("ilosc",   IntegerType()),
                     StructField("kwota",   DoubleType())])

# źródło: nieskończony strumień rekordów z tematu Kafka
raw = (spark.readStream.format("kafka")
       .option("kafka.bootstrap.servers", "192.168.1.213:9092")
       .option("subscribe", "transakcje")
       .option("startingOffsets", "earliest").load())

# wartość rekordu Kafka to JSON - parsujemy go wg schematu
parsed = raw.select(F.from_json(F.col("value").cast("string"), schema).alias("d")).select("d.*")

# agregacja strumienia: liczba transakcji i przychód per region
agg = parsed.groupBy("region").agg(F.count("*").alias("transakcje"),
                                   F.round(F.sum("kwota"), 2).alias("przychod"))

query = agg.writeStream.outputMode("complete").format("console").start()
query.awaitTermination()
Spark Structured Streaming: odczyt z Kafki i agregacja strumienia per region
Spark Structured Streaming - odczyt strumienia z Apache Kafka i agregacja zdarzeń per region (300 zdarzeń, jeden mikrobatch).

Ten sam kod, drobna zmiana ustawień i z trybu „przetwórz dostępne i zakończ" przechodzimy w tryb ciągły, który dolicza wyniki przy każdej nowej porcji zdarzeń. To właśnie zaciera granicę między analizą wsadową a strumieniową.

Jeden SQL nad wieloma źródłami: Trino

Ostatnia warstwa to silnik zapytań. Trino (dawniej PrestoSQL) pozwala zadać jedno zapytanie SQL nad wieloma źródłami naraz - to tzw. federacja (federation): łączenie danych z różnych systemów bez ich wcześniejszego kopiowania w jedno miejsce. Każde źródło to osobny „katalog" (catalog).

Podłączyliśmy do Trino bazę operacyjną PostgreSQL oraz wbudowany generator danych testowych TPC-H. Kluczowa sztuczka to jedno zapytanie sięgające do obu źródeł naraz - zwykły UNION ALL łączący tabelę z PostgreSQL z tabelami benchmarku TPC-H:

-- każde podłączone źródło to osobny katalog
SHOW CATALOGS;        -- memory, postgresql, system, tpch

-- jedno zapytanie nad DWOMA źródłami naraz (federacja):
-- baza operacyjna PostgreSQL + benchmark TPC-H (lineitem = 6 mln wierszy)
SELECT zrodlo, wierszy FROM (
  SELECT 'PostgreSQL: zamowienia (operacyjne)' AS zrodlo, count(*) AS wierszy
  FROM postgresql.public.zamowienia
  UNION ALL
  SELECT 'TPC-H: orders (analityczne)',  count(*) FROM tpch.sf1.orders
  UNION ALL
  SELECT 'TPC-H: lineitem (analityczne)', count(*) FROM tpch.sf1.lineitem
) ORDER BY wierszy;

Trino sam sięga do PostgreSQL i do TPC-H, scala wyniki i zwraca jedną tabelę - bez kopiowania danych w jedno miejsce. Poniżej lista źródeł, zapytanie analityczne na 6 mln wierszy TPC-H oraz powyższa federacja w działaniu:

Trino: SHOW CATALOGS, zapytanie analityczne TPC-H i zapytanie federacyjne PostgreSQL + TPC-H
Trino - lista źródeł, analityka na 6 mln wierszy TPC-H i federacyjne zapytanie łączące PostgreSQL z TPC-H w jednym SQL.

To jest siła federacji: analityk pisze zwykły SQL, a silnik sam sięga do bazy operacyjnej, do plików w magazynie obiektowym i do hurtowni - bez budowania kolejnych kopii danych.

Kiedy w ogóle sięgać po bazę relacyjną, a kiedy po nierelacyjną, rozkładamy na czynniki pierwsze w wielkim porównaniu SQL kontra NoSQL.

Jak to się składa w całość

Poszczególne klocki układają się w spójny, nowoczesny stos danych:

Warstwa Narzędzie (przykład) Rola
Strumień zdarzeń Apache Kafka przyjmuje dane na bieżąco i rozdziela je do odbiorców
Składowanie MinIO / S3 tani, nieograniczony magazyn obiektowy na pliki danych
Przetwarzanie Apache Spark rozproszone obliczenia wsadowe i strumieniowe
Katalog i SQL wsadowy Apache Hive wspólny rejestr tabel (Metastore) i wsadowa analityka w SQL
Format tabel Delta Lake / Iceberg transakcje ACID, wersjonowanie i ewolucja schematu
Silnik zapytań Trino jeden SQL nad wieloma źródłami (federacja)

Najważniejszy wniosek na 2026 rok: nie trzeba wybierać między tanim jeziorem a uporządkowaną hurtownią. Lakehouse na tanim składowaniu obiektowym, ten sam silnik do wsadu i strumienia oraz wspólny, federacyjny SQL - to dziś standard, do którego zmierza większość zespołów danych. A wszystkie pokazane wyżej narzędzia są otwarte (open source) i można je uruchomić u siebie, dokładnie tak jak na zrzutach powyżej.

Zarządzana alternatywa: hurtownie w chmurze (BigQuery i Snowflake)

Cała powyższa układanka jest otwarta i postawisz ją u siebie - ale ktoś musi ją potem utrzymać: łatać, skalować i pilnować. Dlatego istnieje druga droga: wynająć gotową, w pełni zarządzaną hurtownię danych w chmurze, w której dostawca prowadzi wszystkie te warstwy za Ciebie. Ty piszesz tylko SQL, bez ani jednego serwera po swojej stronie. Ten rynek podzieliły między siebie dwie nazwy: Google BigQuery i Snowflake. Obie stoją na fundamentach, które znasz już z tego artykułu - są kolumnowe, rozmawiają zwykłym SQL i rozdzielają składowanie danych od mocy obliczeniowej - tyle że w formie gotowej usługi. Największa różnica między nimi dotyczy właśnie tego, skąd biorą moc do policzenia Twojego zapytania:

Animacja: droga zapytania w BigQuery (bezserwerowo, sloty w locie) i w Snowflake (hurtownia wirtualna wstaje, liczy, wyłącza się po bezczynności)
Ta sama praca, dwie filozofie mocy obliczeniowej - BigQuery przydziela ją niewidzialnie na czas zapytania, a Snowflake pozwala włączyć hurtownię o wybranym rozmiarze, policzyć i wyłączyć ją po bezczynności.

Google BigQuery - hurtownia bezserwerowa

BigQuery jest bezserwerowy (ang. serverless): nie ma tam nic, co włączasz albo rozmiarujesz. Piszesz zapytanie, klikasz Uruchom, a Google sam - na czas jego wykonania - dokłada moc z tysięcy maszyn i zwalnia ją, gdy skończysz. Te jednostki mocy nazywają się slotami, ale przydzielane są automatycznie, w tle. Zapłacisz za ilość danych, które przeskanowało zapytanie - nie za czas ani liczbę zapytań. Samo pisanie zapytań wygląda jak w każdej innej bazie: edytor u góry, tabela wyników pod spodem, tyle że bez wskazywania, skąd wziąć moc, bo dokłada się sama:

Konsola BigQuery: edytor z zapytaniem SQL i tabela wyników pod spodem
Konsola BigQuery - edytor zapytania u góry, wynik pod spodem, bez wyboru mocy obliczeniowej.

Ponieważ płacisz za przeskanowane dane, wygodna jest jedna rzecz: konsola pokazuje ten koszt zanim uruchomisz zapytanie, więc nigdy nie liczysz w ciemno. A że dane leżą kolumnami, płacisz tylko za te kolumny, o które faktycznie pytasz (dlatego SELECT * potrafi zaskoczyć na rachunku):

Edytor BigQuery z szacunkiem ilości danych do przetworzenia jeszcze przed uruchomieniem zapytania
BigQuery pokazuje szacunek przeskanowanych danych, zanim klikniesz Uruchom - koszt zapytania znasz z góry.

Snowflake - hurtownie wirtualne i izolacja obciążeń

Snowflake idzie inną drogą - daje Ci hurtownie wirtualne (ang. virtual warehouses). Hurtownia wirtualna to klaster obliczeniowy, który sam włączasz i któremu sam nadajesz rozmiar - od najmniejszego X-Small aż po 4X-Large. Większy liczy szybciej, ale zużywa proporcjonalnie więcej mocy. Płacisz tu za czas pracy włączonej hurtowni (w wewnętrznych jednostkach zwanych kredytami), dlatego kluczowe jest automatyczne wyłączanie po bezczynności - uśpiona hurtownia nie spala niczego. Na liście widać rozmiar i status każdej z nich:

Konsola Snowflake: lista hurtowni wirtualnych z kolumnami rozmiar i status
Lista hurtowni wirtualnych w konsoli Snowflake - kolumna rozmiaru pokazuje, jak dużą moc uruchamiasz; w BigQuery takiej listy nie ma, bo nie ma czym zarządzać.

Skoro sam tworzysz hurtownie, możesz mieć ich kilka naraz - i każda pracuje niezależnie na tych samych danych. To rozwiązuje bolączkę zwykłych baz, w których ciężki import albo jeden wielki raport potrafi spowolnić wszystkich pozostałych. Fachowo nazywa się to izolacją obciążeń (ang. workload isolation): zespół analityków dostaje swoją hurtownię, nocne ładowanie danych - swoją, a pulpity BI - jeszcze inną, i nie wchodzą sobie w drogę:

Infografika: trzy hurtownie wirtualne Snowflake (analitycy, ładowanie danych, pulpity BI) czytają niezależnie te same wspólne dane
Izolacja obciążeń w Snowflake - każdy rodzaj pracy dostaje własną hurtownię, wszystkie czytają te same dane, ale nie rywalizują o moc.

Jest jeszcze jedna cecha, której BigQuery nie ma: Snowflake działa na trzech chmurach - Amazon AWS, Microsoft Azure oraz Google Cloud - podczas gdy BigQuery jest dostępny wyłącznie w chmurze Google. Dla firm, które nie chcą wiązać się z jednym dostawcą (albo już stoją na AWS lub Azure), to często argument rozstrzygający.

Zarządzana chmura czy własny lakehouse - co wybrać

Te dwa światy - otwarty lakehouse z wcześniejszych sekcji i zarządzana hurtownia w chmurze - nie wykluczają się, tylko odpowiadają na różne potrzeby. Własny lakehouse na tanim składowaniu obiektowym daje pełną kontrolę i najniższy koszt trzymania danych, ale wymaga zespołu, który go utrzyma. Zarządzana hurtownia zdejmuje z Ciebie całą administrację i pozwala liczyć od zaraz - w zamian za rozliczenie od zużycia i pewne przywiązanie do dostawcy. Jeśli już zdecydujesz się na hurtownię w chmurze, wybór między BigQuery i Snowflake sprowadza się do kilku różnic, które zbieramy tu w jednym miejscu:

Tabela porównawcza BigQuery i Snowflake: model obliczeniowy, chmura, rozliczenie, skalowanie, język, składowanie, administracja, ekosystem
BigQuery kontra Snowflake, cecha po cesze - wspólny fundament, inna filozofia mocy i rozliczenia.

W praktyce decyzja zwykle sprowadza się do tego, gdzie już trzymasz dane i jak wygląda Twoje obciążenie - poniższa ściągawka podsumowuje, w którą stronę najczęściej warto się skłonić:

Infografika decyzyjna: kiedy wybrać BigQuery, a kiedy Snowflake
Skrót decyzji - to nie sztywne reguły, tylko punkty, które najczęściej przeważają szalę na jedną albo drugą stronę.

Każde z tych narzędzi rozłożyliśmy na czynniki pierwsze w osobnych przewodnikach: czym jest BigQuery i jak działa hurtownia danych w chmurze oraz prosty przewodnik po Snowflake. Fundament obu jest ten sam, który znasz już z tego artykułu: dane w chmurze plus zwykłe zapytanie SQL, bez własnego serwera po Twojej stronie.

Jeśli chcesz przejść od teorii do praktyki i samodzielnie zbudować takie przetwarzanie na Apache Spark - z realnymi danymi, transformacjami i wydajnym przetwarzaniem rozproszonym - najszybciej nauczysz się tego na szkoleniu prowadzonym przez praktyka.

Szkolenie Big Data z Apache Spark - JSystems

Szkolenie Big Data z Apache Spark -->

Przetwarzanie danych Big Data z Apache Spark - praktyczne szkolenie z terminem gwarantowanym. Nauczysz się budować rozproszone przetwarzanie danych na realnych przykładach.

To szkolenie może być dofinansowane dla Ciebie z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Najczęściej zadawane pytania

Czym różni się hurtownia danych, jezioro danych i lakehouse?
Hurtownia daje porządek i szybki SQL, ale jest droga i słabo radzi sobie z plikami oraz uczeniem maszynowym. Jezioro danych to tanie składowisko plików bez gwarancji spójności. Lakehouse łączy zalety obu: transakcyjne tabele wprost na tanim składowaniu obiektowym, czyli tanie miejsce z rygorem transakcji.
Do czego służy Apache Spark w nowoczesnym stosie Big Data?
Apache Spark to silnik rozproszonego przetwarzania danych, który dzieli pracę na wiele maszyn i liczy je równolegle. W trybie klastra jest węzeł zarządzający oraz węzły robocze wykonujące zadania na swoich rdzeniach. Dzięki temu operacje takie jak zliczanie czy agregacja idą na kilku maszynach naraz.
Czym są transakcje ACID i podróż w czasie w tabelach lakehouse?
ACID to gwarancja, że operacja zapisu wykona się w całości albo wcale, bez połowicznych, uszkodzonych stanów. Formaty tabel takie jak Delta Lake dokładają do plików dziennik transakcji, dzięki któremu dostajemy też wersjonowanie i podróż w czasie, czyli odczyt tabeli w stanie sprzed zmian.
Czym jest składowanie obiektowe i po co dzieli się je od obliczeń?
Składowanie obiektowe przechowuje dane jako obiekty w pojemnikach zwanych kubełkami, dostępnych przez proste API zgodne z Amazon S3. Jest tanie i praktycznie nieograniczone, a przede wszystkim oddziela miejsce przechowywania danych od mocy obliczeniowej, którą można skalować niezależnie.
Na czym polega federacja zapytań w Trino?
Federacja pozwala jednym zapytaniem SQL sięgnąć do kilku różnych źródeł danych naraz. Silnik zapytań Trino potrafi łączyć dane z wielu miejsc, dzięki czemu nie trzeba wcześniej kopiować wszystkiego do jednej bazy, aby zadać pytanie obejmujące różne systemy.
Po co w tym stosie strumień z Apache Kafka?
Kafka pozwala przetwarzać dane na bieżąco, strumieniowo, zamiast wyłącznie porcjami wsadowymi. Kluczowa zmiana ostatnich lat polega na tym, że ten sam zbiór danych obsługujemy zarówno wsadowo, jak i strumieniowo, trzymając go tanio w obiektach i mając nad nim transakcje oraz jeden język zapytań.
Czym jest Apache Hive i Hive Metastore w nowoczesnym stosie danych?
Apache Hive to warstwa SQL nad plikami: pozwala pisać zapytania HiveQL zamiast kodu MapReduce, a zadania wykonuje na silniku Tez. Jego najważniejszą rolą w nowoczesnym stosie jest Hive Metastore - wspólny katalog tabel opisujący pliki w magazynie obiektowym (kolumny, typy, partycje, lokalizacje). Z tego samego katalogu korzystają Spark i Trino, dlatego Hive bywa katalogiem, a Spark lub Trino silnikiem na tych samych danych.
Czym różni się BigQuery od Snowflake?
Obie to zarządzane, chmurowe hurtownie danych, w których pytasz zwykłym SQL, ale BigQuery jest bezserwerowy i sam dokłada moc obliczeniową (płacisz za ilość przeskanowanych danych), a w Snowflake sam włączasz hurtownię wirtualną o wybranym rozmiarze i płacisz za czas jej pracy. Do tego BigQuery działa tylko w chmurze Google, a Snowflake na Amazon AWS, Microsoft Azure albo Google Cloud.
Lepiej postawić własny lakehouse czy wynająć hurtownię w chmurze?
To wybór między kontrolą a wygodą. Własny lakehouse na tanim składowaniu obiektowym (Spark, Delta lub Iceberg, Trino) daje pełną kontrolę i najniższy koszt trzymania danych, ale ktoś musi go utrzymać. Zarządzana hurtownia w chmurze jak BigQuery czy Snowflake zdejmuje całą administrację, a płacisz za zużycie, w zamian za mniejszą kontrolę i pewne przywiązanie do dostawcy. Zespoły z własnymi kompetencjami platformowymi częściej wybierają lakehouse, a te, które chcą liczyć od zaraz bez utrzymywania infrastruktury, wybierają hurtownię w chmurze.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...