Einführung in Spark

Abgeschlossen

Um ein besseres Verständnis dafür zu erhalten, wie Daten mit Apache Spark in Azure Databricks verarbeitet und analysiert werden, ist es wichtig, die zugrunde liegende Architektur zu verstehen.

Übersicht

Der Azure Databricks-Dienst wird von einer hohen Ebene aus gestartet und verwaltet Apache Spark-Cluster in Ihrem Azure-Abonnement. Apache Spark-Pools sind Clustergruppen von Computern, die als ein Computer behandelt werden und Befehle von Notebooks ausführen. Cluster aktivieren die Verarbeitung von Daten, die computerübergreifend parallelisiert werden, um die Skalierbarkeit und Leistung zu verbessern. Dabei handelt es sich um einen Spark-Treiber und Worker-Knoten. Der Treiberknoten sendet Aufgaben an die Workerknoten und weist sie an, Daten aus einer angegebenen Datenquelle abzurufen.

Typischerweise ist die Notebookschnittstelle in Databricks das Treiberprogramm. Das Treiberprogramm enthält die Hauptschleife für das Programm und erstellt verteilte Datasets auf dem Cluster und wendet dann Vorgänge auf diese Datasets an. Treiberprogramme greifen über ein SparkSession-Objekt auf Apache Spark zu, unabhängig vom Bereitstellungsort.

Diagramm eines Apache Spark-Beispielclusters, der aus einem Treiberknoten und vier Workerknoten besteht

Microsoft Azure verwaltet den Cluster und skaliert ihn basierend auf Ihrer Nutzung und der beim Konfigurieren des Clusters verwendeten Einstellung automatisch nach Bedarf. Die automatische Beendigung kann auch aktiviert werden, sodass Azure den Cluster nach einer festgelegten Anzahl inaktiver Minuten beenden kann.

Spark-Jobs im Detail

Die an den Cluster gesendete Arbeit wird nach Bedarf in einzelne unabhängige Aufträge aufgeteilt. Auf diese Weise wird die Arbeit auf die Knoten des Clusters verteilt. Aufträge werden weiter in Aufgaben unterteilt. Die Eingabe für einen Auftrag wird in eine oder mehrere Partitionen partitioniert. Diese Partitionen stellen die Arbeitseinheit für jeden Slot dar. Zwischen Aufgaben müssen Partitionen möglicherweise neu organisiert und über das Netzwerk freigegeben werden.

Das Geheimnis für die hohe Leistung von Spark ist Parallelität. Die vertikale Skalierung (durch Hinzufügen von Ressourcen zu einem einzelnen Computer) ist auf eine begrenzte Menge von RAM, Threads und CPU-Geschwindigkeiten beschränkt; aber Cluster skalieren horizontal, und fügen dem Cluster nach Bedarf neue Knoten hinzu.

Spark parallelisiert Aufträge auf zwei Ebenen:

  • Die erste Ebene der Parallelisierung ist der Executor - eine Java-VM (JVM), die auf einem Workerknoten ausgeführt wird, in der Regel eine Instanz pro Knoten.
  • Die zweite Ebene der Parallelisierung ist der Slot, deren Anzahl von der Anzahl an Kernen und CPUs jedes Knotens bestimmt wird.
  • Jeder Executor verfügt über mehrere Slots, denen parallelisierte Aufgaben zugewiesen werden können.

Diagramm des Spark-Clusters mit Aufgaben.

Die JVM ist natürlich multithreaded, aber eine einzelne JVM, z. B. diejenige, welche die Arbeit am Treiber koordiniert, hat eine endliche Obergrenze. Durch die Aufteilung der Arbeit in Vorgänge kann der Treiber Arbeitseinheiten für die gleichzeitige Ausführung *Slots in den Executoren auf Workerknoten zuweisen. Zusätzlich entscheidet der Treiber, wie die Daten partitioniert werden sollen, damit diese für die Parallelverarbeitung verteilt werden können. Daher weist der Treiber jeder Aufgabe eine Partition der Daten zu, sodass jeder Vorgang weiß, welchen Teil der Daten er verarbeiten soll. Sobald das begonnen hat, ruft jede Aufgabe die Partition der ihr zugewiesen Daten ab.

Jobs und Stufen

Je nach auszuführender Arbeit sind möglicherweise mehrere Parallelaufträge erforderlich. Jeder Auftrag ist in Stufen unterteilt. Eine nützliche Analogie ist es, sich vorzustellen, dass der Auftrag ist, ein Haus zu bauen:

  • Die erste Stufe besteht darin, das Fundament zu schaffen.
  • Die zweite Stufe besteht darin, die Wände zu errichten.
  • Die dritte Stufe würde darin besteht, das Dach hinzuzufügen.

Der Versuch, einen dieser Schritte außerhalb der Reihenfolge zu machen, ist einfach nicht sinnvoll und kann in der Tat unmöglich sein. Ebenso bricht Spark jeden Auftrag in Phasen um, um sicherzustellen, dass alles in der richtigen Reihenfolge ausgeführt wird.

Modularität

Spark enthält Bibliotheken für Tasks, die von SQL bis hin zu Streaming und Machine Learning reichen und es zu einem Tool für Datenverarbeitungstasks machen. Beispiele für Spark-Bibliotheken:

  • Spark SQL: für die Arbeit mit strukturierten Daten
  • SparkML: für Machine Learning
  • GraphX: für die Verarbeitung von Graphen
  • Spark Streaming: für die Verarbeitung von Echtzeitdaten

Diagramm der Spark-Bibliotheken

Kompatibilität

Spark kann auf einer Vielzahl von verteilten Systemen ausgeführt werden, darunter Hadoop YARN, Apache Mesos, Kubernetes oder der Spark-eigene Cluster-Manager. Spark kann außerdem Lese- und Schreibvorgänge für verschiedene Datenquellen wie HDFS, Cassandra, HBase und Amazon S3 ausführen.