Optimierung der Clusterkonfiguration für Apache Spark
In diesem Artikel wird erläutert, wie Sie die Konfiguration Ihres Apache Spark-Clusters optimieren, um die optimale Leistung für Azure HDInsight zu erzielen.
Übersicht
Je nach Größe Ihrer Spark-Clusterworkload stellen Sie möglicherweise fest, dass Sie mit einer nicht standardmäßigen Spark-Konfiguration eine Optimierung der Spark-Auftragsausführung erzielen könnten. Führen Sie Benchmarktests mit Beispielworkloads durch, um verschiedene nicht standardmäßige Clusterkonfigurationen zu überprüfen.
Hier finden Sie einige allgemeine Parameter, die Sie anpassen können:
Parameter | BESCHREIBUNG |
---|---|
--num-executors | Legt die angemessene Anzahl von Executors fest. |
--executor-cores | Legt die Anzahl von Kernen für jeden Executor fest. In der Regel sollten Sie Executors mittlerer Größe einsetzen, da andere Prozesse einen Teil des verfügbaren Arbeitsspeicherplatzes nutzen. |
--executor-memory | Legt die Arbeitsspeichergröße für jeden Executor fest, wodurch die Heapgröße in YARN gesteuert wird. Reservieren Sie eine bestimmte Menge an Arbeitsspeicher für den Ausführungsoverhead. |
Auswählen der richtigen Executorgröße
Wenn Sie über die Executorkonfiguration entscheiden, ziehen Sie den Overhead für die Java-Garbage Collection (GC) in Betracht.
Folgende Faktoren reduzieren die Größe eines Executors:
- Reduzieren Sie die Heapgröße auf unter 32 GB, um den GC-Overhead unter 10 % zu halten.
- Reduzieren Sie die Anzahl von Kernen, um den GC-Overhead unter 10 % zu halten.
Folgende Faktoren erhöhen die Größe eines Executors:
- Reduzieren Sie die Kommunikation zwischen Executors.
- Reduzieren Sie die Anzahl offener Verbindungen zwischen Executors (N2) in größeren Clustern (über 100 Executors).
- Erhöhen Sie die Heapgröße, um genügend Platz für arbeitsspeicherintensive Tasks zu haben.
- Optional: Reduzieren Sie den Arbeitsspeicheroverhead pro Executor.
- Optional: Erhöhen Sie die Auslastung und Parallelität durch Überabonnierung der CPU.
Bei der Auswahl der Executorgröße gelten folgende allgemeine Regeln:
- Beginnen Sie mit 30 GB pro Executor, und verteilen Sie verfügbare Computerkerne.
- Erhöhen Sie die Anzahl von Executorkernen für größere Cluster (über 100 Executors).
- Ändern Sie die Größe anhand von Testausführungen und den oben genannten Faktoren wie z.B. GC-Overhead.
Berücksichtigen Sie beim Ausführen paralleler Abfragen folgende Aspekte:
- Beginnen Sie mit 30 GB pro Executor und allen Computerkernen.
- Erstellen Sie durch Überabonnierung der CPU mehrere parallele Spark-Anwendungen (etwa 30 % verbesserte Latenz).
- Verteilen Sie Abfragen auf parallele Anwendungen.
- Ändern Sie die Größe anhand von Testausführungen und den oben genannten Faktoren wie z.B. GC-Overhead.
Weitere Informationen zur Verwendung von Ambari zum Konfigurieren von Executors finden Sie unter Apache Spark-Einstellungen – Spark-Executors.
Überwachen Sie die Abfrageleistung auf Ausreißer oder andere Leistungsprobleme, indem Sie die Zeitachsenansicht untersuchen. Betrachten Sie auch das SQL-Diagramm, die Auftragsstatistiken usw. Informationen zum Debuggen von Spark-Aufträgen mithilfe von YARN und dem Spark-Verlaufsserver finden Sie unter Debuggen von Apache Spark-Aufträgen, die in HDInsight ausgeführt werden. Tipps zur Verwendung von YARN Timeline Server finden Sie unter Zugreifen auf Apache Hadoop YARN-Anwendungsprotokolle.
Langsamere Aufgaben auf einigen Executors oder Knoten
Zuweilen sind einige Executors langsamer als die anderen, und die Ausführung der Tasks dauert wesentlich länger. Dies kommt häufig in größeren Clustern vor (über 30 Knoten). Teilen Sie in diesem Fall die Arbeit auf eine größere Anzahl von Tasks auf, sodass der Taskplaner langsame Tasks kompensieren kann. In der Anwendung sollten z.B. mindestens doppelt so viel Tasks wie Executorkerne vorhanden sein. Sie können auch mit conf: spark.speculation = true
die spekulative Ausführung von Tasks aktivieren.