Apache Spark Optimierungstechniken und Leistungsoptimierung

Von Chandan Gaur|Big Data Engineering|05,Okt,2020

Was ist Apache Spark?

Apache beschrieb 2012 die Resilient Distributed Dataset (RDD in Apache Spark) Foundation mit schreibgeschützten verteilten Datasets auf verteilten Clustern und nannte sie Apache Spark. Später führen sie die Dataset-API und dann die Dataframe-APIs für das Batch- und strukturierte Streaming von Daten ein. Dieser Artikel listet die besten Apache Spark-Optimierungstechniken auf.

Apache Spark ist eine schnelle Cluster-Computing-Plattform, die für mehr Berechnungen und Stream-Verarbeitung entwickelt wurde. Spark kann im Vergleich zu herkömmlichen Systemen, für deren Ausführung und Unterstützung mehrere Systeme erforderlich sind, eine Vielzahl von Workloads verarbeiten. Datenanalyse-Pipelines werden durch die für die Produktion notwendige Kombination verschiedener Verarbeitungsarten erleichtert. Apache Spark wurde für den Betrieb mit einem externen Cluster-Manager wie YARN oder dessen eigenständigem Manager erstellt.

Funktionen von Apache Spark

Einige Funktionen von Apache Spark umfassen:-

  • Einheitliche Plattform zum Schreiben von Big Data-Anwendungen.
  • Einfache Entwicklung.
  • Entworfen, um in hohem Grade zugänglich zu sein.
  • Funken kann unabhängig laufen. So gibt es Flexibilität.
  • Kosteneffizient.

XenonStack bietet Analysedienste und -lösungen für die Echtzeit- und Stream-Datenaufnahme, Verarbeitung und Analyse der Datenströme schnell und effizient für das Internet der Dinge, Überwachung, vorbeugende und vorausschauende Wartung.

Aus dem Artikel Streaming- und Echtzeitanalysedienste

Verstehen Sie, wie die Apache Spark-Optimierung funktioniert?

Um zu verstehen, wie die Apache Spark-Optimierung funktioniert, müssen Sie zuerst die Architektur verstehen.

Die Architektur von Apache Spark

Die Laufzeitarchitektur von Spark besteht aus drei Teilen –

Spark–Treiber (Masterprozess)

Der Spark-Treiber konvertiert die Programme in Aufgaben und plant die Aufgaben für Executoren. Der Taskplaner ist der Teil des Treibers und hilft, Aufgaben an Ausführende zu verteilen.

Spark Cluster Manager

Ein Cluster-Manager ist der Kern in Spark, mit dem Executoren gestartet werden können, und manchmal können auch Treiber gestartet werden. Spark Scheduler plant die Aktionen und Jobs in der Spark-Anwendung auf FIFO-Weise im Cluster-Manager selbst. Sie sollten auch über Apache Airflow lesen.

Executoren (Slave-Prozesse)

Executoren sind die einzelnen Entitäten, auf denen einzelne Tasks von Jobs ausgeführt werden. Executoren werden immer bis zum Lebenszyklus einer Spark-Anwendung ausgeführt, sobald sie gestartet werden. Fehlgeschlagene Executoren stoppen die Ausführung des Spark-Jobs nicht.

RDD (Resilient Distributed Datasets)

Eine RDD ist eine verteilte Sammlung unveränderlicher Datasets auf verteilten Knoten des Clusters. Eine RDD wird in eine oder mehrere Partitionen partitioniert. RDD ist der Kern von Spark, da ihre Verteilung auf verschiedene Knoten des Clusters die Datenlokalität nutzt. Um Parallelität innerhalb der Anwendung zu erreichen, sind Partitionen die Einheiten dafür. Repartition- oder Coalesce-Transformationen können helfen, die Anzahl der Partitionen beizubehalten. Der Datenzugriff wird durch RDD-Shuffling optimiert. Da Spark in der Nähe von Daten ist, sendet es Daten über verschiedene Knoten und erstellt bei Bedarf die erforderlichen Partitionen.

DAG (Directed Acyclic Graph)

Spark generiert tendenziell ein Operatordiagramm, wenn wir unseren Code in die Spark-Konsole eingeben. Wenn eine Aktion an Spark RDD ausgelöst wird, sendet Spark dieses Diagramm an den DAGScheduler. Anschließend werden diese Operatordiagramme in Phasen der Aufgabe in DAGScheduler unterteilt. Jeder Schritt kann Jobs enthalten, die auf mehreren Partitionen der eingehenden Daten basieren. Der DAGScheduler führt diese einzelnen Operatorgraphen zusammen. Zum Beispiel, Kartenbediener Graphen Zeitplan für eine einstufige und diese Stufen passieren auf die. Taskplaner im Cluster-Manager für ihre Ausführung. Dies ist die Aufgabe von Work oder Executoren, diese Aufgaben auf dem Slave auszuführen.

Verteilte Verarbeitung mit Partitionen effizient

Die Erhöhung der Anzahl der Executoren in Clustern erhöht auch die Parallelität bei der Verarbeitung von Spark-Jobs. Dafür muss man jedoch über ausreichende Informationen darüber verfügen, wie diese Daten über Partitionierung auf diese Executoren verteilt werden. RDD ist in diesem Fall hilfreich, da der Datenverkehr für das Mischen von Daten über diese Executoren vernachlässigbar ist. Man kann die Partitionierung für Paar-RDD anpassen (RDD mit Schlüssel-Wert-Paaren). Spark stellt sicher, dass der Schlüsselsatz immer zusammen im selben Knoten angezeigt wird, da in diesem Fall keine explizite Steuerung vorhanden ist.

Apache Spark Security unterstützt die Authentifizierung über ein gemeinsames Geheimnis. Spark Authentication ist der Konfigurationsparameter, über den die Authentifizierung konfiguriert werden kann. Es ist der Parameter, der prüft, ob die Protokolle der Spark-Kommunikation eine Authentifizierung mit einem gemeinsamen Geheimnis durchführen oder nicht.

Aus dem Artikel Apache Spark Security

Zu vermeidende Fehler beim Schreiben von Spark-Anwendungen

reduceByKey oder groupByKey

Sowohl groupByKey als auch reduceByKey geben dieselbe Antwort, aber das Konzept zur Erzielung von Ergebnissen ist unterschiedlich. reduceByKey eignet sich am besten für große Datenmengen, da es in Spark die Ausgabe mit einem gemeinsam genutzten Schlüssel für jede Partition kombiniert, bevor die Daten gemischt werden. Auf der anderen Seite mischt groupByKey alle Schlüssel-Wert-Paare. groupByKey verursacht unnötiges Mischen und Übertragen von Daten über das Netzwerk.

Behalten Sie die erforderliche Größe der Shuffle-Blöcke bei

Standardmäßig darf der Shuffle-Block 2 GB nicht überschreiten. Die bessere Verwendung besteht darin, Partitionen zu erhöhen und die Kapazität auf ~ 128 MB pro Partition zu reduzieren, wodurch die Shuffle-Blockgröße verringert wird. Wir können Repartition oder Coalesce in regulären Anwendungen verwenden. Große Partitionen verlangsamen den Prozess aufgrund eines Limits von 2 GB, und wenige Partitionen erlauben es nicht, den Job zu skalieren und die Parallelität zu erreichen.

Dateiformate und Trennzeichen

Die Auswahl der richtigen Dateiformate für jede datenbezogene Spezifikation bereitet Kopfschmerzen. Man muss das Datenformat für Aufnahmetypen, Zwischentyp und endgültigen Ausgabetyp mit Bedacht auswählen. Wir können die Datendateiformate für jeden Typ auch auf verschiedene Arten klassifizieren, z. B. das AVRO-Dateiformat zum Speichern von Mediendaten, da Avro am besten für Binärdaten optimiert ist als Parkett. Parkett kann zum Speichern von Metadateninformationen verwendet werden, da es stark komprimiert ist.

Kleine Datendateien

Broadcasting ist eine Technik, um kleine Datendateien oder Datensätze in Speicherblöcke zu laden, so dass sie mit massiveren Datensätzen mit weniger Aufwand für das Mischen von Daten verbunden werden können. Zum Beispiel können wir kleine Datendateien in n Blöcken speichern, und große Datendateien können in Zukunft mit diesen Datenblöcken verbunden werden, da große Datendateien parallel auf diese Blöcke verteilt werden können.

Keine Überwachung der Jobphasen

DAG ist eine in Spark verwendete Datenstruktur, die verschiedene Phasen von Aufgaben im Diagrammformat beschreibt. Die meisten Entwickler schreiben und führen den Code aus, aber die Überwachung von Jobaufgaben ist unerlässlich. Diese Überwachung wird am besten erreicht, indem die DAG verwaltet und die Stufen reduziert werden. Der Job mit 20 Schritten verlängert sich im Vergleich zu einem Job mit 3-4 Stufen.

ByKey, Repartition oder andere Operationen, die Shuffles auslösen

Meistens müssen wir Shuffles so weit wie möglich vermeiden, da Daten über viele hinweg gemischt werden, und manchmal wird es sehr komplex, Skalierbarkeit aus diesen Shuffles zu erhalten. groupByKey kann ein wertvolles Gut sein, aber seine Notwendigkeit muss zuerst beschrieben werden.

Reinforcement Learning

Reinforcement Learning ist nicht nur das Konzept, eine bessere Umgebung für maschinelles Lernen zu erhalten, sondern auch Entscheidungen besser zu verarbeiten. Man muss Deep Reinforcement Learning in Spark anwenden, wenn das Übergangsmodell und das Belohnungsmodell korrekt auf Datensätzen basieren und auch Agenten in der Lage sind, die Ergebnisse abzuschätzen.

Apache Spark-Optimierungsfaktoren und -techniken

Eine der besten Funktionen der Apache Spark-Optimierung ist die Unterstützung bei In-Memory-Datenberechnungen. Der Engpass für diese Spark-Optimierungsberechnungen kann CPU, Arbeitsspeicher oder eine beliebige Ressource im Cluster sein. In solchen Fällen kann es erforderlich sein, die Daten zu serialisieren und den Speicher zu reduzieren. Diese Faktoren für die Funkenoptimierung können, wenn sie richtig verwendet werden –

  • Beseitigen Sie den lang andauernden Jobprozess
  • Korrekturausführungs-Engine
  • Verbessert die Leistungszeit durch Verwaltung von Ressourcen

13 Einfache Techniken zur Apache Spark-Optimierung

Akkumulatoren sind globale Variablen für die Executoren, die nur durch eine assoziative und kommutative Operation hinzugefügt werden können. Es kann daher parallel effizient sein. Akkumulatoren können verwendet werden, um Zähler (wie in Map Reduce) oder eine andere Aufgabe wie das Verfolgen von API-Aufrufen zu implementieren.

Standardmäßig unterstützt Spark numerische Akkumulatoren, aber Programmierer haben den Vorteil, Unterstützung für neue Typen hinzuzufügen. Spark stellt sicher, dass die Aktualisierung jeder Aufgabe nur einmal auf die Akkumulatorvariablen angewendet wird. Während der Transformationen sollten Benutzer die Aktualisierungen der einzelnen Tasks kennen, da diese mehr als einmal angewendet werden können, wenn Jobphasen erneut ausgeführt werden.

Hive Bucketing Performance

Bucketing-Ergebnisse mit einer festen Anzahl von Dateien, da wir die Anzahl der Buckets mit einem Bucket angeben. Hive nahm das Feld, berechnete den Hash und wies diesem bestimmten Bucket einen Datensatz zu. Bucketing ist stabiler, wenn das Feld eine hohe Kardinalität, eine große Datenverarbeitung und eine gleichmäßige Verteilung der Datensätze auf alle Buckets aufweist, während die Partitionierung funktioniert, wenn die Kardinalität des Partitionierungsfelds niedrig ist.

Bucketing reduziert den Overhead beim Sortieren von Dateien. Wenn wir beispielsweise zwei Tabellen mit der gleichen Anzahl von Buckets verknüpfen, verknüpft Spark die Daten direkt als bereits sortierte Buckets. Die Anzahl der Bucket-Dateien kann als mehrere Partitionen in mehrere Buckets berechnet werden.

Prädikat-Pushdown-Optimierung

Prädikat-Pushdown ist eine Technik, um nur die erforderlichen Daten zu verarbeiten. Prädikate können auf SparkSQL angewendet werden, indem Filter in where-Bedingungen definiert werden. Mit dem Befehl explain zur Abfrage können wir die Abfrageverarbeitungsstufen überprüfen. Wenn der Abfrageplan PushedFilter enthält, wird die Abfrage so optimiert, dass nur die erforderlichen Daten ausgewählt werden, da jedes Prädikat entweder True oder False zurückgibt.

Wenn im Abfrageplan kein PushedFilter gefunden wurde, ist es besser, die where-Bedingung umzuwandeln. Prädikat-Pushdowns begrenzen die Anzahl der Dateien und Partitionen, die SparkSQL während der Abfrage liest, wodurch Festplatten-E / A und In-Memory-Analysen reduziert werden. Abfragen von Daten in Buckets mit Prädikat-Pushdowns führen schneller zu Ergebnissen mit weniger Shuffle.

Nulldatenserialisierung/Deserialisierung mit Apache Arrow

Apache Arrow wird als In-Memory-Laufzeitformat für analytische Abfrage-Engines verwendet. Pfeil bietet daten serialisierung/deserialisierung null schlurft durch shared memory. Arrow flight sendet die großen Datensätze über das Netzwerk. Arrow verfügt über ein eigenes Arrow-Dateiformat, das den Nullkopie-Direktzugriff auf Daten auf Festplatten ermöglicht. Arrow verfügt über eine Standard-Datenzugriffsschicht für alle Spark-Anwendungen.

Es reduziert den Overhead für SerDe-Operationen zum Mischen von Daten, da es einen gemeinsamen Ort hat, an dem sich alle Daten in einem bestimmten Format befinden.

Garbage Collection-Tuning mit G1GC Collection

Beim Tuning von Garbage Collectors empfehlen wir zunächst, G1 GC zum Ausführen von Spark-Anwendungen zu verwenden. Der G1-Garbage Collector verarbeitet vollständig wachsende Haufen, die häufig bei Spark auftreten. Mit G1 werden weniger Optionen benötigt, um sowohl einen höheren Durchsatz als auch eine geringere Latenz zu bieten. Um unvorhersehbare Eigenschaften und Verhaltensweisen verschiedener Anwendungen zu kontrollieren, muss GC Tuning gemäß den generierten Protokollen gemeistert werden.

Zuvor müssen andere Optimierungstechniken wie Streaming- und Echtzeitanalyselösungen in der Logik und im Code des Programms angewendet werden. In den meisten Fällen hilft G1GC dabei, die Pausenzeit zwischen Prozessen zu optimieren, die in Spark-Anwendungen häufig vorkommen, und verkürzt so die Ausführungszeit von Jobs mit einem zuverlässigeren System.

Speicherverwaltung und -optimierung

Wie wir wissen, wird für Berechnungen wie Mischen, Sortieren usw. Ausführungsspeicher verwendet, während für Caching-Zwecke Speicher verwendet wird, der auch interne Daten weitergibt. Es kann einige Fälle geben, in denen Jobs keinen Cache verwenden. Zwischengespeicherte Jobs verwenden immer weniger Speicherplatz, wenn die Daten nicht durch Ausführungsanforderungen gelöscht werden dürfen. Darüber hinaus kann Echtzeit-Streaming-Anwendung mit Apache Spark durchgeführt werden.

Wir können spark setzen.Speicher.fraktion, um zu bestimmen, wie viel JVM-Heap-Speicherplatz für den Spark-Ausführungsspeicher verwendet wird. Üblicherweise ist 60% der Standardwert. Der Executor-Speicher muss so klein wie möglich gehalten werden, da dies zu einer Verzögerung der JVM-Speicherbereinigung führen kann. Diese Tatsache gilt auch für kleine Executoren, da mehrere Tasks auf einer einzigen JVM-Instanz ausgeführt werden können.

Datenlokalität

In Apache Spark werden Verarbeitungsaufgaben optimiert, indem der Ausführungscode in der Nähe der verarbeiteten Daten platziert wird, die als Datenlokalität bezeichnet werden. Manchmal muss die Verarbeitung warten, bevor Daten abgerufen werden, da keine Daten verfügbar sind. Wenn jedoch die Zeit des Funkens.lokalität.wait abläuft, versucht Spark auf lokaler Ebene, d. H. Lokal auf dem Knoten, um zu einem beliebigen Rack zu gelangen.

Das Übertragen von Daten zwischen Festplatten ist sehr kostspielig, daher müssen die meisten Vorgänge an dem Ort ausgeführt werden, an dem sich die Daten befinden. Es hilft, nur kleine, aber erforderliche Datenmengen zusammen mit testgetriebener Entwicklung für Apache Spark zu laden.

Collocated Joins verwenden

Collocated Joins treffen Entscheidungen über Umverteilung und Broadcasting. Wir können kleine Datensätze definieren, die sich in mehreren Speicherblöcken befinden, um eine bessere Nutzung des Rundfunks zu erreichen. Beim Anwenden von Verknüpfungen auf zwei Datasets sortiert Spark zuerst die Daten beider Datasets nach Schlüssel und führt sie zusammen.

Wir können aber auch einen Partitionsschlüssel anwenden, bevor wir sie verbinden oder während wir diese Datenrahmen in der Cache-Pfeilarchitektur erstellen. Dadurch wird die Laufzeit der Abfrage optimiert, da keine unnötigen Funktionsaufrufe zum Sortieren erforderlich sind.

Caching in Spark

Caching in Apache Spark mit GPU ist die beste Technik für die Apache Spark-Optimierung, wenn wir immer wieder Daten benötigen. Es ist jedoch immer nicht akzeptabel, Daten zwischenzuspeichern.

Wir müssen cache () RDD und DataFrames in einem der folgenden Fälle verwenden –

  • Wenn es eine iterative Schleife gibt, wie in Algorithmen für maschinelles Lernen.
  • Wenn in einem einzelnen Job oder Task mehrmals auf RDD zugegriffen wird.
  • Wenn die Kosten für die erneute Generierung der RDD-Partitionen höher sind.

Cache () und persist (StorageLevel.MEMORY_ONLY) können anstelle voneinander verwendet werden. Jede RDD-Partition, die aus dem Speicher entfernt wird, muss erneut aus der Quelle erstellt werden, die immer noch sehr teuer ist. Eine der besten Lösungen ist die Verwendung von persist (Storage).MEMORY_AND_DISK_ONLY ), das die Partitionen von RDD auf die lokale Festplatte des Arbeiters verschütten würde. In diesem Fall müssen nur Daten vom lokalen Laufwerk des Arbeiters abgerufen werden, was relativ schnell ist.

Executorgröße

Wenn wir Executoren mit hohem Speicher ausführen, führt dies häufig zu übermäßigen Verzögerungen bei der Speicherbereinigung. Wir müssen die Anzahl der Kerne pro Executor unter fünf Tasks pro Executor halten. Zu kleine Executoren waren nicht praktisch, um mehrere Jobs auf einer einzigen JVM auszuführen.

Zum Beispiel müssen Broadcastvariablen für jeden Executor genau einmal repliziert werden, was zu mehr Kopien der Daten führt.

Spark Windowing-Funktion

Eine Window-Funktion definiert einen Rahmen, über den wir Eingabezeilen einer Tabelle berechnen können. Auf individueller Zeilenebene. Jede Zeile kann einen klaren Rahmen haben. Mit Windowing können wir ein Fenster für Daten im Datenrahmen definieren. Wir können mehrere Zeilen im selben Datenrahmen vergleichen.

Wir können die Fensterzeit auf ein bestimmtes Intervall einstellen, das das Problem der Datenabhängigkeit von vorherigen Daten löst. Das Mischen in Apache Beam konzentriert sich weniger auf zuvor verarbeitete Daten, da wir diese Daten für das Fensterintervall beibehalten.

Watermarks Technique

Watermarking ist eine nützliche Technik in der Apache Spark-Optimierung, die das System durch Design einschränkt und verhindert, dass es während des Laufs explodiert. Wasserzeichen benötigt zwei Argumente –

  • Spalte für Ereigniszeit und
  • Eine Schwellenzeit, die angibt, wie lange wir späte Daten verarbeiten müssen

Die Abfrage in der Apache Arrow-Architektur wird automatisch aktualisiert, wenn die Daten innerhalb dieses festgelegten Schwellenwerts liegen. Man muss bedenken, dass wir den Complete-mode Seite an Seite mit Wasserzeichen verwenden können, da der Full-mode zuerst alle Daten in der resultierenden Tabelle beibehält.

Datenserialisierung

Die Apache Spark-Optimierung arbeitet mit Daten, die wir für einige Anwendungsfälle wie Analysen oder nur für die Datenbewegung verarbeiten müssen. Diese Bewegung von Daten oder Analysen kann gut durchgeführt werden, wenn die Daten in einem besser serialisierten Format vorliegen. Apache Spark unterstützt die Datenserialisierung, um die an der Quelle oder am Ziel benötigten Datenformate effektiv zu verwalten. Standardmäßig verwendet Apache Spark die Java-Serialisierung, unterstützt aber auch die Kryo-Serialisierung.

Standardmäßig verwendet Spark den ObjectOutputStream von Java, um die Daten zu serialisieren. Die Implementierung kann über Java erfolgen.io.Serialisierbare Klasse. Es codiert die Objekte in einen Strom von Bytes. Es bietet leichte Persistenz und flexibel. Es wird jedoch langsam, da es für jede Klasse, in der es verwendet wird, zu riesigen serialisierten Formaten führt. Spark unterstützt die Kryo Serialization Library (v4) für die Serialisierung von Objekten, die fast 10x schneller sind als die Java-Serialisierung, da sie kompakter als Java ist.

Apache Spark Optimierung: Ein umfassender Ansatz

Apache Spark, eine Open-Source-Engine für verteiltes Rechnen, ist derzeit das beliebteste Framework für die In-Memory-Stapelverarbeitung, das auch Echtzeit-Streaming unterstützt. Mit seinem fortschrittlichen Abfrageoptimierer und seiner Ausführungs-Engine können Apache Spark-Optimierungstechniken große Datensätze sehr effizient verarbeiten und analysieren. Das Ausführen von Apache Spark-Join-Optimierungstechniken ohne sorgfältige Abstimmung kann jedoch die Leistung beeinträchtigen. Wenn Sie die Leistung Ihrer Apache Spark-Anwendung nutzen möchten, schauen Sie sich unsere Managed Apache Spark Services an.

Kategorien :

Big-Data-Entwicklung,Big-Data-Lösungen,Streaming-Datenanalyse,

Teilen :

You might also like

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.