Dane oryginału

Learning Spark by Holden Karau, Andy Konwinski, Patrick Wendell, Matei Zaharia

Authorized Polish translation of the English edition of Learning Spark, ISBN 9781449358624

© 2015 Databricks

The translation is published and sold by permission of O'Reilly Media, Inc., which owns or controls all rights to publish and sell the same.

All rights reserved.

Przekład WITKOM Witold Sikorski: Małgorzata Dąbkowska-Kowalik i Witold Sikorski

Projekt polskiej wersji okładki Hubert Zacharski

Wydawca Łukasz Łopuszański

Redaktor prowadzący Jolanta Kowalczuk

Redaktor Joanna Sawicka

Koordynator produkcji Anna Bączkowska

Skład wersji elektronicznej na zlecenie Wydawnictwa Naukowego PWN: Tomasz Szymański / konwersja.virtualo.pl

Zastrzeżonych nazw firm i produktów użyto w książce

wyłącznie w celu identyfikacji.

Książka, którą nabyłeś, jest dziełem twórcy i wydawcy. Prosimy, abyś przestrzegał praw, jakie im przysługują. Jej zawartość możesz udostępnić nieodpłatnie osobom bliskim lub osobiście znanym. Ale nie publikuj jej w internecie. Jeśli cytujesz jej fragmenty, nie zmieniaj ich treści i koniecznie zaznacz, czyje to dzieło. A kopiując jej część, rób to jedynie na użytek osobisty.

Szanujmy cudzą własność i prawo

Więcej na www.legalnakultura.pl

Polska Izba Książki

Copyright © for the Polish edition by Wydawnictwo Naukowe PWN SA

Warszawa 2016

eBook został przygotowany na podstawie wydania papierowego z 2016 r., (wyd. I)

Warszawa 2016

ISBN 978-83-01-18685-2

Wydawnictwo Naukowe PWN SA

02-460 Warszawa, ul. Gottlieba Daimlera 2

tel. 22 69 54 321, faks 22 69 54 288

infolinia 801 33 33 88

e-mail: pwn@pwn.com.pl, www.pwn.pl

Spis treści

Słowo wstępne

Wprowadzenie

1. Wprowadzenie do analizy danych w Sparku

Czym jest Apache Spark?

Ujednolicony stos

Jądro Sparka

Spark SQL

Spark Streaming

MLlib

GraphX

Zarządzanie klastrami

Kto i po co korzysta ze Sparka?

Zadania z zakresu nauki o danych

Aplikacje przetwarzania danych

Krótka historia Sparka

Wersje i wydania Sparka

Warstwy pamięci w Sparku

2. Pobieranie Sparka i rozpoczęcie pracy

Pobieranie Sparka

Wprowadzenie do powłok Sparka dla Pythona i Scali

Wprowadzenie do podstawowych pojęć Sparka

Niezależne aplikacje

Inicjalizowanie kontekstu SparkContext

Tworzenie niezależnych aplikacji

Podsumowanie

3. Programowanie z rozproszonymi zbiorami danych RDD

Podstawy RDD

Tworzenie RDD

Działania na RDD

Transformacje

Akcje

Leniwa ewaluacja

Przekazywanie funkcji do Sparka

Python

Scala

Java

Popularne transformacje i akcje

Podstawowe RDD

Przekształcenia między typami RDD

Utrzymywanie (buforowanie)

Podsumowanie

4. Praca z parami klucz-wartość

Motywacja

Tworzenie RDD par

Transformacje na RDD par

Agregacje

Grupowanie danych

Złączenia

Sortowanie danych

Działania dostępne na RDD par

Partycjonowanie danych (zaawansowane)

Określanie partycjonera RDD

Działania, które zyskują dzięki partycjonowaniu

Działania, które mają wpływ na partycjonowanie

Przykład: PageRank

Niestandardowe partycjonery

Podsumowanie

5. Ładowanie i zapisywanie danych

Motywacja

Formaty plików

Pliki tekstowe

JSON

Wartości oddzielane przecinkami i tabulatorami

Pliki sekwencyjne

Pliki obiektowe

Formaty wejścia i wyjścia w Hadoop

Kompresja plików

Systemy plików

Lokalny lub „zwykły”

Amazon S3

HDFS

Dane strukturalne w Spark SQL

Apache Hive

JSON

Bazy danych

Łączniki z bazą danych Java

Cassandra

HBase

Elasticsearch

Podsumowanie

6. Zaawansowane programowanie w Sparku

Wprowadzenie

Akumulatory

Akumulatory i odporność na błędy

Akumulatory niestandardowe

Zmienne rozgłoszeniowe

Optymalizacja rozgłoszeń

Praca na poszczególnych partycjach

Potokowanie do programów zewnętrznych

Działania liczbowe na RDD

Podsumowanie

7. Uruchamianie Sparka w klastrze

Wprowadzenie

Spark Runtime Architecture

Sterownik

Wykonawcy

Menedżer klastrów

Uruchamianie programu

Podsumowanie

Wdrażanie aplikacji za pomocą spark-submit

Pakowanie kodu i elementów zależnych

Aplikacja Java Spark budowana za pomocą Mavena

Aplikacja Scala Spark budowana za pomocą sbt

Konflikty zależności

Harmonogramowanie w aplikacjach Sparka i między nimi

Menedżery klastrów

Menedżer klastrów Standalone

Hadoop YARN

Apache Mesos

Amazon EC2

Którego menedżera klastrów używać?

Podsumowanie

8. Dostrajanie i debugowanie Sparka

Konfigurowanie Sparka z SparkConf

Składniki wykonania: prace, zadania i etapy

Znajdowanie informacji

Sieciowy interfejs użytkownika w Sparku (Web UI)

Dzienniki sterownika i wykonawców

Kluczowe zagadnienia dotyczące wydajności

Poziom równoległości

Format serializacji

Zarządzanie pamięcią

Dostarczanie sprzętu

Podsumowanie

9. Spark SQL

Łączenie ze Spark SQL

Używanie Spark SQL w aplikacjach

Inicjalizacja Spark SQL

Przykład podstawowych zapytań

Elementy DataFrames

Buforowanie

Ładowanie i zapisywanie danych

Apache Hive

Źródła danych lub Parquet

JSON

Ze zbiorów RDD

Serwer JDBC/ODBC

Praca z Beeline

Długotrwałe tablice i zapytania

Funkcje definiowane przez użytkowników

UDF w Spark SQL

Funkcje UDF w Hive

Wydajność Spark SQL

Opcje dostrajania wydajności

Podsumowanie

10. Spark Streaming

Prosty przykład

Architektura i abstrakcja

Transformacje

Transformacje bezstanowe

Transformacje stanowe

Operacje wyjścia

Źródła wejściowe

Główne źródła

Dodatkowe źródła

Wiele źródeł i ustawianie rozmiaru klastra

Działanie 24/7

Punkty kontrolne

Odporność sterownika na błędy

Odporność węzła roboczego na błędy

Odporność odbiornika na błędy

Gwarancje przetwarzania

Interfejs użytkownika w strumieniowaniu

Kwestie wydajności

Rozmiary wsadu i okien

Poziom równoległości

Czyszczenie pamięci i jej wykorzystywanie

Podsumowanie

11. Systemy uczące się w MLlib

Przegląd

Wymagania dotyczące systemu

Podstawy systemów uczących się

Przykład: klasyfikacja spamu

Typy danych

Praca z wektorami

Algorytmy

Ekstrakcja cech

Statystyki

Klasyfikacja i regresja

Klastrowanie

Wspólne filtrowanie i rekomendacje

Zmniejszenie wymiarowości

Ewaluacja modelu

Wskazówki i kwestie wydajności

Przygotowanie cech

Konfigurowanie algorytmów

Bufrowanie zbiorów RDD do ponownego wykorzystania

Rozpoznawanie rzadkości

Poziom równoległości

API potoku

Podsumowanie

O autorach

Przypisy

Wszystkie rozdziały dostępne w pełnej wersji książki.

Słowo wstępne

W krótkim czasie Apache Spark stał się mechanizmem nowej generacji do przetwarzania dużych wolumenów informacji i jest coraz szerzej stosowany w przemyśle. W porównaniu z Hadoop MapReduce, który rozpoczął wielką rewolucję Big Data[1], Spark wyróżnia się w kilku podstawowych kwestiach: jest znacznie szybszy i łatwiejszy w użytkowaniu dzięki bogatemu interfejsowi (API), który jest bardziej rozbudowany niż aplikacje wsadowe i obsługuje wiele zadań, w tym interakcyjne zapytania, Spark Streaming, systemy uczące się oraz przetwarzanie wykresów.

Miałem zaszczyt być zaangażowany w tworzenie aplikacji Spark od rozpoczęcia projektu do momentu, gdy stał się najbardziej rozwijanym dziś projektem otwartego oprogramowania big data i jednym z najbardziej wspieranych projektów Apache. Dlatego też jest mi bardzo miło, że Matei Zaharia, twórca Sparka, dołączył do innych deweloperów tej platformy, Patricka Wendella, Andy’ego Konwinskiego i Holdena Karau, i razem napisali tę książkę.

Ze względu na gwałtowny wzrost popularności Sparka, największym problemem stał się brak odpowiednich materiałów pomocniczych. Ta książka jest właśnie po to, aby rozwiązać ten problem, dając, przy swoich 11 rozdziałach i dziesiątkach przykładów przeznaczonych dla naukowców zajmujących się danymi, studentów i twórców oprogramowania, dobry punkt rozpoczęcia nauki w tym zakresie. Mam nadzieję, że nawet po upływie długiego czasu Czytelnicy będą wspominać prezentowaną książkę jako tę, dzięki której poznali fascynującą nową dziedzinę.

Ion Stoica

prezes Databricks oraz dyrektor współzarządzający

AMPlab Uniwersytetu Kalifornijskiego w Berkeley

Wprowadzenie

W miarę jak równoległa analiza danych stała się powszechna, praktycy z wielu dziedzin szukali łatwiejszego narzędzia do wykonywania tego zadania. Apache Spark szybko wyrósł na jedno z najpopularniejszych, rozszerzających i uogólniających narzędzi platformy MapReduce[2]. Spark ma trzy podstawowe zalety. Po pierwsze, jest łatwy w użytkowaniu – można tworzyć aplikacje na swoim laptopie, korzystając z interfejsu wysokiego poziomu, a tym samym skupić się na zawartości swoich programów. Po drugie, Spark jest szybki, co pozwala na jego interaktywne wykorzystanie i stosowanie złożonych algorytmów. I po trzecie, Spark jest mechanizmem ogólnym, który łączy wiele rodzajów przetwarzania (np. zapytania SQL, przetwarzanie tekstów, systemy uczące się), które wcześniej wymagały odrębnych mechanizmów. Te cechy sprawiają, że Spark jest idealnym punktem startowym do nauki zagadnień big data.

Książka ta stanowi wprowadzenie, które pozwoli na szybkie opanowanie Sparka. Nauczycie się, jak pobrać Sparka na swój laptop i używać go interaktywnie do nauki API. Dalej są omawiane szczegóły dotyczące dostępnych działań oraz rozproszonego wykonywania zadań. Wreszcie na końcu znajdziecie opisy bibliotek wyższego poziomu, które są wbudowane w Sparka, w tym biblioteki systemów uczących się, przetwarzania strumieniowego oraz SQL. Mamy nadzieję, że ta książka da Wam narzędzia do szybkiego rozwiązywania problemów z dziedziny analizy danych – i to nie na jednym, ale na setkach komputerów.

Dla kogo jest ta książka?

Głównymi odbiorcami tej książki będą naukowcy i inżynierowie. Wybraliśmy te dwie grupy docelowe, gdyż mogą one najbardziej skorzystać na używaniu Sparka, rozszerzając zakres problemów możliwych do rozwiązania. Bogaty zbiór bibliotek ukierunkowanych na dane (jak MLlib) pozwala naukowcom zajmującym się danymi przejść do rozwiązywania problemów niemieszczących się na jednej maszynie, przy jednoczesnym wykorzystaniu wiedzy z zakresu statystyki. Natomiast inżynierowie nauczą się, jak pisać za pomocą Sparka rozproszone programy ogólnego zastosowania i wykonywać aplikacje produkcyjne. Inżynierowie i naukowcy z dziedziny danych nauczą się też z tej książki wielu szczegółowych zagadnień, a obie grupy będą mogły zastosować Sparka do rozwiązywania skomplikowanych problemów z zakresu swojej dziedziny.

Naukowcy zajmujący się danymi skupiają się na poszukiwaniu odpowiedzi na postawione wcześniej pytania lub budowie modeli na podstawie danych. Często mają odpowiednią wiedzę z zakresu matematyki i statystyki, a także znają w pewnym stopniu takie narzędzia, jak Python, R i SQL. W całym materiale umieściliśmy przykłady w językach Python i SQL, a także informacje o systemach uczących się i bibliotekach Sparka. Jeśli jesteście naukowcami zajmującymi się danymi, to mamy nadzieję, że po przeczytaniu tej książki będziecie umieli zastosować to samo matematyczne podejście do rozwiązywania problemów, lecz znacznie szybciej i na znacznie większą skalę.

Druga grupa, do której skierowana jest ta książka, to inżynierowie oprogramowania, którzy mają doświadczenie z językami Java, Python lub innymi. Jeśli jesteście inżynierami, to mamy nadzieję, że ta książka pokaże Wam, jak tworzyć klaster w Sparku, korzystać z jego powłoki i pisać aplikacje rozwiązujące problemy z zakresu przetwarzania równoległego. Osoby znające Hadoop będą miały łatwiejszy start przy określaniu zasad interakcji z systemem plików HDFS (Hadoop Distributed File System) oraz sposobie zarządzania klastrem. Niemniej podstawowe zasady rozproszonego wykonywania programów zostały tu również omówione.

Niezależnie od tego, czy jesteście naukowcami, czy inżynierami, korzystanie z tej książki wymaga pewnej znajomości języków programowania Python, Java, Scala lub zbliżonych. Zakładamy, że wypracowaliście już rozwiązania dotyczące przechowywania Waszych danych, więc omawiamy inne często stosowane sposoby pobierania i zapisywania danych, jednak nie mówimy o ich tworzeniu. Jeśli nie macie doświadczenia z żadnym z tych języków, to nie martwice się – jest wiele materiałów do ich nauki. Kilka dostępnych książek podano w punkcie Dodatkowe książki.

Układ treści

Rozdziały tej książki są tak ułożone, aby można było przeanalizować cały materiał od początku do końca. Każdy rozdział rozpoczyna spis jego części najistotniejszych dla naukowców zajmujących się danymi oraz najważniejszych dla inżynierów. Mamy jednak nadzieję, że materiał będzie zrozumiały dla wszystkich, niezależnie od ich przygotowania.

Pierwsze dwa rozdziały pozwolą na rozpoczęcie pracy przez instalację Sparka na swoim laptopie i dadzą pojęcie o tym, co można dzięki niemu osiągnąć. Gdy już uporamy się z instalacją i motywacjami, zanurkujemy w powłokę Sparka, która jest bardzo użytecznym narzędziem do tworzenia programów i prototypowania. Kolejne rozdziały szczegółowo omawiają interfejs programowy Sparka, sposób wykonywania aplikacji w klastrze oraz biblioteki wyższego poziomu dostępne w Sparku (jak Spark SQL oraz MLlib).

Dodatkowe książki

Jeśli jesteś naukowcem zajmującym się danymi i nie masz doświadczenia z językiem Python, to książki Learning Python i Head First Python (obie z O’Reilly) stanowią doskonałe wprowadzenie. Dla osób znających ten język, które chcą się dowiedzieć więcej, polecam Dive into Python (Apress) – świetną książkę, która umożliwia głębsze zrozumienie Pythona.

Jeśli jesteś inżynierem i po przeczytaniu tej książki chcesz rozszerzyć swoją wiedzę o umiejętności związane z analizą danych, to polecam wyśmienite książki Machine Learning for Hackers i Doing Data Science (wydane przez O’Reilly).

Książka jest skierowana do osób początkujących. Planujemy także wydanie tytułu dla tych, którzy chcą dowiedzieć się więcej o wewnętrznych funkcjach Sparka.

Konwencje stosowane w książce

W tekście książki zastosowano następujące wyróżnienia:

Kursywa

Wskazuje nowe terminy, adresy URL, adresy e-mailowe i nazwy plików oraz ich rozszerzenia.

Czcionka nieproporcjonalna (courier)

Jest stosowana do listingów programów, a także w tekście do wyróżnienia elementów programu, jak nazwy zmiennych lub funkcji, bazy danych, typy danych, zmienne środowiskowe, instrukcje oraz słowa kluczowe.

Pogrubione

Polecenia lub inne teksty, które powinny być wpisane przez użytkownika.

Czcionka courier pisana kursywą

Pokazuje teksty, które powinny być zastąpione wartościami podanymi przez użytkownika lub wartościami wynikającymi z kontekstu.

Ten element oznacza wskazówkę lub sugestię.                                                                                       

Ten element oznacza ostrzeżenie lub przestrogę.                                                                                       

Przykłady kodu

Wszystkie przykłady kodu zawarte w tej książce są zapisane w GitHub. Można je przeanalizować i sprawdzić w witrynie https://github.com/databricks/learning-spark. Przykłady kodu zostały napisane w językach Java, Scala i Python.

Nasze przykłady w języku Java są przeznaczone dla wersji 6 lub wyższej Javy. W Java 8 wprowadzono składnię o nazwie lambdas, która pozwala na znacznie łatwiejsze pisanie funkcji inline, a tym samym uproszczenie kodu Sparka. Postanowiliśmy jednak, że w większości przykładów nie będziemy korzystać z tej zalety, gdyż wiele organizacji nie używa jeszcze Java 8. Jeśli chcecie wypróbować składnię Java 8, to możecie skorzystać z bloga Databricks, gdzie znajduje się wpis na ten temat. Niektóre przykłady zostały przeniesione do Java 8 i umieszczone na witrynie GitHub tej książki.

Książka ta ma pomóc w wykonywaniu waszych zadań. Jeśli jakiś kod jest zapisany w tej książce, to możecie wykorzystać go w swoich programach i dokumentacji. Nie trzeba się kontaktować z autorami w celu uzyskania zgody, o ile nie wykorzystujecie znacząco dużych fragmentów kodu. Na przykład napisanie programu, który wykorzystuje kilka fragmentów kodu z książki, nie wymaga zgody. Sprzedaż lub dystrybucja płyty CD z przykładami z książek wydawnictwa O’Reilly (lub na jego licencji) wymaga już takiej zgody. Odpowiedź na pytanie przez zacytowanie książki i przykładów z niej zgody nie wymaga. Z kolei potrzebna jest zgoda na wprowadzenie do dokumentacji produktu znaczącej ilości przykładowego kodu z książki.

Doceniamy, choć nie wymagamy powoływania się na źródło, czyli podawania autorów, tytułu, miejsca i roku wydania. Na przykład: Holden Karau, Andy Konwinski, Patrick Wendell, Matei Zaharia, Poznajemy Sparka, Warszawa 2015.

Jeśli macie wątpliwości, czy wykorzystanie kodu wykracza poza zwykłe użycie, prosimy o kontakt e-mailowy: permissions@oreilly.com.

Safari® Books Online

Safari Books Online to cyfrowa biblioteka na żądanie, zawierająca treści eksperckie w formie książek i wideo, przygotowane przez wiodących autorów z dziedziny technologii i biznesu.

Profesjonalni inżynierowie, twórcy oprogramowania, projektanci witryn oraz specjaliści od biznesu i kreatywności korzystają z Safari Books Online jako podstawowego źródła: analiz, rozwiązywania problemów, wiedzy oraz materiałów szkoleniowych przed egzaminami certyfikacyjnymi.

Safari Books Online oferuje szeroki zakres planów i wycen dla prywatnych przedsiębiorstw, rządu, edukacji i indywidualnych użytkowników.

Członkowe cyfrowej biblioteki mają dostęp do tysięcy książek, filmów szkoleniowych oraz maszynopisów przed ich publikacją w postaci bazy danych z pełnią narzędzi wyszukiwania. Materiały pochodzą z takich wydawnictw, jak O’Reilly Media, Prentice Hall Professional, Addison-Wesley Professional, Microsoft Press, Sams, Que, Peachpit Press, Focal Press, Cisco Press, John Wiley & Sons, Syngress, Morgan Kaufmann, IBM Redbooks, Packt, Adobe Press, FT Press, Apress, Manning, New Riders, McGraw-Hill, Jones & Bartlett, Course Technology, a także setek innych. Więcej informacji na temat Safari Books Online można znaleźć na naszej stronie internetowej.

Jak się z nami skontaktować

Wszelkie komentarze i pytania dotyczące tej książki proszę kierować do wydawcy oryginału:

O’Reilly Media, Inc.

1005 Gravenstein Highway North

Sebastopol, CA 95472

800-998-9938 (w USA i Kanadzie)

707-829-0515 (dla połączeń międzynarodowych i lokalnych)

707-829-0104 (fax)

Prowadzimy specjalną witrynę dla tej książki, gdzie znajdują się errata, przykłady oraz dodatkowe informacje. Dostęp do witryny jest pod adresem http://bit.ly/learning-spark.

Komentarze i pytania techniczne dotyczące książki proszę kierować pod adres bookquestions@oreilly.com

Więcej informacji o naszych książkach, kursach, konferencjach i aktualności można znaleźć na stronie http://www.oreilly.com

Znajdź nas na Facebooku: http://facebook.com/oreilly

Śledź nas: http://twitter.com/oreillymedia

Oglądaj nas na YouTube: http://www.youtube.com/oreillymedia

Aktualizacje

8 maja 2015

Informacje o następujących elementach zostały zaktualizowane w Spark 1.3:

• SparkSQL

• Spark Streaming

• Konfiguracja Sparka

• Współrzędne Mavena

Podziękowania

Autorzy pragną podziękować recenzentom, którzy przekazali nam uwagi na temat tej książki. Są to: Joseph Bradley, Dave Bridgeland, Chaz Chandler, Mick Davies, Sam DeHority, Vida Ha, Andrew Gal, Michael Gregson, Jan Joeppen, Stephan Jou, Jeff Martinez, Josh Mahonin, Andrew Or, Mike Patterson, Josh Rosen, Bruce Szalwinski, Xiangrui Meng oraz Reza Zadeh.

Na specjalne podziękowanie autorów zasługują: David Andrzejewski, David Buttler, Juliet Hougland, Marek Kolodziej, Taka Shinagawa, Deborah Siegel, dr Normen Müller, Ali Ghodsi i Sameer Farooqui. Przekazali oni szczegółowe uwagi dotyczące większości rozdziałów i pomogli wprowadzić znaczące ulepszenia.

Chcemy też podziękować ekspertom, którzy poświęcili czas na zredagowanie i napisanie części rozdziałów. Tathagata Das pracował z nami przy bardzo napiętym grafiku, aby ukończyć rozdział 10. Nie ograniczył się tylko do poprawienia przykładów i pomocy technicznej, ale odpowiedział na wiele pytań i usprawnił płynność tekstu. Michael Armbrust pomógł nam zweryfikować poprawność rozdziału dotyczącego Spark SQL. Joseph Bradley przygotował wprowadzający przykład do MLlib znajdujący się w rozdziale 11. Reza Zadeh przygotował tekst i przykłady do redukcji wymiarów. Xiangrui Meng, Joseph Bradley i Reza Zadeh przekazali także opinie dotyczące edycji i redakcji technicznej rozdziału o MLlib.

ROZDZIAŁ 1
Wprowadzenie do analizy danych w Sparku

W tym rozdziale przedstawiono ogólny opis pakietu Apache Spark. Osoby, które znają to narzędzie i jego komponenty, mogą przejść od razu do rozdziału 2.

Czym jest Apache Spark?

Apache Spark to platforma przetwarzania klastrowego przygotowana jako szybkie narzędzie ogólnego przeznaczenia.

Jeśli idzie o szybkość, to Spark rozwija model MapReduce, efektywnie obsługując więcej rodzajów obliczeń, w tym interakcyjne zapytania i przetwarzanie strumieniowe. Szybkość jest ważna w przetwarzaniu dużych zbiorów danych, gdyż oznacza to możliwość interakcyjnego dostępu do danych zamiast oczekiwania liczonego w minutach lub godzinach. Jedną z podstawowych cech Sparka jest możliwość wykonywania obliczeń w pamięci, a przy tym system jest też bardziej efektywny niż MapReduce w zakresie złożonych aplikacji działających na dysku.

Z punktu widzenia zastosowań ogólnych Spark obejmuje szeroki zakres działań, które wcześniej wymagały oddzielnych systemów rozproszonych, w tym aplikacji wsadowych, algorytmów iteracyjnych, iteracyjnych zapytań oraz strumieniowania. Dzięki obsłudze tych zadań w ramach jednego mechanizmu Spark pozwala na łatwe i tanie powiązanie różnych typów przetwarzania, co jest często niezbędne w strumieniowej analizie danych produkcyjnych. Ponadto zmniejsza on obciążenie związane z utrzymywaniem oddzielnych narzędzi.

Spark jest z założenia łatwo dostępny dzięki API w językach Python, Java, Scala i SQL oraz rozbudowanym wewnętrznym bibliotekom. Integruje się też ściśle z innymi narzędziami Big Data. W szczególności Spark może działać w klastrach Hadoop i zapewnić dostęp do wszelkich źródeł danych Hadoop, w tym do bazy Cassandra.

Ujednolicony stos

Spark jako projekt zawiera wiele ściśle zintegrowanych komponentów. Jego jądrem jest „mechanizm obliczeniowy”, odpowiedzialny za harmonogramowanie, dystrybucję i monitorowanie aplikacji złożonych z wielu zadań obliczeniowych na wielu wykonujących je maszynach, czyli inaczej na klastrze komputerowym. Ponieważ podstawowy mechanizm Sparka jest zarówno szybki, jak i ogólnego zastosowania, obsługuje wiele komponentów wysokiego poziomu dla różnych zadań, jak SQL czy systemy uczące się. Komponenty te są zaprojektowane do ścisłej współpracy, co pozwala nam na łączenie ze sobą bibliotek w projekcie programistycznym. Filozofia ścisłej integracji ma kilka zalet. Po pierwsze wszystkie biblioteki i komponenty wyższego poziomu na stosie korzystają z ulepszeń wprowadzanych na niższych poziomach. Na przykład, gdy podstawowy mechanizm Sparka dodaje automatycznie biblioteki optymalizacji, SQL i systemów uczących się, one także przyśpieszają. Po drugie koszty związane z uruchomieniem stosu są minimalizowane, gdyż zamiast uruchamiania 5–10 niezależnych systemów programowania organizacja musi uruchomić tylko jeden. Koszty obejmują wdrożenie, utrzymanie, testowanie, obsługę i inne elementy związane z oprogramowaniem. Oznacza to także, że przy dodawaniu do stosu Sparka kolejnego komponentu każda organizacja korzystająca ze Sparka będzie mogła natychmiast go wypróbować. Zmienia to koszt testowania nowego rodzaju analizy danych, gdyż zamiast pobierania, wdrażania i uczenia się nowego oprogramowania wystarczy uaktualnić Sparka.

Wreszcie jedną z największych zalet ścisłej integracji jest możliwość budowy aplikacji, które bez przeszkód łączą różne modele przetwarzania. Na przykład w Sparku można napisać jedną aplikację, która wykorzystuje system uczący się do klasyfikacji danych w czasie rzeczywistym, w miarę jak są otrzymywane ze źródeł strumieniowych. Jednocześnie analityk może użyć zapytania w stosunku do danych wynikowych, także w czasie rzeczywistym, przez SQL (np. połączyć dane z plikami dziennika, które nie mają struktury). Ponadto bardziej zaawansowani inżynierowie danych i naukowcy z tej dziedziny mogą mieć dostęp do tych samych danych do analizy ad hoc przez powłokę Pythona. Przy tym wszystkim zespół informatyków musi utrzymywać tylko jeden system.

Teraz w skrócie przybliżymy każdy z komponentów Sparka pokazanych na rysunku 1.1.

Rysunek 1.1. Stos Sparka

Jądro Sparka

Jądro Sparka obejmuje podstawowe funkcje Sparka, w tym komponenty harmonogramowania zadań, zarządzanie pamięcią, odtwarzanie systemu po awarii, interakcje z systemami magazynowania danych i wiele więcej. Mieści się tam także API, które definiuje odporne rozproszone zbiory danych (resilient distributed dataset, RDD), które stanowią podstawowe pojęcie programowania w Sparku. RDD reprezentują kolekcję elementów rozproszonych w wielu węzłach obliczeniowych, którymi można równolegle manipulować. Jądro Sparka zapewnia wiele różnych API do budowy i przetwarzania tych kolekcji.

Spark SQL

Spark SQL to pakiet Sparka przeznaczony do pracy z danymi strukturalnymi. Pozwala na kierowanie zapytań przez SQL, a także przez odmianę SQL, Apache Hive – nazywany Hive Query Language (HQL) – oraz obsługuje wiele źródeł danych, w tym tabele Hive, Parquet i JSON. Poza interfejsem SQL dla Sparka, Spark SQL pozwala deweloperom na mieszanie zapytań SQL z programowym przetwarzaniem danych obsługiwanym przez RDD w Pythonie, Javie i Scali. Wszystko to w jednej aplikacji, co pozwala połączyć SQL ze złożoną analizą danych. Ta ścisła integracja z bogatym środowiskiem programistycznym, jakie zapewnia Spark, sprawia, że Spark SQL jest niepodobny do innych narzędzi hurtowni oprogramowania open source. Spark SQL został dołączony do Sparka w wersji 1.0.

Starszym projektem SQL w Sparku był Shark, przygotowany przez Uniwersytet Kalifornijski w Berkeley, który modyfikował Apache Hive tak, aby ten działał w Sparku. Został on obecnie zastąpiony przez Spark SQL, co zapewnia lepszą integrację z mechanizmem Sparka i językiem API.

Spark Streaming

Spark Streaming to komponent Sparka umożliwiający przetwarzanie aktywnych strumieni danych. Przykładami strumieni danych są pliki dzienników generowane przez produkcyjne serwery sieciowe lub kolejki komunikatów zawierających aktualizacje stanu podane przez użytkowników usług sieciowych. Spark Streaming zapewnia API do manipulowania strumieniami danych, ściśle odpowiadające API dla RDD w jądrze Sparka, sprawiając, że programistom łatwo przychodzą nauka posługiwania się tym narzędziem i poruszanie się między aplikacjami w celu obsługi danych przechowywanych w pamięci, na dyskach lub przesyłanych w czasie rzeczywistym. Poniżej swego API Spark Streaming zostało zaprojektowane tak, aby zapewnić ten sam stopień odporności na błędy, przepustowość oraz stabilność, jaką daje jądro Sparka.

MLlib

Spark dostarczany jest z biblioteką zawierającą podstawowe funkcje systemów uczących się (machine learning, ML) o nazwie MLlib. MLlib zapewnia wiele algorytmów dla systemów uczących się, w tym klasyfikację, regresję, klastrowanie oraz wspólne filtrowanie, a także elementy wspomagające te funkcje, jak model analizy i importu danych. Zapewnia także proste typy zmiennych niskiego poziomu ML, w tym algorytm optymalizacji z malejącym gradientem. Wszystkie te metody są zaprojektowane tak, aby rozwiązywać zadania w całym klastrze.

GraphX

GraphX jest biblioteką obsługi wykresów (np. wykres dla sieci społecznościowych) oraz wykonywania równoległych obliczeń graficznych. Podobnie jak Spark Streaming oraz Spark SQL, GraphX rozszerza RDD API Sparka, pozwalając nam na tworzenie skierowanego wykresu z arbitralnymi właściwościami przypisanymi do każdego wierzchołka i krawędzi. GraphX zapewnia także różne operatory do obsługi wykresów (np. podwykresy i mapy wierzchołków) oraz bibliotekę powszechnie używanych algorytmów graficznych (np. PageRank i zliczanie trójkątów).

Zarządzanie klastrami

U podstaw Spark jest zaprojektowany tak, aby efektywnie obsługiwać zagadnienia w skali od jednego do tysięcy węzłów obliczeniowych. Aby to osiągnąć, przy maksymalnej elastyczności Spark może współpracować z wieloma menedżerami klastrów, w tym z Hadoop YARN, Apache Mesos oraz prostym menedżerem klastrów zawartym w Sparku, który nosi nazwę Standalone Scheduler. Jeśli instalujemy Sparka na pustych maszynach, Standalone Scheduler daje łatwy sposób na rozpoczęcie pracy; jeśli jednak mamy na komputerach klaster Hadoop YARN lub Mesos, obsługa przez Spark tych menedżerów klastrów pozwala naszym aplikacjom na korzystanie z nich. W rozdziale 7 można znaleźć opis różnych opcji oraz zasady wyboru właściwego menedżera klastrów.

Kto i po co korzysta ze Sparka?

Ponieważ Spark to schemat ogólnego zastosowania przeznaczony do przetwarzania klastrowego, wykorzystywany jest do różnego rodzaju aplikacji. We Wprowadzeniu omówiliśmy dwie grupy czytelników, dla których przeznaczona jest ta książka: naukowców zajmujących się danymi oraz inżynierów. Przyjrzyjmy się bliżej każdej z tych grup i temu, jak korzysta ze Sparka. Nie będzie zaskoczeniem, że typowe zastosowania dla obu grup są różne, ale można ująć je w dwie kategorie: nauka o danych oraz wykorzystanie danych.

Oczywiście nie są to precyzyjnie określone dziedziny ani schematy zastosowań, a wielu użytkowników ma umiejętności w obu zakresach, raz odgrywając rolę naukowca analizującego dane, a innym razem pisząc poważne aplikacje przetwarzania danych. Niemniej oddzielne rozpatrzenie tych grup i ich zadań może wiele rozjaśnić.

Zadania z zakresu nauki o danych

Nauka o danych, nowa dyscyplina nauki rozwijająca się w ostatnich latach, koncentruje się na analizie danych. Nie ma wprawdzie standardowej definicji, ale na nasze potrzeby naukowcy zajmujący się danymi to ludzie, których głównym zadaniem są analiza i modelowanie danych. Naukowcy ci mogą znać SQL, statystykę, modelowanie przyszłych zachowań (systemy uczące się) oraz programowanie, przede wszystkim w Pythonie, Matlabie lub R. Naukowcy zajmujący się danymi mają także doświadczenie w stosowaniu technik niezbędnych do przekształcania danych do formatów, które pozwalają na intuicyjną analizę (określaną czasem jako data wrangling).

Naukowcy zajmujący się danymi wykorzystują swoje umiejętności do analizy danych, mając na celu odpowiedzi na pytania lub wgląd w ich istotę. Często ich zakres pracy obejmuje analizę ad hoc, wykorzystują więc interakcyjne powłoki (zamiast budować złożone aplikacje), które pozwalają im możliwie szybko oglądać wyniki zapytań i fragmenty kodu. Proste i szybkie API Sparka wyśmienicie nadają się do tego celu, wbudowane zaś biblioteki oznaczają, że wiele algorytmów dostępnych jest na wyciągnięcie ręki.

Spark obsługuje różne wieloskładnikowe zadania z zakresu wiedzy o danych. Powłoka Sparka ułatwia interakcyjną analizę danych za pomocą języków Python lub Scala. Spark SQL ma oddzielną powłokę SQL, której można używać do eksploracji danych za pomocą SQL. Spark SQL można też wykorzystać jako część zwykłego programu w Sparku lub w powłoce Sparka. Systemy uczące się oraz analiza danych są obsługiwane dzięki bibliotekom MLlib. Ponadto obsługiwane są odwołania do zewnętrznych programów w Matlab lub R. Spark umożliwia naukowcom zajęcie się problemami związanymi ze znacznie większymi zbiorami danych, niż mogli to zrobić za pomocą takich narzędzi jak R lub Pandas.

Czasami, po pierwszej fazie analizy, praca naukowców zajmujących się danymi może wejść w fazę produkcyjną, zostać rozszerzona (np. zyskać odporność na błędy), stając się produkcyjną aplikacją analizy danych jako część aplikacji biznesowej. Na przykład wstępna analiza danych wykonana przez naukowca może prowadzić do utworzenia systemu zalecanego w produkcji, zintegrowanego z aplikacją sieciową i wykorzystywanego do tworzenia zalecenia produktu dla użytkowników. Często inna osoba lub zespół będą prowadzić proces przystosowania pracy naukowca do celów produkcyjnych. Tą osobą jest zwykle inżynier.

Aplikacje przetwarzania danych

Inne przypadki zastosowania Sparka można opisać z punktu widzenia osoby inżyniera. Dla naszych celów potraktujemy inżynierów jako liczną klasę twórców oprogramowania, którzy używają Sparka do budowania produkcyjnych aplikacji przetwarzania danych. Rozumieją oni zwykle zasady inżynierii oprogramowania, takie jak enkapsulacja, projektowanie interfejsów czy programowanie obiektowe. Zwykle mają dyplom z nauk komputerowych. Wykorzystują umiejętności inżynierskie do projektowania i tworzenia systemów programistycznych implementujących przypadki biznesowe.

Inżynierom Spark oferuje prosty sposób zrównoleglenia aplikacji w wielu klastrach dzięki złożoności programowania systemów rozproszonych, komunikacji sieciowej oraz odporności na błędy. System daje im narzędzia do monitorowania, weryfikacji oraz dostrojenia aplikacji, pozwalając jednocześnie na szybką implementację zadań. Modułowa budowa API (oparta na przekazywaniu rozproszonych kolekcji obiektów) ułatwia rozkład pracy na czynniki dzięki zastosowaniu bibliotek i ich lokalnego testowania. Użytkownicy Sparka wybierają go do tworzenia swoich aplikacji przetwarzania danych, gdyż zapewnia on wiele różnych funkcji, jest prosty do nauki i użytkowania oraz dopracowany i niezawodny.

Krótka historia Sparka

Spark to projekt open source zbudowany i utrzymywany przez aktywną i zróżnicowaną społeczność deweloperów. Jeśli wasza organizacja po raz pierwszy próbuje korzystać ze Sparka, może zainteresować Was historia tego projektu. Spark powstał w 2009 r. jako projekt badawczy Uniwersytetu Kalifornijskiego w Berkeley w RAD Lab (przekształconym w AMPLab). Jego twórcy pracowali wcześniej nad Hadoop Map‐Reduce i widzieli, że jest on nieefektywny przy wykonywaniu zadań iteracyjnych i interakcyjnych. Dlatego od początku Spark został zaprojektowany jako narzędzie szybko wykonujące interakcyjne zapytania i algorytmy iteracyjne, wprowadzając obsługę przechowywania danych w pamięci oraz efektywny sposób reagowania na błędy.

Artykuły o Sparku publikowano na konferencjach akademickich i wkrótce po jego powstaniu w 2009 był on w przypadku niektórych zadań już 10–20 razy szybszy niż MapReduce.

Jednymi z pierwszych użytkowników Sparka były inne grupy z uniwersytetu w Berkeley, w tym badacze zajmujący się systemami uczącymi się, jak ci pracujący w projekcie Mobile Millennium, gdzie wykorzystywano Sparka do monitorowania i przewidywania korków w rejonie zatoki San Francisco. Wkrótce Sparka zaczęło używać wiele zewnętrznych organizacji, a dziś ponad 50 z nich podaje, że ich strona jest Spark PoweredBy (obsługiwana przez Sparka), a dziesiątki innych mówią o stosowaniu Sparka na spotkaniach takich społeczności, jak Meetups oraz Spark Summit. Poza uniwersytetem w Berkeley głównymi sponsorami Sparka są Databricks, Yahoo! oraz Intel.

W 2011 r. AMPLab zaczęło rozwijać dla Sparka komponenty wyższego poziomu, takie jak Shark (Hive on Spark[3]) oraz Spark Streaming. Te i inne komponenty nazywane są czasem stosem analitycznym Berkeley (Berkeley Data Analytics Stack, BDAS).

Spark został udostępniony jako open source w marcu 2010, a w czerwcu 2013 r. został przeniesiony do Apache Software Foundation, gdzie jest teraz wysoko cenionym przedsięwzięciem.

Wersje i wydania Sparka

Od czasu powstania Sparkowi i samemu projektowi towarzyszy bardzo aktywna społeczność, z coraz większą liczbą wspierających go podmiotów. Przy Sparku 1.0 pracowało ponad 100 osób. Poziom aktywności gwałtownie wzrósł i aktualizowane wersje Sparka są wydawane regularnie. Spark 1.0 wydano w maju 2014 r. W tej książce podstawę stanowi Spark w wersji 1.1.0 i następnych, z uwzględnieniem aktualizacji dla Sparka 1.3, jednak większość pojęć i przykładów można wykorzystać także przy wersjach wcześniejszych.

Warstwy pamięci w Sparku

Spark może tworzyć rozproszone zbiory danych z dowolnego pliku zapisanego w formacie rozproszonego systemu plików Hadoop (HDFS) lub w innych systemach pamięci obsługiwanych przez API w Hadoop (w tym lokalne systemy plików, Amazon S3, Cassandra, Hive, HBase itp.). Trzeba pamiętać, że Spark nie wymaga Hadoop; po prostu obsługuje systemy pamięci, implementując API Hadoop. Spark obsługuje pliki tekstowe, pliki sekwencyjne (SequenceFiles), Avro, Parquet oraz wszystkie inne formaty wejściowe Hadoop. Interakcja z tymi źródłami danych została omówiona w rozdziale 5.

Przypisy

[1] Big Data – termin odnoszący się do dużych, zmiennych i różnorodnych zbiorów danych, których nie można przetwarzać ani analizować za pomocą tradycyjnych metod (Wikipedia – przyp. tłum.).

[2] MapReduce to platforma przetwarzania równoległego stworzona przez Google (przyp. tłum.).

[3] Zastąpiony obecnie przez Spark SQL.