Co to jest Apache Spark? Platforma Big Data, która zmiażdżyła Hadoop

Definicja Apache Spark

Apache Spark to platforma przetwarzania danych, która może szybko wykonywać zadania przetwarzania na bardzo dużych zestawach danych, a także może dystrybuować zadania przetwarzania danych na wiele komputerów, samodzielnie lub w połączeniu z innymi rozproszonymi narzędziami obliczeniowymi. Te dwie cechy są kluczem do świata dużych zbiorów danych i uczenia maszynowego, które wymagają uporządkowania ogromnej mocy obliczeniowej, aby przejść przez duże magazyny danych. Spark zdejmuje również część obciążeń programistycznych związanych z tymi zadaniami z barków programistów dzięki łatwemu w użyciu interfejsowi API, który odciąża większość pracy związanej z obliczeniami rozproszonymi i przetwarzaniem dużych zbiorów danych.

Od swoich skromnych początków w AMPLab na UC Berkeley w 2009 roku, Apache Spark stał się jedną z kluczowych platform przetwarzania rozproszonego dużych zbiorów danych na świecie. Platformę Spark można wdrożyć na wiele sposobów, zapewnia natywne powiązania dla języków programowania Java, Scala, Python i R oraz obsługuje język SQL, przesyłanie strumieniowe danych, uczenie maszynowe i przetwarzanie wykresów. Znajdziesz go używany przez banki, firmy telekomunikacyjne, firmy zajmujące się grami, rządy i wszystkich głównych gigantów technologicznych, takich jak Apple, Facebook, IBM i Microsoft.

Architektura Apache Spark

Na poziomie podstawowym aplikacja Apache Spark składa się z dwóch głównych komponentów: sterownika, który konwertuje kod użytkownika na wiele zadań, które mogą być rozprowadzane między węzłami roboczymi, oraz wykonawców, które działają na tych węzłach i wykonują przypisane im zadania. Do pośrednictwa między nimi niezbędna jest jakaś forma menedżera klastra.

Po wyjęciu z pudełka Spark może działać w trybie autonomicznego klastra, który po prostu wymaga platformy Apache Spark i maszyny JVM na każdej maszynie w klastrze. Jednak bardziej prawdopodobne jest, że będziesz chciał skorzystać z bardziej niezawodnego systemu zarządzania zasobami lub klastrem, aby zająć się przydzielaniem pracowników na żądanie. W przedsiębiorstwie zwykle będzie to oznaczać działanie w Hadoop YARN (w ten sposób dystrybucje Cloudera i Hortonworks uruchamiają zadania Spark), ale Apache Spark może również działać na Apache Mesos, Kubernetes i Docker Swarm.

Jeśli szukasz rozwiązania zarządzanego, Apache Spark można znaleźć w ramach usług Amazon EMR, Google Cloud Dataproc i Microsoft Azure HDInsight. Databricks, firma zatrudniająca założycieli Apache Spark, oferuje również platformę Databricks Unified Analytics Platform, która jest kompleksową usługą zarządzaną, która oferuje klastry Apache Spark, obsługę przesyłania strumieniowego, zintegrowane tworzenie notebooków w sieci oraz zoptymalizowaną wydajność operacji we / wy w chmurze. standardowa dystrybucja Apache Spark.

Apache Spark buduje polecenia przetwarzania danych użytkownika w ukierunkowany wykres acykliczny lub DAG. DAG jest warstwą planowania Apache Spark; określa, jakie zadania są wykonywane na jakich węzłach iw jakiej kolejności.  

Spark vs.Hadoop: Dlaczego warto używać Apache Spark?

Warto zauważyć, że Apache Spark vs. Apache Hadoop to trochę myląca nazwa. Obecnie Spark znajduje się w większości dystrybucji Hadoop. Jednak ze względu na dwie duże zalety Spark stał się platformą z wyboru podczas przetwarzania dużych zbiorów danych, wyprzedzając stary paradygmat MapReduce, który zapewnił Hadoopowi rangę.

Pierwsza zaleta to szybkość. Silnik danych w pamięci Spark oznacza, że ​​może wykonywać zadania nawet sto razy szybciej niż MapReduce w pewnych sytuacjach, szczególnie w porównaniu z zadaniami wieloetapowymi, które wymagają zapisywania stanu na dysku między etapami. Zasadniczo MapReduce tworzy dwustopniowy wykres wykonania składający się z mapowania i redukcji danych, podczas gdy DAG Apache Spark ma wiele etapów, które można wydajniej dystrybuować. Nawet zadania Apache Spark, w których dane nie mogą być całkowicie zawarte w pamięci, są zwykle około 10 razy szybsze niż ich odpowiednik MapReduce.

Drugą zaletą jest przyjazny dla deweloperów interfejs Spark API. Równie ważne, jak przyspieszenie Sparka, można argumentować, że przyjazność interfejsu Spark API jest jeszcze ważniejsza.

Spark Core

W porównaniu z MapReduce i innymi komponentami Apache Hadoop, API Apache Spark jest bardzo przyjazne dla programistów, ukrywając dużą część złożoności silnika przetwarzania rozproszonego za prostymi wywołaniami metod. Kanonicznym przykładem tego jest to, jak prawie 50 wierszy kodu MapReduce do liczenia słów w dokumencie można zredukować do zaledwie kilku wierszy Apache Spark (tutaj pokazano w Scali):

val textFile = sparkSession.sparkContext.textFile („hdfs: /// tmp / words”)

val counts = textFile.flatMap (line => line.split („“))

                      .map (słowo => (słowo, 1))

                      .reduceByKey (_ + _)

counts.saveAsTextFile („hdfs: /// tmp / words_agg”)

Zapewniając powiązania z popularnymi językami do analizy danych, takimi jak Python i R, a także bardziej przyjazne dla przedsiębiorstw Java i Scala, Apache Spark umożliwia każdemu, od programistów aplikacji po analityków danych, wykorzystanie jego skalowalności i szybkości w przystępny sposób.

Spark RDD

Sercem Apache Spark jest koncepcja Resilient Distributed Dataset (RDD), abstrakcji programowania, która reprezentuje niezmienną kolekcję obiektów, które można podzielić na klaster obliczeniowy. Operacje na RDD można również podzielić w obrębie klastra i wykonać w równoległym procesie wsadowym, co prowadzi do szybkiego i skalowalnego przetwarzania równoległego.

RDD można tworzyć z prostych plików tekstowych, baz danych SQL, sklepów NoSQL (takich jak Cassandra i MongoDB), zasobników Amazon S3 i wielu innych. Duża część interfejsu Spark Core API jest zbudowana na tej koncepcji RDD, umożliwiając tradycyjne mapowanie i zmniejszanie funkcjonalności, ale także zapewnia wbudowaną obsługę łączenia zestawów danych, filtrowania, próbkowania i agregacji.

Spark działa w sposób rozproszony, łącząc proces rdzenia sterownika , który dzieli aplikację Spark na zadania i rozdziela je między wiele procesów wykonawczych , które wykonują pracę. Te moduły wykonawcze można skalować w górę iw dół zgodnie z wymaganiami aplikacji.

Spark SQL

Pierwotnie znany jako Shark, Spark SQL stał się coraz ważniejszy dla projektu Apache Spark. Jest to prawdopodobnie interfejs najczęściej używany przez dzisiejszych programistów podczas tworzenia aplikacji. Spark SQL koncentruje się na przetwarzaniu danych strukturalnych przy użyciu podejścia Dataframe zapożyczonego z języków R i Python (w Pandas). Ale jak sama nazwa wskazuje, Spark SQL zapewnia również interfejs zgodny z SQL2003 do wykonywania zapytań o dane, udostępniając moc Apache Spark zarówno analitykom, jak i programistom.

Oprócz standardowej obsługi SQL, Spark SQL zapewnia standardowy interfejs do odczytu i zapisu w innych magazynach danych, w tym JSON, HDFS, Apache Hive, JDBC, Apache ORC i Apache Parquet, z których wszystkie są obsługiwane po wyjęciu z pudełka. Inne popularne sklepy - Apache Cassandra, MongoDB, Apache HBase i wiele innych - mogą być używane przez podłączenie oddzielnych łączników z ekosystemu Spark Packages.

Wybranie niektórych kolumn z ramki danych jest tak proste, jak ta linia:

miastaDF.select („nazwa”, „pop”)

Korzystając z interfejsu SQL rejestrujemy ramkę danych jako tabelę tymczasową, po której możemy wysyłać do niej zapytania SQL:

miastaDF.createOrReplaceTempView („miasta”)

spark.sql („WYBIERZ nazwę, pop Z miast”)

W tle Apache Spark używa optymalizatora zapytań o nazwie Catalyst, który bada dane i zapytania w celu stworzenia wydajnego planu zapytań dla lokalizacji danych i obliczeń, który wykona wymagane obliczenia w całym klastrze. W erze Apache Spark 2.x zalecanym podejściem do programowania jest interfejs Spark SQL ramek danych i zestawów danych (zasadniczo wpisana ramka danych, którą można sprawdzić w czasie kompilacji pod kątem poprawności i skorzystać z dalszej optymalizacji pamięci i obliczeń w czasie wykonywania). . Interfejs RDD jest nadal dostępny, ale zalecany tylko wtedy, gdy nie można zaspokoić Twoich potrzeb w ramach paradygmatu Spark SQL.

Spark 2.4 wprowadził zestaw wbudowanych funkcji wyższego rzędu do bezpośredniego manipulowania tablicami i innymi typami danych wyższego rzędu.

Spark MLlib

Apache Spark zawiera również biblioteki do stosowania technik uczenia maszynowego i analizy wykresów do danych na dużą skalę. Spark MLlib zawiera platformę do tworzenia potoków uczenia maszynowego, co pozwala na łatwą implementację wyodrębniania funkcji, selekcji i transformacji w dowolnym uporządkowanym zestawie danych. MLlib jest dostarczany z rozproszonymi implementacjami algorytmów klastrowania i klasyfikacji, takich jak grupowanie k-średnich i losowe lasy, które można z łatwością zamieniać i wymieniać z niestandardowych potoków. Modele mogą być trenowane przez naukowców zajmujących się danymi w Apache Spark przy użyciu języka R lub Python, zapisywane przy użyciu MLlib, a następnie importowane do potoku opartego na języku Java lub Scala w celu użycia w środowisku produkcyjnym.

Należy zauważyć, że chociaż Spark MLlib obejmuje podstawowe uczenie maszynowe, w tym klasyfikację, regresję, klastrowanie i filtrowanie, nie obejmuje udogodnień do modelowania i uczenia głębokich sieci neuronowych (szczegółowe informacje można znaleźć w przeglądzie Spark MLlib). Trwają jednak prace nad potokami uczenia głębokiego.

Spark GraphX

Spark GraphX ​​zawiera wybór rozproszonych algorytmów przetwarzania struktur grafowych, w tym implementację Google PageRank. Te algorytmy wykorzystują podejście RDD Spark Core do modelowania danych; pakiet GraphFrames umożliwia wykonywanie operacji na wykresach na ramkach danych, w tym korzystanie z optymalizatora Catalyst dla zapytań grafowych.

Spark Streaming

Spark Streaming był wczesnym dodatkiem do Apache Spark, który pomógł mu uzyskać przyczepność w środowiskach wymagających przetwarzania w czasie rzeczywistym lub prawie w czasie rzeczywistym. Wcześniej przetwarzanie wsadowe i strumieniowe w świecie Apache Hadoop było oddzielnymi rzeczami. Możesz napisać kod MapReduce na potrzeby przetwarzania wsadowego i użyć czegoś takiego jak Apache Storm do spełnienia wymagań dotyczących przesyłania strumieniowego w czasie rzeczywistym. To oczywiście prowadzi do różnych baz kodów, które muszą być zsynchronizowane dla domeny aplikacji, mimo że są oparte na zupełnie innych strukturach, wymagają różnych zasobów i wiążą się z różnymi problemami operacyjnymi dotyczącymi ich uruchamiania.

Usługa Spark Streaming rozszerzyła koncepcję przetwarzania wsadowego Apache Spark na przesyłanie strumieniowe, dzieląc strumień na ciągłą serię mikropróbek, którymi można następnie manipulować za pomocą interfejsu API Apache Spark. W ten sposób kod w operacjach wsadowych i strumieniowych może współdzielić (w większości) ten sam kod, działając w tej samej strukturze, zmniejszając w ten sposób obciążenie programisty i operatora. Wszyscy wygrywają.

Krytyka podejścia Spark Streaming polega na tym, że mikrobatching w scenariuszach, w których wymagana jest odpowiedź o niskim opóźnieniu na przychodzące dane, może nie być w stanie dorównać wydajności innych platform obsługujących strumieniowanie, takich jak Apache Storm, Apache Flink i Apache Apex, z których wszystkie wykorzystują czystą metodę przesyłania strumieniowego, a nie mikrobatche.

Strukturalne przesyłanie strumieniowe

Structured Streaming (dodany w Spark 2.x) to Spark Streaming tym, czym Spark SQL był dla Spark Core API: interfejs API wyższego poziomu i łatwiejsza abstrakcja do pisania aplikacji. W przypadku Structure Streaming, interfejs API wyższego poziomu zasadniczo umożliwia programistom tworzenie nieskończonych strumieni danych i zestawów danych. Rozwiązuje również pewne bardzo realne problemy, z którymi borykali się użytkownicy we wcześniejszych ramach, zwłaszcza dotyczące radzenia sobie z agregacjami w czasie zdarzeń i opóźnionym dostarczaniem wiadomości. Wszystkie zapytania dotyczące strumieni strukturalnych przechodzą przez optymalizator zapytań Catalyst, a nawet mogą być uruchamiane w sposób interaktywny, umożliwiając użytkownikom wykonywanie zapytań SQL na danych przesyłanych strumieniowo na żywo.

Structured Streaming pierwotnie opierał się na schemacie mikrobatchingu Spark Streaming do obsługi danych strumieniowych. Ale w Spark 2.3 zespół Apache Spark dodał tryb ciągłego przetwarzania o niskim opóźnieniu do Structured Streaming, umożliwiając mu obsługę odpowiedzi z opóźnieniami tak niskimi jak 1 ms, co jest bardzo imponujące. Począwszy od Spark 2.4, ciągłe przetwarzanie jest nadal uważane za eksperymentalne. Podczas gdy strumieniowanie strukturalne jest oparte na silniku Spark SQL, ciągłe przesyłanie strumieniowe obsługuje tylko ograniczony zestaw zapytań.

Structured Streaming to przyszłość aplikacji do przesyłania strumieniowego na platformie, więc jeśli tworzysz nową aplikację do przesyłania strumieniowego, powinieneś użyć Structured Streaming. Starsze interfejsy API przesyłania strumieniowego Spark będą nadal obsługiwane, ale projekt zaleca przeniesienie do Structured Streaming, ponieważ nowa metoda sprawia, że ​​pisanie i utrzymywanie kodu przesyłania strumieniowego jest znacznie bardziej znośne.

Potoki uczenia głębokiego

Apache Spark obsługuje głębokie uczenie za pośrednictwem potoków uczenia głębokiego. Korzystając z istniejącej struktury potoków MLlib, możesz wywoływać biblioteki głębokiego uczenia niższego poziomu i konstruować klasyfikatory w zaledwie kilku wierszach kodu, a także stosować niestandardowe wykresy TensorFlow lub modele Keras do przychodzących danych. Te wykresy i modele można nawet zarejestrować jako niestandardowe funkcje Spark SQL UDF (funkcje zdefiniowane przez użytkownika), dzięki czemu modele uczenia głębokiego można zastosować do danych jako część instrukcji SQL.

Samouczki dotyczące Apache Spark

Gotowy do zanurzenia się i nauki Apache Spark? Gorąco polecamy Evan Heitman's A Neanderthal's Guide to Apache Spark in Python, który nie tylko przedstawia podstawy działania Apache Spark w stosunkowo prosty sposób, ale także prowadzi użytkownika przez proces pisania prostej aplikacji w języku Python korzystającej z frameworka . Artykuł został napisany z perspektywy naukowca danych, co ma sens, ponieważ data science to świat, w którym duże zbiory danych i uczenie maszynowe mają coraz większe znaczenie.

Jeśli szukasz przykładów Apache Spark, które pozwolą Ci zorientować się, co platforma potrafi i jak to robi, sprawdź Spark By {Przykłady}. W tym miejscu znajduje się wiele przykładowego kodu dla wielu podstawowych zadań, które składają się na bloki konstrukcyjne programowania Spark, dzięki czemu można zobaczyć składniki, które składają się na większe zadania, do których jest przeznaczony Apache Spark.

Potrzebujesz głębiej? DZone ma to, co skromnie określa jako The Complete Apache Spark Collection, która składa się z mnóstwa pomocnych samouczków na wiele tematów związanych z Apache Spark. Miłej nauki!