Apache Funke - Apache Spark

Apache Spark
Funken-Logo
Originalautor(en) Matei Zaharia
Entwickler Apache Spark
Erstveröffentlichung 26. Mai 2014 ; vor 7 Jahren ( 2014-05-26 )
Stabile Version
3.1.1 / 2. März 2021 ; vor 7 Monaten ( 2021-03-02 )
Repository Spark-Repository
Geschrieben in Scala
Betriebssystem Microsoft Windows , macOS , Linux
Verfügbar in Scala , Java , SQL , Python , R , C# , F#
Typ Datenanalyse, maschinelle Lernalgorithmen
Lizenz Apache-Lizenz 2.0
Webseite Funke .apache .org Bearbeite dies bei Wikidata

Apache Spark ist eine Open-Source- Unified-Analytics-Engine für die umfangreiche Datenverarbeitung. Spark bietet eine Schnittstelle zur Programmierung ganzer Cluster mit impliziter Datenparallelität und Fehlertoleranz . Ursprünglich an der entwickelte University of California, Berkeley ‚s AMPLab , die Spark - Code - Basis wurde später in der gespendet Apache Software Foundation , die es seit beibehalten hat.

Überblick

Apache Spark hat seine architektonische Grundlage im Resilient Distributed Dataset (RDD), einem schreibgeschützten Multiset von Datenelementen, die über einen Cluster von Computern verteilt sind und fehlertolerant verwaltet werden. Die Dataframe-API wurde als Abstraktion auf der RDD veröffentlicht, gefolgt von der Dataset-API. In Spark 1.x war RDD die primäre Anwendungsprogrammierschnittstelle (API), aber ab Spark 2.x wird die Verwendung der Dataset-API empfohlen, auch wenn die RDD-API nicht veraltet ist . Die RDD-Technologie liegt weiterhin der Dataset-API zugrunde.

Spark und seine RDDs wurden 2012 als Reaktion auf Einschränkungen im MapReduce- Cluster-Computing- Paradigma entwickelt , das verteilten Programmen eine bestimmte lineare Datenflussstruktur aufzwingt : MapReduce-Programme lesen Eingabedaten von der Festplatte, ordnen eine Funktion den Daten zu, reduzieren die Ergebnisse der zuordnen und die Reduktionsergebnisse auf der Festplatte speichern. Die RDDs von Spark fungieren als Arbeitsset für verteilte Programme, das eine (absichtlich) eingeschränkte Form von verteiltem Shared Memory bietet .

In Apache Spark wird der Workflow als gerichteter azyklischer Graph (DAG) verwaltet. Knoten repräsentieren RDDs, während Kanten die Operationen auf den RDDs repräsentieren.

Spark ermöglicht die Implementierung sowohl iterativer Algorithmen , die ihren Datensatz mehrmals in einer Schleife besuchen, als auch interaktive/explorative Datenanalysen, dh das wiederholte Abfragen von Daten im Datenbankstil . Die Latenz solcher Anwendungen kann im Vergleich zur Apache Hadoop MapReduce-Implementierung um mehrere Größenordnungen reduziert werden . Zur Klasse der iterativen Algorithmen zählen die Trainingsalgorithmen für Machine-Learning- Systeme, die die Initialzündung für die Entwicklung von Apache Spark bildeten.

Apache Spark erfordert einen Cluster-Manager und ein verteiltes Speichersystem . Für die Clusterverwaltung unterstützt Spark Standalone (nativer Spark-Cluster, bei dem Sie einen Cluster entweder manuell starten oder die vom Installationspaket bereitgestellten Startskripts verwenden können . Es ist auch möglich, diese Daemons zu Testzwecken auf einem einzelnen Computer auszuführen ), Hadoop YARN , Apache Mesos oder Kubernetes . Für verteilten Speicher kann Spark mit einer Vielzahl von Schnittstellen verbunden werden, darunter Alluxio , Hadoop Distributed File System (HDFS) , MapR File System (MapR-FS) , Cassandra , OpenStack Swift , Amazon S3 , Kudu , Lustre Dateisystem oder eine benutzerdefinierte Lösung kann implementiert werden. Spark unterstützt auch einen pseudo-verteilten lokalen Modus, der normalerweise nur für Entwicklungs- oder Testzwecke verwendet wird, wo kein verteilter Speicher erforderlich ist und stattdessen das lokale Dateisystem verwendet werden kann. In einem solchen Szenario wird Spark auf einem einzelnen Computer mit einem Executor pro CPU-Kern ausgeführt .

Funkenkern

Spark Core ist die Grundlage des Gesamtprojekts. Es bietet verteilte Aufgabenverteilung, Planung und grundlegende I/O- Funktionen, die über eine Anwendungsprogrammierschnittstelle (für Java , Python , Scala , .NET und R ) bereitgestellt werden, die auf der RDD- Abstraktion zentriert ist (die Java-API ist für andere JVM-Sprachen verfügbar, ist aber auch für einige andere Nicht-JVM-Sprachen verwendbar, die sich mit der JVM verbinden können, z. B. Julia ). Diese Schnittstelle spiegelt ein funktionales / höheres Programmiermodell wider : Ein "Treiber"-Programm ruft parallele Operationen wie Map, Filter oder Reduce auf einem RDD auf, indem es eine Funktion an Spark übergibt, die dann die Ausführung der Funktion parallel auf dem Cluster plant. Diese Operationen und zusätzliche Operationen wie Joins nehmen RDDs als Eingabe und erzeugen neue RDDs. RDDs sind unveränderlich und ihre Operationen sind träge ; Fehlertoleranz wird erreicht, indem die "Herkunft" jedes RDD (die Folge von Operationen, die es erzeugt haben) verfolgt wird, damit es im Falle eines Datenverlusts rekonstruiert werden kann. RDDs können beliebige Arten von Python-, .NET-, Java- oder Scala-Objekten enthalten.

Neben dem RDD-orientierten funktionalen Programmierstil bietet Spark zwei eingeschränkte Formen von Shared Variables: Broadcast-Variablen verweisen auf schreibgeschützte Daten, die auf allen Knoten verfügbar sein müssen, während Akkumulatoren verwendet werden können, um Reduktionen in einem imperativen Stil zu programmieren .

Ein typisches Beispiel für RDD-zentrierte funktionale Programmierung ist das folgende Scala-Programm, das die Häufigkeiten aller Wörter berechnet, die in einem Satz von Textdateien vorkommen, und die gebräuchlichsten ausgibt. Jede map , flatMap (eine Variante von map ) und ReduceByKey nimmt eine anonyme Funktion an , die eine einfache Operation an einem einzelnen Datenelement (oder einem Paar von Elementen) ausführt und ihr Argument anwendet, um ein RDD in ein neues RDD umzuwandeln.

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 ist eine Komponente auf Spark Core, die eine Datenabstraktion namens DataFrames eingeführt hat, die strukturierte und halbstrukturierte Daten unterstützt . Spark SQL bietet eine domänenspezifische Sprache (DSL) zum Bearbeiten von DataFrames in Scala , Java , Python oder .NET . Es bietet auch SQL-Sprachunterstützung mit Befehlszeilenschnittstellen und ODBC / JDBC- Server. Obwohl DataFrames die von RDDs gebotene Typprüfung zur Kompilierzeit fehlt, wird das stark typisierte DataSet ab Spark 2.0 auch von Spark SQL vollständig unterstützt.

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 verwendet die schnelle Planungsfunktion von Spark Core, um Streaming-Analysen durchzuführen . Es nimmt Daten in Mini-Batches auf und führt RDD-Transformationen an diesen Mini-Batches durch. Dieses Design ermöglicht die Verwendung des gleichen Satzes von Anwendungscode, der für Batch-Analysen geschrieben wurde, in der Streaming-Analyse und erleichtert so die einfache Implementierung der Lambda-Architektur . Dieser Komfort geht jedoch mit der Latenzzeit einher, die der Mini-Batch-Dauer entspricht. Andere Streaming-Daten-Engines, die Ereignis für Ereignis statt in Mini-Batches verarbeiten, sind Storm und die Streaming-Komponente von Flink . Spark Streaming bietet integrierte Unterstützung für den Konsum von Kafka- , Flume- , Twitter- , ZeroMQ- , Kinesis- und TCP/IP-Sockets .

In Spark 2.x wird auch eine separate, auf Datasets basierende Technologie namens Structured Streaming mit einer übergeordneten Schnittstelle zur Unterstützung des Streamings bereitgestellt.

Spark kann sowohl in einem traditionellen lokalen Rechenzentrum als auch in der Cloud bereitgestellt werden .

MLlib-Bibliothek für maschinelles Lernen

Spark MLlib ist ein verteiltes Machine-Learning-Framework auf Spark Core, das größtenteils aufgrund der verteilten speicherbasierten Spark-Architektur bis zu neunmal so schnell ist wie die festplattenbasierte Implementierung von Apache Mahout (laut Benchmarks, die von den MLlib-Entwicklern gegen die alternierenden kleinsten Quadrate (ALS) -Implementierungen durchgeführt wurden und bevor Mahout selbst eine Spark-Schnittstelle erhielt) und skaliert besser als Vowpal Wabbit . Viele gängige Algorithmen für maschinelles Lernen und statistische Algorithmen wurden implementiert und werden mit MLlib ausgeliefert, was große Pipelines für maschinelles Lernen vereinfacht , darunter:

GraphX

GraphX ​​ist ein verteiltes Graphverarbeitungs- Framework auf Apache Spark. Da es auf RDDs basiert, die unveränderlich sind, sind Graphen unveränderlich und GraphX ​​ist daher ungeeignet für Graphen, die aktualisiert werden müssen, geschweige denn auf transaktionale Weise wie eine Graphdatenbank . GraphX ​​bietet zwei separate APIs für die Implementierung massiv paralleler Algorithmen (wie PageRank ): eine Pregel- Abstraktion und eine allgemeinere API im MapReduce-Stil. Im Gegensatz zu seinem Vorgänger Bagel, der in Spark 1.6 offiziell veraltet war, bietet GraphX ​​volle Unterstützung für Eigenschaftsgraphen (Graphen, bei denen Eigenschaften an Kanten und Scheitelpunkte angehängt werden können).

GraphX ​​kann als die Spark-In-Memory-Version von Apache Giraph angesehen werden , die Hadoop-Festplatten-basiertes MapReduce verwendet.

Wie Apache Spark begann GraphX ​​zunächst als Forschungsprojekt bei AMPLab und Databricks der UC Berkeley und wurde später an die Apache Software Foundation und das Spark-Projekt gespendet.

Sprachunterstützung

Apache Spark bietet integrierte Unterstützung für Scala, Java, R und Python mit Unterstützung von Drittanbietern für .NET CLR, Julia und mehr.

Geschichte

Spark wurde ursprünglich 2009 von Matei Zaharia im AMPLab der UC Berkeley gegründet und 2010 unter einer BSD-Lizenz als Open Source veröffentlicht .

2013 wurde das Projekt an die Apache Software Foundation gespendet und seine Lizenz auf Apache 2.0 umgestellt . Im Februar 2014 wurde Spark zu einem Top-Level-Apache-Projekt .

Im November 2014 stellte das Unternehmen Databricks des Spark-Gründers M. Zaharia mit Spark einen neuen Weltrekord in der Großsortierung auf.

Spark hatte 2015 über 1000 Mitwirkende und ist damit eines der aktivsten Projekte der Apache Software Foundation und eines der aktivsten Open-Source- Big-Data- Projekte.

Ausführung Ursprüngliches Erscheinungsdatum Letzte Version Veröffentlichungsdatum
Alte Version, nicht mehr gepflegt: 0,5 2012-06-12 0.5.1 2012-10-07
Alte Version, nicht mehr gepflegt: 0,6 2012-10-14 0.6.2 2013-02-07
Alte Version, nicht mehr gepflegt: 0,7 2013-02-27 0.7.3 2013-07-16
Alte Version, nicht mehr gepflegt: 0.8 2013-09-25 0.8.1 2013-12-19
Alte Version, nicht mehr gepflegt: 0,9 2014-02-02 0.9.2 2014-07-23
Alte Version, nicht mehr gepflegt: 1.0 2014-05-26 1.0.2 2014-08-05
Alte Version, nicht mehr gepflegt: 1.1 2014-09-11 1.1.1 2014-11-26
Alte Version, nicht mehr gepflegt: 1,2 2014-12-18 1.2.2 2015-04-17
Alte Version, nicht mehr gepflegt: 1.3 2015-03-13 1.3.1 2015-04-17
Alte Version, nicht mehr gepflegt: 1,4 2015-06-11 1.4.1 2015-07-15
Alte Version, nicht mehr gepflegt: 1,5 2015-09-09 1.5.2 2015-11-09
Alte Version, nicht mehr gepflegt: 1,6 2016-01-04 1.6.3 2016-11-07
Alte Version, nicht mehr gepflegt: 2.0 2016-07-26 2.0.2 2016-11-14
Alte Version, nicht mehr gepflegt: 2.1 2016-12-28 2.1.3 2018-06-26
Alte Version, nicht mehr gepflegt: 2.2 2017-07-11 2.2.3 2019-01-11
Alte Version, nicht mehr gepflegt: 2.3 2018-02-28 2.3.4 2019-09-09
Ältere Version, aber noch gepflegt: 2.4 LTS 2018-11-02 2.4.8 2021-05-17
Aktuelle stabile Version: 3.0 2020-06-18 3.0.3 2021-06-01
Aktuelle stabile Version: 3.1 2021-03-02 3.1.2 2021-06-01
Legende:
Alte Version
Ältere Version, noch gepflegt
Letzte Version
Neueste Vorschauversion
Zukünftige Veröffentlichung

Entwickler

Apache Spark wird von einer Community entwickelt. Das Projekt wird von einer Gruppe namens "Project Management Committee" (PMC) geleitet. Das aktuelle PMC ist 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, Prashant Sharma, Patrick 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.

Siehe auch

Anmerkungen

Verweise

Externe Links