Freigeben über


Datenspeicheroptimierung für Apache Spark

In diesem Artikel werden Strategien zur Optimierung der Datenspeicherung für effiziente Apache Spark-Auftragsausführung in Azure HDInsight erläutert.

Übersicht

Spark unterstützt viele Formate, z. B. CSV, JSON, XML, Parkett, Orc und Avro. Spark kann erweitert werden, um viele weitere Formate mit externen Datenquellen zu unterstützen – weitere Informationen finden Sie unter Apache Spark-Pakete.

Hinsichtlich der Leistung ist Parquet mit Snappy-Komprimierung das beste Format. Dies ist die Standardeinstellung in Spark 2.x. Parquet speichert Daten im spaltenbasierten Format und ist in Spark hoch optimiert.

Wählen Sie die Datenabstraktion

Frühere Spark-Versionen verwenden RDDs zum Abstrahieren von Daten, Spark 1.3 und 1.6 eingeführten DataFrames bzw. DataSets. Berücksichtigen Sie die folgenden relativen Vorteile:

  • Dataframes
    • Beste Wahl in den meisten Situationen.
    • Stellt die Abfrageoptimierung über Catalyst bereit.
    • Ganzheitliche Codegenerierung.
    • Direkter Speicherzugriff.
    • Geringer Overhead durch Garbage Collection (GC).
    • Nicht so entwicklerfreundlich wie DataSets, da keine Kompilierungszeitüberprüfungen oder Domänenobjektprogrammierung vorhanden sind.
  • Datasets
    • Gut in komplexen ETL-Pipelines, bei denen die Leistungseinbußen akzeptabel sind.
    • Nicht gut in Aggregationen, bei denen die Auswirkungen auf die Leistung erheblich sein können.
    • Stellt die Abfrageoptimierung über Catalyst bereit.
    • Durch die Bereitstellung von Domänenobjektprogrammierung und Kompilierungszeitüberprüfungen wird Entwicklerfreundlichkeit gewährleistet.
    • Fügt den Serialisierungs-/Deserialisierungsaufwand hinzu.
    • Hoher GC-Overhead.
    • Unterbricht die ganzheitliche Code-Generierung.
  • RDDs
    • Sie müssen keine RDDs verwenden, es sei denn, Sie müssen eine neue benutzerdefinierte RDD erstellen.
    • Keine Abfrageoptimierung durch Catalyst.
    • Keine ganzheitliche Stufen-Codegenerierung.
    • Hoher GC-Aufwand.
    • Muss Spark 1.x legacy-APIs verwenden.

Standardspeicher auswählen

Wenn Sie einen neuen Spark-Cluster erstellen, können Sie Azure Blob Storage oder Azure Data Lake Storage als Standardspeicher ihres Clusters auswählen. Beide Optionen bieten Ihnen den Vorteil der Langzeitspeicherung für vorübergehende Cluster. Ihre Daten werden also nicht automatisch gelöscht, wenn Sie Ihren Cluster löschen. Sie können einen vorübergehenden Cluster neu erstellen und weiterhin auf Ihre Daten zugreifen.

Speichertyp Dateisystem Geschwindigkeit Transient Anwendungsfälle
Azure Blob Storage (Speicherdienst von Azure für unstrukturierte Daten) wasb://url/ Standard Ja Vorübergehender Cluster
Azure Blob Storage (sicher) wasbs://url/ Standard Ja Vorübergehender Cluster
Azure Data Lake Storage Gen2 abfs://url/ Schneller Ja Vorübergehender Cluster
Azure Data Lake Storage Gen 1 adl://url/ Schneller Ja Vorübergehender Cluster
Lokale HDFS hdfs://url/ schnellste No Interaktiver 24/7-Cluster

Eine vollständige Beschreibung der Speicheroptionen finden Sie unter Vergleichen von Speicheroptionen für die Verwendung mit Azure HDInsight-Clustern.

Verwenden Sie den Cache

Spark bietet eigene systemeigene Caching-Mechanismen, die über verschiedene Methoden wie .persist(), .cache() und CACHE TABLE verwendet werden können. Diese systemeigene Zwischenspeicherung ist mit kleinen Datasets und in ETL-Pipelines wirksam, in denen Zwischenergebnisse zwischengespeichert werden müssen. Das systemeigene Zwischenspeichern von Spark funktioniert derzeit jedoch nicht gut mit der Partitionierung, da eine zwischengespeicherte Tabelle die Partitionierungsdaten nicht behält. Eine allgemeinere und zuverlässige Cachetechnik ist das Caching auf Speicherebene.

  • Native Spark-Zwischenspeicherung (nicht empfohlen)

    • Gut für kleine Datasets.
    • Funktioniert nicht mit der Partitionierung, die sich in zukünftigen Spark-Versionen ändern kann.
  • Zwischenspeicherung auf Speicherebene (empfohlen)

    • Kann in HDInsight mithilfe der IO-Cache-Funktion implementiert werden.
    • Verwendet speicherinterne und SSD-Zwischenspeicherung.
  • Das lokale HDFS (empfohlen)

    • hdfs://mycluster Pfad.
    • Verwendet SSD-Zwischenspeicherung.
    • Zwischengespeicherte Daten gehen verloren, wenn Sie den Cluster löschen und einen Cache neu erstellen müssen.

Optimieren der Daten serialisierung

Spark-Aufträge werden verteilt, sodass die geeignete Daten serialisierung für die beste Leistung wichtig ist. Für Spark gibt es zwei Serialisierungsoptionen:

  • Die Java-Serialisierung ist die Standardeinstellung.
  • Kryo Serialisierung ist ein neueres Format und kann zu einer schnelleren und kompakteren Serialisierung als Java führen. Kryo erfordert, dass Sie die Klassen in Ihrem Programm registrieren und noch nicht alle serialisierbaren Typen unterstützen.

Verwenden der Zuordnung von Buckets

Der Bucketing ähnelt der Datenpartitionierung. Jeder Bucket kann jedoch einen Satz von Spaltenwerten statt nur eines enthalten. Diese Methode eignet sich gut für die Partitionierung großer (in Millionen oder mehr) Zahlen von Werten, z. B. Produkt-IDs. Ein Bucket wird durch eine Hashberechnung für den Bucketschlüssel der Zeile bestimmt. Zusammengefasste Tabellen bieten eindeutige Optimierungen, da sie Metadaten darüber speichern, wie sie zusammengefasst und sortiert wurden.

Einige erweiterte Bucketing-Funktionen sind:

  • Abfrageoptimierung basierend auf Bucketing-Metainformationen.
  • Optimierte Aggregationen.
  • Optimierte Joins.

Sie können Partitionierung und Bucketing gleichzeitig verwenden.

Nächste Schritte