Apache Spark - Apache Spark

Apache Spark
Logo Spark
Pierwotny autor (autorzy) Matei Zaharia
Deweloper(zy) Apache Spark
Pierwsze wydanie 26 maja 2014 r .; 7 lat temu ( 2014-05-26 )
Wersja stabilna
3.1.1 / 2 marca 2021 ; 7 miesięcy temu ( 02.03.2021 )
Magazyn Repozytorium Spark
Napisane w Scala
System operacyjny Microsoft Windows , macOS , Linux
Dostępne w Scala , Java , SQL , Python , R , C# , F#
Rodzaj Analiza danych, algorytmy uczenia maszynowego
Licencja Licencja Apache 2.0
Strona internetowa iskra .apache .org Edytuj to na Wikidata

Apache Spark to ujednolicony aparat analityczny typu open source do przetwarzania danych na dużą skalę. Spark zapewnia interfejs do programowania całych klastrów z niejawną równoległością danych i odpornością na błędy . Pierwotnie opracowany na Uniwersytecie Kalifornijskim w Berkeley 's AMPLab , baza kodu Spark została później przekazana fundacji Apache Software Foundation , która utrzymuje ją od tego czasu.

Przegląd

Apache Spark ma swoje architektoniczne podstawy w elastycznym rozproszonym zestawie danych (RDD), wielozestawie elementów danych tylko do odczytu rozproszonych w klastrze maszyn, który jest utrzymywany w sposób odporny na uszkodzenia . Dataframe API zostało wydane jako abstrakcja na szczycie RDD, a następnie Dataset API. W Spark 1.x, RDD był podstawowym interfejsem programowania aplikacji (API), ale od Spark 2.x zachęca się do korzystania z interfejsu API zestawu danych, nawet jeśli interfejs API RDD nie jest przestarzały . Technologia RDD nadal stanowi podstawę interfejsu Dataset API.

Spark i jego RDD zostały opracowane w 2012 roku w odpowiedzi na ograniczenia paradygmatu przetwarzania klastrowego MapReduce , który wymusza szczególną liniową strukturę przepływu danych w programach rozproszonych: programy MapReduce odczytują dane wejściowe z dysku, mapują funkcję w danych, redukują wyniki mapować i przechowywać wyniki redukcji na dysku. RDD Spark działają jako zestaw roboczy dla programów rozproszonych, który oferuje (celowo) ograniczoną formę rozproszonej pamięci współdzielonej .

W Apache Spark przepływ pracy jest zarządzany jako ukierunkowany wykres acykliczny (DAG). Węzły reprezentują RDD, podczas gdy krawędzie reprezentują operacje na RDD.

Spark ułatwia implementację zarówno algorytmów iteracyjnych , które wielokrotnie odwiedzają swój zbiór danych w pętli, jak i interaktywnej/eksploracyjnej analizy danych, tj. wielokrotnych zapytań o dane w stylu bazy danych. Latency takich zastosowaniach może być zmniejszona o kilka rzędów wielkości w porównaniu do Apache Hadoop realizacji MapReduce. Do klasy algorytmów iteracyjnych należą algorytmy uczące systemów uczenia maszynowego , które stały się początkowym impulsem do rozwoju Apache Spark.

Apache Spark wymaga menedżera klastrów i rozproszonego systemu pamięci masowej . Do zarządzania klastrem Spark obsługuje tryb autonomiczny (natywny klaster Spark, w którym można uruchomić klaster ręcznie lub użyć skryptów uruchamiających dostarczonych przez pakiet instalacyjny. Możliwe jest również uruchamianie tych demonów na jednej maszynie w celu testowania), Hadoop YARN , Apache Mesos lub Kubernetes . W przypadku rozproszonej pamięci masowej Spark może łączyć się z szeroką gamą, w tym z Alluxio , Hadoop Distributed File System (HDFS) , MapR File System (MapR-FS) , Cassandra , OpenStack Swift , Amazon S3 , Kudu , system plików Luster lub rozwiązaniem niestandardowym można wdrożyć. Spark obsługuje również pseudodystrybuowany tryb lokalny, zwykle używany tylko do celów programistycznych lub testowych, w którym rozproszona pamięć masowa nie jest wymagana, a zamiast tego można użyć lokalnego systemu plików; w takim scenariuszu Spark jest uruchamiany na jednym komputerze z jednym executorem na rdzeń procesora .

Rdzeń iskry

Spark Core jest podstawą całego projektu. Zapewnia rozproszone wysyłanie zadań, planowanie i podstawowe funkcje I/O , udostępniane przez interfejs programowania aplikacji (dla Java , Python , Scala , .NET i R ) skoncentrowany na abstrakcji RDD (Java API jest dostępne dla innych języków JVM, ale jest również użyteczny dla niektórych innych języków innych niż JVM, które mogą łączyć się z JVM, takich jak Julia ). Ten interfejs odzwierciedla funkcjonalny / wyższy model programowania: program „sterownika” wywołuje operacje równoległe, takie jak mapowanie, filtrowanie lub zmniejszanie na RDD, przekazując funkcję do platformy Spark, która następnie planuje równoległe wykonanie funkcji w klastrze. Te operacje oraz dodatkowe, takie jak złączenia , pobierają RDD jako dane wejściowe i wytwarzają nowe RDD. RDD są niezmienne, a ich operacje są leniwe ; odporność na awarie jest osiągana poprzez śledzenie „pochodzenia” każdego RDD (sekwencji operacji, które go wytworzyły), tak aby można je było zrekonstruować w przypadku utraty danych. RDD mogą zawierać dowolny typ obiektów Python, .NET, Java lub Scala.

Oprócz funkcjonalnego stylu programowania zorientowanego na RDD, Spark zapewnia dwie ograniczone formy współdzielonych zmiennych: zmienne rozgłoszeniowe odwołują się do danych tylko do odczytu, które muszą być dostępne we wszystkich węzłach, podczas gdy akumulatory mogą być używane do programowania redukcji w imperatywnym stylu.

Typowym przykładem programowania funkcyjnego zorientowanego na RDD jest następujący program Scala, który oblicza częstotliwości wszystkich słów występujących w zbiorze plików tekstowych i drukuje te najczęstsze. Każda map , flatMap (odmiana map ) i ReduceByKey pobiera anonimową funkcję, która wykonuje prostą operację na pojedynczym elemencie danych (lub parze elementów) i stosuje swój argument do przekształcenia RDD w nowy RDD.

val conf = new SparkConf().setAppName("wiki_test") // create a spark config object
val sc = new SparkContext(conf) // Create a spark context
val data = sc.textFile("/path/to/somedir") // Read files from "somedir" into an RDD of (filename, content) pairs.
val tokens = data.flatMap(_.split(" ")) // Split each file into a list of tokens (words).
val wordFreq = tokens.map((_, 1)).reduceByKey(_ + _) // Add a count of one to each token, then sum the counts per word type.
wordFreq.sortBy(s => -s._2).map(x => (x._2, x._1)).top(10) // Get the top 10 words. Swap word and count to sort by count.

Spark SQL

Spark SQL to składnik na szczycie Spark Core, który wprowadził abstrakcję danych o nazwie DataFrames, która zapewnia obsługę danych strukturalnych i półstrukturalnych . Spark SQL zapewnia język specyficzny dla domeny (DSL) do manipulowania DataFrames w Scala , Java , Python lub .NET . Zapewnia również obsługę języka SQL, z interfejsami wiersza poleceń i serwerem ODBC / JDBC . Chociaż DataFrames nie ma sprawdzania typu w czasie kompilacji zapewnianego przez RDD, począwszy od Spark 2,0, DataSet o silnym typie jest w pełni obsługiwany przez Spark SQL.

import org.apache.spark.sql.SparkSession

val url = "jdbc:mysql://yourIP:yourPort/test?user=yourUsername;password=yourPassword" // URL for your database server.
val spark = SparkSession.builder().getOrCreate() // Create a Spark session object

val df = spark
  .read
  .format("jdbc")
  .option("url", url)
  .option("dbtable", "people")
  .load()

df.printSchema() // Looks the schema of this DataFrame.
val countsByAge = df.groupBy("age").count() // Counts people by age

//or alternatively via SQL:
//df.createOrReplaceTempView("people")
//val countsByAge = spark.sql("SELECT age, count(*) FROM people GROUP BY age")

Spark Streaming

Spark Streaming wykorzystuje funkcję szybkiego planowania Spark Core do wykonywania analiz strumieniowych . Pozyskuje dane w minipartii i wykonuje przekształcenia RDD na tych minipartie danych. Ten projekt umożliwia wykorzystanie tego samego zestawu kodu aplikacji napisanego dla analizy wsadowej w analizie strumieniowej, ułatwiając w ten sposób łatwą implementację architektury lambda . Jednak ta wygoda wiąże się z karą opóźnienia równą czasowi trwania mini-partii. Inne aparaty przesyłania strumieniowego danych, które przetwarzają zdarzenie według zdarzenia, a nie w miniwsadach, obejmują Storm i składnik przesyłania strumieniowego Flink . Spark żywo obsługuje wbudowany spożywać z Kafki , Flume , Twitter , ZeroMQ , Kinesis i TCP / IP gniazd .

W Spark 2.x do obsługi przesyłania strumieniowego dostępna jest również oddzielna technologia oparta na zestawach danych, o nazwie Strumieniowanie strukturalne, która ma interfejs wyższego poziomu.

Spark można wdrożyć zarówno w tradycyjnym lokalnym centrum danych, jak i w chmurze .

Biblioteka uczenia maszynowego MLlib

Spark MLlib to rozproszona platforma uczenia maszynowego oparta na Spark Core, która, w dużej mierze dzięki architekturze Spark opartej na pamięci rozproszonej, jest aż dziewięć razy szybsza niż implementacja oparta na dyskach używana przez Apache Mahout (zgodnie z testy porównawcze wykonane przez programistów MLlib względem implementacji naprzemiennych najmniejszych kwadratów (ALS) i zanim sam Mahout zyskał interfejs Spark) i skaluje się lepiej niż Vowpal Wabbit . Zaimplementowano wiele popularnych algorytmów uczenia maszynowego i statystycznych, które są dostarczane z biblioteką MLlib, która upraszcza potoki uczenia maszynowego na dużą skalę , w tym:

WykresX

GraphX ​​to rozproszona struktura przetwarzania wykresów oparta na Apache Spark. Ponieważ opiera się na RDD, które są niezmienne, wykresy są niezmienne, a zatem GraphX ​​nie nadaje się do wykresów, które wymagają aktualizacji, nie mówiąc już o sposobie transakcyjnym, takim jak baza danych wykresów . GraphX ​​udostępnia dwa oddzielne API do implementacji masowo równoległych algorytmów (takich jak PageRank ): abstrakcji Pregel i bardziej ogólnego API w stylu MapReduce. W przeciwieństwie do swojego poprzednika Bagel, który został formalnie przestarzały w Spark 1.6, GraphX ​​ma pełną obsługę wykresów właściwości (wykresów, w których właściwości można dołączać do krawędzi i wierzchołków).

GraphX ​​może być postrzegany jako działająca w pamięci wersja platformy Spark Apache Giraph , która wykorzystywała MapReduce opartą na dyskach Hadoop.

Podobnie jak Apache Spark, GraphX ​​początkowo był projektem badawczym w AMPLab i Databricks na Uniwersytecie Kalifornijskim w Berkeley, a później został przekazany na rzecz Apache Software Foundation i projektu Spark.

Wsparcie językowe

Apache Spark ma wbudowaną obsługę Scala, Java, R i Python z obsługą innych firm dla .NET CLR, Julia i innych.

Historia

Spark został początkowo uruchomiony przez Matei Zaharię w AMPLab na Uniwersytecie Kalifornijskim w Berkeley w 2009 roku, a open source w 2010 roku na licencji BSD .

W 2013 roku projekt został przekazany Fundacji Apache Software Foundation i zmienił licencję na Apache 2.0 . W lutym 2014 r. Spark stał się projektem Apache najwyższego poziomu .

W listopadzie 2014 roku firma Databricks , założyciela Sparka, M. Zaharii, ustanowiła nowy rekord świata w sortowaniu na dużą skalę przy użyciu Sparka.

Spark miał ponad 1000 współautorów w 2015 roku, co czyni go jednym z najaktywniejszych projektów w Apache Software Foundation i jednym z najaktywniejszych projektów open source big data .

Wersja Pierwotna data wydania Ostatnia wersja Data wydania
Stara wersja, nie jest już utrzymywana: 0,5 2012-06-12 0.5.1 2012-10-07
Stara wersja, nie jest już utrzymywana: 0,6 2012-10-14 0.6.2 2013-02-07
Stara wersja, nie jest już utrzymywana: 0,7 2013-02-27 0,7,3 2013-07-16
Stara wersja, nie jest już utrzymywana: 0,8 2013-09-25 0.8.1 2013-12-19
Stara wersja, nie jest już utrzymywana: 0,9 2014-02-02 0.9.2 2014-07-23
Stara wersja, nie jest już utrzymywana: 1,0 2014-05-26 1.0.2 2014-08-05
Stara wersja, nie jest już utrzymywana: 1,1 2014-09-11 1.1.1 2014-11-26
Stara wersja, nie jest już utrzymywana: 1.2 2014-12-18 1.2.2 2015-04-17
Stara wersja, nie jest już utrzymywana: 1,3 2015-03-13 1.3.1 2015-04-17
Stara wersja, nie jest już utrzymywana: 1,4 2015-06-11 1.4.1 2015-07-15
Stara wersja, nie jest już utrzymywana: 1,5 2015-09-09 1.5.2 2015-11-09
Stara wersja, nie jest już utrzymywana: 1,6 2016-01-04 1.6.3 2016-11-07
Stara wersja, nie jest już utrzymywana: 2,0 2016-07-26 2.0.2 2016-11-14
Stara wersja, nie jest już utrzymywana: 2,1 2016-12-28 2.1.3 2018-06-26
Stara wersja, nie jest już utrzymywana: 2.2 2017-07-11 2.2.3 2019-01-11
Stara wersja, nie jest już utrzymywana: 2,3 2018-02-28 2.3.4 2019-09-09
Starsza wersja, ale nadal utrzymywana: 2,4 LTS 2018-11-02 2.4.8 2021-05-17
Aktualna stabilna wersja: 3,0 2020-06-18 3.0.3 2021-06-01
Aktualna stabilna wersja: 3.1 2021-03-02 3.1.2 2021-06-01
Legenda:
Stara wersja
Starsza wersja, nadal utrzymywana
Ostatnia wersja
Najnowsza wersja zapoznawcza
Przyszłe wydanie

Deweloperzy

Apache Spark jest rozwijany przez społeczność. Projektem zarządza grupa zwana „Komitetem Zarządzania Projektem” (PMC). Obecnym PMC są Aaron Davidson, Andy Konwinski, Andrew Or, Ankur Dave, Robert Joseph Evans, DB Tsai, Dongjoon Hyun, Felix Cheung, Hyukjin Kwon, Haoyuan Li, Ram Sriharsha, Holden Karau , Herman van Hövell, Imran Rashid, Jason Dai , Joseph Kurata Bradley, Joseph E. Gonzalez, Josh Rosen, Jerry Shao, Kay Ousterhout, Cheng Lian, Xiao Li, Mark Hamstra, Michael Armbrust, Matei Zaharia , Xiangrui Meng, Nicholas Pentreath, Mosharaf Chowdhury, Mridul Muralidharan, Patrick Prashant Sharma Wendell, Reynold Xin , Ryan LeCompte, Shane Huang, Shivaram Venkataraman, Sean McNamara, Sean R. Owen, Stephen Haberman, Tathagata Das, Thomas Graves, Thomas Dudziak, Takuya Ueshin, Marcelo Masiero Vanzin, Wenchen Fan, Charles Reiss, Andrew Xia, Yin Huai, Yanbo Liang, Shixiong Zhu.

Zobacz też

Uwagi

Bibliografia

Zewnętrzne linki