Blog JSystems - uwalniamy wiedzę!

Szukaj
Big Data · Przewodnik

Zespół JSystems · przewodnik 2026 · czas czytania ok. 16 min

Animacja pokazujaca jak Apache Spark wykonuje zadanie: od kodu PySpark, przez Driver z optymalizatorem Catalyst i Cluster Manager, po executory liczace dane rownolegle w pamieci
Jak Apache Spark zamienia zwykły kod na obliczenia rozproszone w pamięci i zwraca wynik. Tę drogę - od kodu po executory - rozłożymy w tym artykule na czynniki pierwsze.

Apache Spark to dziś jeden z najważniejszych silników przetwarzania danych na świecie. Stoi za analityką, uczeniem maszynowym i potokami danych w tysiącach firm, a jego największą zaletą jest to, że ogromne zbiory potrafi przetwarzać znacznie szybciej niż starsze narzędzia - bo liczy dane w pamięci. W tym przewodniku wyjaśnimy prostym językiem, czym Spark jest, jak działa od środka i kiedy naprawdę warto po niego sięgnąć. Wszystko pokażemy na żywym Sparku w wersji 3.5.3, uruchomionym w kontenerze, na realnym zbiorze 53 031 transakcji sprzedaży.

Czym jest Apache Spark

Apache Spark to otwarty silnik do przetwarzania dużych zbiorów danych, który potrafi rozłożyć obliczenia na wiele maszyn i policzyć je równolegle. Mówiąc najprościej: piszesz zwykły kod, który wygląda, jakby działał na jednym komputerze, a Spark w tle dzieli pracę na kawałki i uruchamia je na całym klastrze (grupie połączonych maszyn). Nie musisz się martwić, jak podzielić dane ani jak zsynchronizować obliczenia - tym zajmuje się Spark.

Kluczowe słowo, które warto od razu oswoić, to in-memory, czyli przetwarzanie w pamięci. Starsze narzędzia z rodziny Big Data po każdym etapie obliczeń zapisywały wyniki pośrednie na dysk, a odczyt z dysku jest wolny. Spark, gdzie tylko może, trzyma dane w pamięci operacyjnej (RAM) i dzięki temu przy powtarzanych operacjach potrafi być wielokrotnie szybszy. To była jego przełomowa cecha i do dziś jest głównym powodem, dla którego się go wybiera.

Druga ważna cecha to uniwersalność. Spark to nie jest osobne narzędzie do każdego zadania - to jeden silnik, którym zrobisz zapytania SQL, przetworzysz dane napływające na żywo, wytrenujesz model uczenia maszynowego czy policzysz graf powiązań. Wszystko na tych samych danych i w tym samym API. Do Sparka najczęściej pisze się w Pythonie (interfejs nazywa się PySpark), ale dostępne są też Scala, Java i R. W tym artykule wszystkie przykłady są w PySpark.

Po co powstał Spark

Żeby zrozumieć Spark, trzeba cofnąć się do jego poprzednika. Przez lata standardem przetwarzania Big Data był MapReduce - model obliczeń z ekosystemu Hadoop, w którym każde zadanie dzielono na fazę mapowania i fazę redukcji. MapReduce miał jedną dużą wadę: po każdym etapie zapisywał wyniki pośrednie na dysk. Przy prostym zliczaniu to jeszcze uchodziło, ale przy obliczeniach iteracyjnych (na przykład w uczeniu maszynowym, gdzie ten sam zbiór przelicza się setki razy) ciągłe pisanie i czytanie z dysku zabijało wydajność.

Spark narodził się w laboratorium AMPLab na Uniwersytecie Kalifornijskim w Berkeley około 2009 roku właśnie jako odpowiedź na ten problem. Pomysł był prosty i genialny: skoro dysk jest wąskim gardłem, trzymajmy dane pośrednie w pamięci. Efekt przerósł oczekiwania - te same zadania działały wielokrotnie szybciej. Projekt szybko trafił pod skrzydła fundacji Apache i stał się jednym z najaktywniej rozwijanych narzędzi Big Data. Jeśli chcesz zobaczyć szerszy obraz tego, jak Spark wpisuje się w dzisiejszy krajobraz danych, opisaliśmy go w artykule o współczesnych rozwiązaniach Big Data.

Architektura Spark: z czego to się składa

Spark to aplikacja rozproszona, więc żeby ją zrozumieć, trzeba zobaczyć, kto właściwie wykonuje pracę. Są trzy główne role: program sterujący, zarządca zasobów i procesy robocze. Poniższa infografika pokazuje, jak współpracują.

Infografika architektury Apache Spark: Driver Program ze SparkContext, Cluster Manager przydzielajacy zasoby oraz executory 1, 2 i N liczace partycje danych rownolegle
Architektura Spark w skrócie. Driver planuje pracę, Cluster Manager przydziela zasoby, a executory liczą dane równolegle - każdy swoją część (partycję).

Prześledźmy te elementy po kolei:

  • Driver Program - serce aplikacji. To tutaj działa Twój kod. Driver tworzy SparkContext (punkt wejścia do Sparka), buduje plan obliczeń i dzieli pracę na drobne zadania.
  • Cluster Manager - zarządca zasobów klastra. Przydziela pamięć i moc obliczeniową. Może to być tryb Standalone (wbudowany w Spark), YARN znany z Hadoopa albo Kubernetes.
  • Executory - procesy robocze uruchomione na maszynach klastra. To one wykonują zadania i liczą dane. Każdy executor obrabia inną partycję, czyli fragment zbioru - i tu właśnie rodzi się równoległość.
  • Partycje - Spark dzieli dane na kawałki zwane partycjami i rozdziela je między executory. Im więcej partycji i executorów, tym więcej obliczeń dzieje się jednocześnie.

Cała sztuczka polega na tym, że Ty piszesz kod tak, jakby dane były jedną kolekcją, a Spark sam rozbija ją na partycje i rozsyła do executorów. Kiedy uruchomisz zadanie lokalnie na laptopie (tryb local[*], którego użyjemy w tym artykule), rolę klastra przejmują rdzenie Twojego procesora - każdy działa jak mały executor.

RDD, DataFrame i Dataset: trzy sposoby na dane

Pracując ze Sparkiem, spotkasz trzy nazwy, które na początku bywają mylące: RDD, DataFrame i Dataset. To trzy warstwy abstrakcji nad tymi samymi danymi - od najniższego, najbardziej surowego poziomu, po najwygodniejszy.

Infografika porownujaca RDD, DataFrame i Dataset w Spark: RDD to podstawa, DataFrame to warstwa tabelaryczna z optymalizatorem Catalyst, Dataset to wersja typowana
Trzy warstwy Spark. RDD to fundament, DataFrame to wygodna, optymalizowana warstwa tabelaryczna, a Dataset dokłada kontrolę typów w Scali i Javie.

RDD (Resilient Distributed Dataset, czyli odporny rozproszony zbiór danych) to najniższy poziom - rozproszona kolekcja obiektów, na której wykonujesz operacje takie jak map czy reduce. Daje pełną kontrolę, ale sam nie jest optymalizowany. Zobaczmy RDD w akcji: policzmy liczbę sprzedanych sztuk w podziale na regiony, operując bezpośrednio na surowych liniach pliku.

Terminal PySpark z operacjami na RDD: textFile, map, reduceByKey i collect, wynik to liczba sztuk wedlug regionu z polskimi nazwami wojewodztw
RDD w praktyce. Wczytujemy plik jako zbiór linii, rozbijamy każdą na pola i sumujemy sztuki po regionie za pomocą reduceByKey. To ten sam wynik, który za chwilę policzymy wygodniej DataFrame'em.

Widać, że kod RDD jest dość niskopoziomowy - sami dzielimy tekst, wybieramy pola po numerach i ręcznie sumujemy. Działa, ale jest sporo pracy i łatwo o pomyłkę. Dlatego na co dzień sięgamy po warstwę wyżej.

DataFrame to najczęstszy wybór. Dane widzisz jak tabelę z nazwanymi kolumnami i typami, dokładnie jak w bazie danych. Piszesz czytelny kod, a wbudowany optymalizator Catalyst sam układa najlepszy plan wykonania. To jego będziemy używać w większości artykułu. Dataset to trzecia opcja - łączy zalety RDD i DataFrame, dokładając sprawdzanie typów już na etapie pisania kodu, ale dostępny jest tylko w Scali i Javie (nie w Pythonie). Dla początkującego w Pythonie zasada jest prosta: używaj DataFrame.

Pierwszy kontakt: sesja i dane

Pracę ze Sparkiem zaczynasz od utworzenia sesji - obiektu, przez który rozmawiasz z silnikiem. Potem wczytujesz dane. Co ważne, tak jak w hurtowni Apache Hive, Spark stosuje model schema-on-read (schemat przy odczycie): schemat danych podajesz dopiero w momencie wczytywania pliku, a nie z góry przy jego zapisie. Oto jak w kilku linijkach tworzymy sesję, definiujemy schemat i wczytujemy plik sprzedaży.

from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StructField, IntegerType, StringType

spark = SparkSession.builder.master("local[*]").getOrCreate()

# schemat: nazwy kolumn i ich typy - nakladamy go dopiero przy odczycie
schemat = StructType([
    StructField("id",         IntegerType()),
    StructField("data",       StringType()),
    StructField("product_id", IntegerType()),
    StructField("region",     StringType()),
    StructField("ilosc",      IntegerType()),
    StructField("kanal",      StringType()),
])

sprzedaz = spark.read.csv("sprzedaz.csv", schema=schemat)

Zmienna schemat to właśnie nasza deklaracja struktury danych - lista sześciu kolumn wraz z typami (liczba całkowita albo tekst). Przekazujemy ją do read.csv w parametrze schema i to dzięki niej Spark wie, jak rozumieć surowy plik CSV. Podejrzyjmy pierwsze wiersze wczytanych danych.

Terminal PySpark: sprawdzenie wersji Spark 3.5.3, wczytanie pliku CSV ze schematem i podglad pierwszych pieciu wierszy sprzedazy
Start sesji Spark i podgląd danych. Metoda show wyświetla pierwsze wiersze - to surowy plik CSV widziany przez Spark jako tabela z nazwanymi kolumnami.

Skoro nałożyliśmy na plik schemat, możemy go podejrzeć. Polecenie printSchema pokazuje kolumny i ich typy - Spark zna je nie dlatego, że przeanalizował plik, ale dlatego, że sami tak zadeklarowaliśmy przy wczytywaniu.

Terminal PySpark z wynikiem printSchema: szesc kolumn tabeli sprzedazy z typami integer i string
Schemat nałożony na dane przy odczycie. Sześć kolumn z typami - to my zadeklarowaliśmy tę strukturę, wczytując surowy plik CSV.

Sprawdźmy jeszcze, ile w ogóle mamy danych. Jedno proste wywołanie count i już wiemy, że pracujemy na ponad pięćdziesięciu tysiącach transakcji.

Terminal PySpark z wynikiem metody count zwracajacej liczbe 53031 transakcji sprzedazy
Zbiór liczy 53 031 transakcji. Na tak małym wolumenie Spark to armata na muchę - ale dokładnie te same operacje zadziałają na miliardach wierszy rozłożonych na klastrze.

Leniwe wykonanie: transformacje kontra akcje

Teraz najważniejszy koncept Sparka, który odróżnia go od zwykłego programowania i którego zrozumienie oszczędzi Ci wielu niespodzianek. W Sparku operacje dzielą się na dwa rodzaje: transformacje i akcje. Transformacja (na przykład filter, select, groupBy) opisuje, co chcesz zrobić z danymi - ale niczego nie liczy. Spark tylko zapamiętuje przepis. Dopiero akcja (na przykład count, show lub zapis wyniku) uruchamia całe obliczenie. Ten mechanizm nazywa się leniwym wykonaniem (lazy evaluation).

Animacja leniwego wykonania w Spark: transformacje read, filter, select i groupBy buduja plan (graf DAG), dopiero akcja count uruchamia obliczenia
Leniwe wykonanie w akcji. Kolejne transformacje tylko budują plan (graf zadań, tak zwany DAG). Dane pozostają nietknięte, dopóki nie wywołasz akcji - dopiero ona uruchamia cały łańcuch naraz.

Po co ta komplikacja? Bo dzięki niej Spark widzi cały plan, zanim zacznie liczyć, i może go zoptymalizować - na przykład pominąć kolumny, których i tak nikt nie użyje, albo połączyć kilka kroków w jeden. To fundament wydajności Sparka. Zobaczmy to na realnym pomiarze: budujemy łańcuch transformacji i mierzymy czas, a potem wywołujemy akcję i mierzymy ponownie.

Terminal PySpark pokazujacy pomiar czasu: transformacja filter i select zajmuje 0.05 sekundy, akcja count zajmuje 0.87 sekundy i zwraca 8839 wierszy
Dowód leniwego wykonania. Zbudowanie łańcucha transformacji zajęło 0,05 s - Spark tylko zapisał plan. Dopiero akcja count uruchomiła obliczenia i zajęła 0,87 s, zwracając 8 839 wierszy.

Różnica jest wymowna: samo zbudowanie planu to ułamek sekundy, bo Spark niczego wtedy nie liczy - dopiero akcja czyta 53 tysiące wierszy i wykonuje pracę. Gdy zaczynasz ze Sparkiem, dobrze mieć w głowie tę zasadę: dopóki nie wywołasz akcji, nic się nie dzieje.

Zapytania analityczne: agregacje, JOIN i Spark SQL

Skoro mamy dane, zadajmy im pytania biznesowe. Zacznijmy od agregacji na DataFrame: ile transakcji i ile sprzedanych sztuk przypada na każdy region. Metoda groupBy w połączeniu z agg odpowiada za grupowanie.

(sprzedaz.groupBy("region")
        .agg(count("*").alias("transakcje"),
             sum("ilosc").alias("sztuki"))
        .orderBy(desc("sztuki"))
        .show())
Terminal PySpark z wynikiem agregacji groupBy wedlug regionu: kolumny region, transakcje i sztuki, wojewodztwa posortowane malejaco
Agregacja sprzedaży według regionu na DataFrame. Spark rozłożył pracę na partycje, policzył je równolegle i zebrał wynik - a kod czyta się jak zdanie.

Prawdziwa moc analityki to łączenie tabel. Obok sprzedaży mamy drugą, mniejszą tabelę - listę produktów z cenami. Połączmy je (operacja join) po kluczu product_id, żeby policzyć przychód w podziale na kategorie.

(sprzedaz.join(produkty, "product_id")
        .groupBy("kategoria")
        .agg(count("*").alias("transakcje"),
             round(sum(col("ilosc") * col("cena")), 2).alias("przychod_pln"))
        .orderBy(desc("przychod_pln"))
        .show())
Terminal PySpark z wynikiem zlaczenia join sprzedazy z produktami: przychod wedlug kategorii, Elektronika na pierwszym miejscu z ponad 42 milionami zlotych
Złączenie dwóch tabel i przychód według kategorii. Elektronika odpowiada za ponad 42 miliony złotych przychodu w naszym zbiorze demonstracyjnym.

Najlepsze w Sparku jest to, że jeśli wolisz zwykły SQL, wcale nie musisz uczyć się nowego API. Ten sam wynik dostaniesz, pisząc klasyczne zapytanie w Spark SQL - składnia jest praktycznie taka sama jak w każdej bazie.

Terminal PySpark ze Spark SQL: zapytanie SELECT z GROUP BY po regionie zwracajace ten sam wynik co DataFrame API
To samo pytanie zadane zwykłym SQL. Spark SQL i DataFrame to dwie drogi do tego samego celu - pod spodem trafiają do tego samego optymalizatora.

To jest właśnie codzienna praca ze Sparkiem: analityczne pytania do dużych zbiorów, zadawane albo wygodnym API DataFrame, albo znanym wszystkim SQL. Chcesz opanować to od podstaw, na realnych danych i pod okiem praktyka?

Chcesz nauczyć się przetwarzać duże zbiory danych w Sparku w praktyce? Szkolenie Big Data: Przetwarzanie danych Big Data z Apache Spark ma terminy gwarantowane.

Dlaczego Spark jest szybki: model in-memory

Wróćmy do najważniejszej cechy Sparka - liczenia w pamięci. Najlepiej widać ją w zestawieniu z MapReduce. Poniższa infografika pokazuje, na czym polega różnica.

Infografika porownujaca MapReduce i Spark: MapReduce zapisuje dane na dysk po kazdym etapie, Spark trzyma je w pamieci, co daje 11,4 razy szybsze powtorne zapytanie
MapReduce zapisuje wynik na dysk po każdym etapie, Spark trzyma dane pośrednie w pamięci. Dlatego przy powtarzanych operacjach Spark jest znacznie szybszy.

Ten model in-memory daje o sobie znać zwłaszcza wtedy, gdy ten sam zbiór odpytujesz wielokrotnie. Spark pozwala wtedy jawnie poprosić, żeby dane zostały w pamięci - służy do tego metoda cache. Zmierzyliśmy to: pierwszy przebieg zapytania (zimny, z odczytem danych) kontra ten sam przebieg po zbuforowaniu danych w pamięci.

q.collect()                 # zimny odczyt danych
sprzedaz.cache(); sprzedaz.count()   # zaladuj do pamieci
q.collect()                 # ponowny odczyt - juz z pamieci

Wynik jest jednoznaczny: po zbuforowaniu danych powtórne zapytanie policzyło się w naszym demo ponad 11 razy szybciej (spadek z około 1,39 do 0,12 sekundy). To dokładnie ta przewaga, dla której powstał Spark - unikanie kosztownych odczytów z dysku tam, gdzie dane można trzymać w pamięci. Warto pamiętać, że cache ma sens wtedy, gdy ten sam zbiór wykorzystujesz kilka razy; przy jednorazowym przejściu przez dane nic nie zyskasz.

Catalyst i plan wykonania

Skąd Spark wie, jak najlepiej policzyć Twoje zapytanie? Odpowiada za to Catalyst - wbudowany optymalizator, który zamienia kod DataFrame lub Spark SQL w zoptymalizowany plan fizyczny. Zanim Spark cokolwiek policzy, układa graf kroków, wybiera najtańszy sposób wykonania i dopiero wtedy rozsyła zadania do executorów. Ten plan możesz podejrzeć poleceniem explain.

Terminal PySpark z planem wykonania z polecenia explain: fizyczny plan Catalyst z krokami HashAggregate, Exchange i Scan csv oraz AdaptiveSparkPlan
Plan wykonania z polecenia explain. Widać kolejne kroki, które Catalyst ułożył: skan pliku, agregacje częściowe, wymianę danych między partycjami (Exchange) i sortowanie.

Ten plan nie jest tylko teorią - Spark faktycznie go realizuje, a cały przebieg możesz obejrzeć w graficznym panelu Spark UI, który silnik udostępnia przez przeglądarkę. Widać w nim wykonane zadania i to, jak Spark rozbił zapytanie na etapy.

Zrzut ekranu panelu Spark UI z lista wykonanych zadan (jobs), ich czasem trwania i liczba etapow
Panel Spark UI na naszym środowisku. Lista wykonanych zadań (jobs) wraz z czasem trwania i liczbą etapów - bezcenne narzędzie do zrozumienia i optymalizacji obliczeń.
Zrzut ekranu Spark UI z wizualizacja grafu DAG pojedynczego zadania: kolejne etapy przetwarzania polaczone strzalkami
Ten sam przebieg jako graf zadań (DAG) w Spark UI. To wizualne odzwierciedlenie planu, który zbudował Catalyst - od skanu danych po wynik.

Partycjonowanie i szybsze odczyty

Gdy dane rosną, opłaca się je fizycznie podzielić, żeby zapytania nie musiały czytać całości. Spark, podobnie jak hurtownie Big Data, wspiera partycjonowanie - zapis danych w podziale na katalogi według wybranej kolumny. Zapiszmy naszą sprzedaż w formacie Parquet (wydajny format kolumnowy) z podziałem na rok i miesiąc, a potem zapytajmy o jeden konkretny miesiąc.

(sprzedaz.withColumn("rok", year("data"))
        .withColumn("miesiac", month("data"))
        .write.partitionBy("rok", "miesiac").parquet("sprzedaz_part"))

parq = spark.read.parquet("sprzedaz_part")
parq.where((col("rok") == 2024) & (col("miesiac") == 12)).count()
Terminal PySpark: zapis danych do Parquet z partycjonowaniem i zapytanie o jedna partycje rok 2024 miesiac 12 zwracajace 2831 wierszy
Zapytanie do jednej partycji zwraca 2 831 wierszy. Spark odczytał tylko właściwy katalog, zamiast przeglądać cały zbiór.

Że tak się właśnie stało, potwierdza plan wykonania. W sekcji PartitionFilters widać, że Spark z góry wiedział, które partycje pominąć - ten mechanizm nazywa się partition pruning (przycinanie partycji).

Terminal PySpark z planem wykonania pokazujacym sekcje PartitionFilters, ktora potwierdza pominiecie niepotrzebnych partycji
Plan potwierdza przycinanie partycji. Warunek na roku i miesiącu trafił do sekcji PartitionFilters - Spark czyta tylko potrzebne katalogi, oszczędzając odczyty z dysku.

Partycjonowanie, format kolumnowy Parquet i cache to trzy pierwsze narzędzia optymalizacji, których uczy się każdy inżynier danych pracujący ze Sparkiem. Jeśli te przykłady w Pythonie Cię wciągnęły, to naturalny kierunek dalszej nauki.

Wolisz uczyć się Sparka od strony Pythona? Szkolenie PySpark: rozproszone przetwarzanie danych w Sparku za pomocą Pythona pokazuje to na realnych zadaniach.

Moduły Spark: jeden silnik do wszystkiego

Do tej pory pracowaliśmy z danymi tabelarycznymi, ale Spark to znacznie więcej. Jego siłą jest to, że jest ujednoliconym silnikiem - na tych samych danych i w tym samym API robisz zupełnie różne rzeczy. Poniższa infografika pokazuje główne moduły.

Infografika modulow Apache Spark: na fundamencie Spark Core stoja Spark SQL, Structured Streaming, MLlib do uczenia maszynowego i GraphX do analizy grafow
Moduły Spark stoją na wspólnym fundamencie - Spark Core. Dzięki temu ten sam DataFrame przetworzysz zapytaniem SQL, puścisz przez strumień danych albo nakarmisz nim model uczenia maszynowego.
  • Spark SQL - zapytania SQL i praca na DataFrame'ach. To z niego korzystaliśmy w tym artykule.
  • Structured Streaming - przetwarzanie danych napływających na żywo (na przykład zdarzeń ze strumienia), tym samym kodem, którym obrabiasz dane wsadowe.
  • MLlib - biblioteka uczenia maszynowego: klasyfikacja, regresja, rekomendacje i grupowanie, gotowe do działania na dużą skalę.
  • GraphX - analiza grafów, czyli danych o powiązaniach (na przykład sieci społecznościowych czy zależności między produktami).

Wszystko to opiera się na Spark Core - silniku, który zarządza pamięcią, dzieli zadania i pilnuje ich wykonania na klastrze. Ta jednorodność to praktyczna przewaga: nie musisz spinać kilku różnych narzędzi ani przenosić danych między nimi.

Spark w ekosystemie Big Data

Spark rzadko działa sam. Najczęściej jest silnikiem obliczeniowym w większej układance: czyta dane z rozproszonych magazynów, przetwarza je i oddaje gotowe wyniki dalej. Poniższa infografika pokazuje jego miejsce.

Infografika miejsca Apache Spark w Big Data: zrodla danych jak HDFS, S3 i Kafka wchodza do Spark, a wynikiem sa raporty, modele i hurtownia danych
Gdzie w Big Data siedzi Spark. Czyta dane ze źródeł takich jak HDFS, chmura czy Kafka, liczy je na klastrze i oddaje wyniki do raportów, modeli i hurtowni.

Spark świetnie współpracuje z resztą świata danych. Dane odczytuje z rozproszonego systemu plików HDFS, z magazynów chmurowych czy ze strumieni. Często stoi obok hurtowni Apache Hive, z której korzysta jako katalogu tabel, i coraz częściej zapisuje dane w formacie Delta Lake, tworząc nowoczesną hurtownię typu lakehouse. Wyniki jego pracy trafiają dalej - do analizy danych w Pythonie z biblioteką pandas, do narzędzi typu Power BI, czy do hurtowni w chmurze takich jak BigQuery. Spark jest w tym łańcuchu tym elementem, który potrafi przemielić naprawdę duże wolumeny. Skoro Spark tak często stoi obok Hive, warto wiedzieć, kiedy który się sprawdzi - rozkładamy to na czynniki pierwsze w artykule Apache Spark kontra Apache Hive - które narzędzie Big Data wybrać.

Kiedy używać Spark, a kiedy nie

Skoro wiemy już, co Spark potrafi, odpowiedzmy na pytanie, które zadaje sobie każdy początkujący: czy to narzędzie dla mnie? Poniższa infografika podsumowuje decyzję.

Infografika decyzyjna: kiedy Spark sie sprawdzi (duze dane, wsad i strumienie, uczenie maszynowe, szybkosc w pamieci) a kiedy poszukac czegos innego (male dane, milisekundy, pojedyncze zapisy)
Prosta decyzja oparta na skali i typie zadań. Spark opłaca się przy dużych danych i złożonych potokach, a nie przy małych zbiorach i pojedynczych operacjach.

Reguła kciuka jest prosta. Sięgnij po Spark, gdy dane nie mieszczą się wygodnie na jednej maszynie, gdy budujesz złożone potoki przetwarzania (wsadowe albo strumieniowe), gdy robisz uczenie maszynowe na dużą skalę albo gdy zależy Ci na szybkości dzięki liczeniu w pamięci. Poszukaj czegoś innego, gdy zbiory są małe i spokojnie mieszczą się na jednym serwerze - wtedy zwykła baza danych albo biblioteka pandas w Pythonie będzie prostsza. Spark nie zastąpi też bazy transakcyjnej tam, gdzie potrzebujesz odpowiedzi w milisekundach i wielu pojedynczych zapisów - to zupełnie inny rodzaj pracy.

Jak zacząć z Apache Spark krok po kroku

Dobra wiadomość jest taka, że Spark można dziś odpalić na własnym laptopie w kilka minut, bez stawiania klastra. Wystarczy Python i jedno polecenie instalacji.

Infografika pieciu krokow startu ze Spark: zainstaluj PySpark, wczytaj dane, transformuj, wywolaj akcje, optymalizuj
Pięć kroków od pustego środowiska do zoptymalizowanych zapytań. Dokładnie tę drogę przeszliśmy w tym artykule na realnych danych.

Cały Spark z API DataFrame i Spark SQL dostaniesz jednym poleceniem w Pythonie:

# instalacja PySpark w srodowisku Python
pip install pyspark

# w kodzie: utworz sesje i wczytaj dane
from pyspark.sql import SparkSession
spark = SparkSession.builder.master("local[*]").getOrCreate()
df = spark.read.csv("sprzedaz.csv", header=True, inferSchema=True)
df.show()

Zapis local[*] mówi Sparkowi, żeby uruchomił się lokalnie i wykorzystał wszystkie rdzenie Twojego procesora - każdy zadziała jak mały executor. Od tego momentu możesz wczytywać dane, pisać transformacje i wywoływać akcje dokładnie tak, jak pokazaliśmy w tym artykule. To najprostszy sposób, żeby poznać Spark bez inwestowania w infrastrukturę.

Podsumowanie

Apache Spark to szybki, rozproszony silnik do przetwarzania dużych zbiorów danych, którego przewagą jest liczenie w pamięci (in-memory) zamiast ciągłego zapisywania na dysk. Jego fundamenty to architektura z Driverem i executorami, warstwy abstrakcji nad danymi (RDD, DataFrame i Dataset), leniwe wykonanie (transformacje budują plan, dopiero akcja go uruchamia) oraz optymalizator Catalyst, który układa najlepszy plan zapytania. Spark to jednocześnie jeden silnik do wielu zadań - SQL, strumieni, uczenia maszynowego i grafów - a jego przykłady najwygodniej pisze się w Pythonie przez PySpark. Najlepsze w tym wszystkim jest to, że całość możesz dziś przećwiczyć na własnym komputerze po jednym poleceniu instalacji - a stąd już blisko do pracy z prawdziwym Big Data.

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

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

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

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

Najczęściej zadawane pytania

Czy Apache Spark zastępuje Hadoop?
Nie do końca. Spark zastępuje jeden element Hadoopa - silnik obliczeniowy MapReduce - który był wolny, bo zapisywał dane na dysk po każdym etapie. Spark nadal chętnie korzysta z pozostałych części ekosystemu: rozproszonego systemu plików HDFS jako magazynu danych oraz zarządcy zasobów YARN. Można więc powiedzieć, że Spark to szybszy silnik obliczeń, który często działa na infrastrukturze Hadoop, a nie jej całkowity zamiennik.
Czym Spark różni się od MapReduce?
Najważniejsza różnica to model in-memory. MapReduce po każdym etapie obliczeń zapisuje wynik pośredni na dysk, co jest wolne. Spark trzyma dane pośrednie w pamięci operacyjnej i sięga po dysk dopiero, gdy musi. Dzięki temu przy powtarzanych i iteracyjnych obliczeniach Spark jest znacznie szybszy. Do tego dochodzi wygodniejsze API (DataFrame) i optymalizator zapytań Catalyst, którego MapReduce nie miał.
Czym różni się RDD od DataFrame w Spark?
RDD (Resilient Distributed Dataset) to niskopoziomowy model Spark - rozproszona kolekcja obiektów, na której wykonujesz operacje takie jak map czy reduce. Daje pełną kontrolę, ale nie jest automatycznie optymalizowany. DataFrame to wygodniejsza warstwa: dane widziane jak tabela z nazwanymi kolumnami, a optymalizator Catalyst sam układa najlepszy plan wykonania. Dla większości zadań początkujący powinni używać DataFrame - jest prostszy i szybszy.
Czym jest leniwe wykonanie (lazy evaluation) w Spark?
To zasada, według której transformacje (na przykład filter czy select) nie uruchamiają obliczeń od razu - Spark tylko zapamiętuje przepis, budując graf zadań. Dopiero wywołanie akcji (na przykład count, show lub zapis wyniku) uruchamia cały łańcuch naraz. Dzięki temu Spark widzi całość planu, zanim zacznie liczyć, i może go zoptymalizować - na przykład pominąć kolumny, których i tak nikt nie użyje.
Czym jest PySpark?
PySpark to interfejs Apache Spark dla języka Python. Pozwala pisać zadania Spark w Pythonie, korzystając z tych samych DataFrame'ów, Spark SQL i bibliotek uczenia maszynowego. To najpopularniejszy sposób pracy ze Sparkiem wśród analityków i badaczy danych, bo łączy moc rozproszonego przetwarzania z prostotą i bogatym ekosystemem Pythona. Wszystkie przykłady w tym artykule są napisane właśnie w PySpark.
Jak szybko uruchomić Apache Spark do nauki?
Najprościej przez PySpark. Wystarczy w środowisku Pythona wykonać polecenie pip install pyspark, a następnie w kilku linijkach kodu utworzyć sesję Spark i wczytać dane. Do nauki nie potrzebujesz żadnego klastra - Spark uruchomi się lokalnie na Twoim komputerze w trybie local, wykorzystując wszystkie rdzenie procesora. W kilka minut masz działające środowisko, na którym przećwiczysz wczytywanie danych, transformacje i zapytania.

Komentarze (0)

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

Brak komentarzy...