Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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://myclusterPfad. - 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.
-
KryoSerialisierung ist ein neueres Format und kann zu einer schnelleren und kompakteren Serialisierung als Java führen.Kryoerfordert, 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.