Enhanced Flexibility Mode (EFM) verwaltet Shuffle-Daten. Dadurch werden Verzögerungen beim Fortschritt des Jobs minimiert, die durch das Entfernen von Knoten aus einem ausgeführten Cluster verursacht werden. EFM schreibt Spark-Shuffle-Daten in primäre Worker. Die Worker rufen während der Reduzierungsphase von diesen Remote-Knoten ab.
Da EFM keine Zwischen-Shuffle-Daten auf sekundären Workern speichert, eignet sie sich gut zur Verwendung in Clustern, die VMs auf Abruf verwenden oder nur die sekundäre Worker-Gruppe automatisch skalieren.
- Apache Hadoop YARN-Jobs, die die AppMaster-Verschiebung nicht unterstützen, können im Modus für erweiterte Flexibilität fehlschlagen (siehe Warten auf den Abschluss von AppMasters).
- Der Modus für erweiterte Flexibilität wird nicht empfohlen:
- auf einem Cluster, der nur primäre Worker hat.
- Der Modus für erweiterte Flexibilität wird nicht unterstützt:
- wenn das primäre Worker-Autoscaling aktiviert ist. In den meisten Fällen speichern primäre Worker weiterhin Shuffle-Daten, die nicht automatisch migriert werden. Durch die Herunterskalierung der primären Worker-Gruppe werden ESM-Vorteile ausgeschlossen.
- wenn Spark-Jobs in einem Cluster mit aktivierter ordnungsgemäßer Außerbetriebnahme ausgeführt werden. Die ordnungsgemäße Außerbetriebnahme und EFM können zu verschiedenen Zwecken funktionieren, da der Mechanismus der ordnungsgemäßen Außerbetriebnahme von YARN die Knoten DEAKTIVIEREN hält, bis alle betroffenen Anwendungen abgeschlossen sind.
Enhanced Flexibility Mode verwenden
Der Enhanced Flexibility Mode wird pro Ausführungs-Engine konfiguriert und muss während der Clustererstellung konfiguriert werden. Die Spark-EFM-Implementierung wird mit dem Clusterattribut dataproc:efm.spark.shuffle=primary-worker
konfiguriert.
Beispiel:Erstellen Sie einen Cluster mit dem Shuffle für primäre Worker für Spark:
gcloud dataproc clusters create cluster-name \ --region=region \ --properties=dataproc:efm.spark.shuffle=primary-worker \ --worker-machine-type=n1-highmem-8 \ --num-workers=25 \ --num-worker-local-ssds=2 \ --secondary-worker-type=preemptible \ --secondary-worker-boot-disk-size=500GB \ --num-secondary-workers=25
Beispiel für Apache Spark
- Einen WordCount-Job für öffentlichen Shakespeare-Text mithilfe der Spark-Beispiel-JAR-Datei im EFM-Cluster ausführen.
gcloud dataproc jobs submit spark \ --cluster=cluster-name \ --region=region \ --jars=file:///usr/lib/spark/examples/jars/spark-examples.jar \ --class=org.apache.spark.examples.JavaWordCount \ -- gs://apache-beam-samples/shakespeare/macbeth.txt
Lokale SSDs für primären Worker-Shuffle konfigurieren
Die primären Worker- und HDFS-Shuffle-Implementierungen schreiben Zwischen-Shuffle-Daten auf VM-Anhängen mit zusätzlichem Durchsatz und zusätzlichen IOPS, die von lokalen SSDs angeboten werden. Damit die Ressourcenzuweisung vereinfacht wird, sollten Sie beim Konfigurieren von primären Worker-Maschinen ein Ziel von etwa einer lokalen SSD-Partition pro 4 vCPUs festlegen.
Übergeben Sie das Flag --num-worker-local-ssds
an den Befehl gcloud dataproc clusters create, um lokale SSDs hinzuzufügen.
Verhältnis der sekundären Worker
Da sekundäre Worker ihre Shuffle-Daten in primäre Worker schreiben, muss der Cluster eine ausreichende Anzahl primärer Worker mit ausreichend CPU-, Arbeitsspeicher- und Laufwerksressourcen enthalten, um die Shuffle-Auslastung des Jobs zu bewältigen. Wenn Sie bei Autoscaling-Clustern verhindern möchten, dass die primäre Gruppe skaliert und unerwünschtes Verhalten verursacht, legen Sie minInstances
in der Autoscaling-Richtlinie für die primäre Worker-Gruppe auf den Wert maxInstances
fest.
Wenn Sie ein hohes Verhältnis von sekundären zu primären Workern haben (z. B. 10:1), überwachen Sie die CPU-Auslastung, das Netzwerk und die Laufwerknutzung primärer Worker, um festzustellen, ob sie überlastet sind. Vorgehensweise:
Rufen Sie in der Google Cloud Console die Seite VM-Instanzen auf.
Klicken Sie auf das Kästchen links neben dem primären Worker.
Klicken Sie auf den Tab MONITORING, um die CPU-Auslastung, die Laufwerk-IOPS, die Netzwerk-Byte und andere Messwerte des primären Workers anzuzeigen.
Wenn primäre Worker überlastet sind, sollten Sie primäre Worker manuell vertikal skalieren.
Größe der primären Workergruppe anpassen
Die primäre Workergruppe kann sicher skaliert werden. Das Herunterskalieren der primären Workergruppe kann jedoch den Jobfortschritt beeinträchtigen. Vorgänge, die die primäre Worker-Gruppe herunterskalieren, sollten die ordnungsgemäße Außerbetriebnahme verwenden. Diese wird durch Festlegen des Flags --graceful-decommission-timeout
aktiviert.
Automatisch skalierte Cluster: Die Skalierung der primären Workergruppe ist in EFS-Clustern mit Autoscaling-Richtlinien deaktiviert. So passen Sie die Größe der primären Workergruppe auf einem automatisch skalierten Cluster an:
Autoscaling deaktivieren.
gcloud dataproc clusters update \ --cluster=cluster-name \ --region=region \ --disable-autoscaling
Primäre Gruppe skalieren
gcloud dataproc clusters update \ --cluster=cluster-name \ --region=region \ --num-workers=num-primary-workers \ --graceful-decommission-timeout=graceful-decommission-timeout # (if downscaling)
Aktivieren Sie Autoscaling wieder:
gcloud dataproc clusters update \ --cluster=cluster-name \ --region=region \ --autoscaling-policy=autoscaling-policy
Nutzung des primären Worker-Laufwerks überwachen
Primäre Worker müssen genügend Speicherplatz für die Shuffle-Daten des Clusters haben.
Sie können dies indirekt anhand des Messwerts remaining HDFS capacity
überwachen.
Wenn das lokale Laufwerk gefüllt wird, ist der Speicherplatz für HDFS nicht verfügbar und die verbleibende Kapazität sinkt.
Wenn das lokale Laufwerk eines primären Workers über 90 % der Kapazität überschreitet, wird der Knoten in der YARN-Knoten-Benutzeroberfläche standardmäßig als UNHEALTHY gekennzeichnet. Wenn Probleme mit der Laufwerkskapazität auftreten, können Sie nicht verwendete Daten aus HDFS löschen oder den primären Worker-Pool hochskalieren.
Beachten Sie, dass Shuffle-Zwischendaten im Allgemeinen erst am Ende eines Jobs bereinigt werden. Wenn Sie den primären Worker-Shuffle mit Spark verwenden, kann dies bis zu 30 Minuten nach Abschluss eines Jobs dauern.
Erweiterte Konfiguration
Partitionierung und Parallelität
Konfigurieren Sie beim Senden eines MapReduce- oder Spark-Jobs eine geeignete Partitionierungsebene. Die Entscheidung über die Anzahl der Eingabe- und Ausgabepartitionen für eine Shuffle-Phase hat einen Kompromiss zwischen verschiedenen Leistungsmerkmalen. Am besten experimentieren Sie mit Werten, die für Ihre Jobformen funktionieren.
Eingabepartitionen
Die Partitionierung von MapReduce und Spark wird vom Eingabe-Dataset bestimmt. Beim Lesen von Dateien aus Cloud Storage verarbeitet jede Aufgabe ungefähr eine "Blockgröße" an Daten.
Bei Spark SQL-Jobs wird die maximale Partitionsgröße von
spark.sql.files.maxPartitionBytes
festgelegt. Wir empfehlen, den Wert auf 1 GB zu erhöhen:spark.sql.files.maxPartitionBytes=1073741824
.Bei MapReduce-Jobs und Spark-RDDs wird die Partitionsgröße in der Regel mit
fs.gs.block.size
gesteuert, die standardmäßig 128 MB beträgt. Wir empfehlen, den Wert auf 1 GB zu erhöhen. Sie können auchInputFormat
-spezifische Attribute wiemapreduce.input.fileinputformat.split.minsize
undmapreduce.input.fileinputformat.split.maxsize
festlegen.- Für MapReduce-Jobs:
--properties fs.gs.block.size=1073741824
- Für Spark-RDDs:
--properties spark.hadoop.fs.gs.block.size=1073741824
- Für MapReduce-Jobs:
Ausgabepartitionen
Die Anzahl der Aufgaben in den folgenden Phasen wird durch mehrere Attribute gesteuert. Bei größeren Jobs, die mehr als 1 TB verarbeiten, sollten Sie mindestens 1 GB pro Partition bereitstellen.
Bei MapReduce-Jobs wird die Anzahl der Ausgabepartitionen von
mapreduce.job.reduces
gesteuert.Bei Spark SQL wird die Anzahl der Ausgabepartitionen von
spark.sql.shuffle.partitions
gesteuert.Bei Spark-Jobs, die die RDD API verwenden, können Sie die Anzahl der Ausgabepartitionen angeben oder
spark.default.parallelism
festlegen.
Shuffle-Tuning des primären Workers
Das wichtigste Attribut ist --properties yarn:spark.shuffle.io.serverThreads=<num-threads>
.
Beachten Sie, dass hier ein YARN-Attribut auf Clusterebene angegeben ist, da der Spark-Shuffle-Server als Teil des Knoten-Managers ausgeführt wird. Standardmäßig wird die Anzahl der Kerne auf dem Computer verdoppelt (z. B. 16 Threads auf einem n1-highmem-8). Wenn „Shuffle Read Blocked Time“ größer als 1 Sekunde ist und primäre Worker das Netzwerk-, CPU- oder Laufwerklimit nicht erreicht haben, sollten Sie die Anzahl der Shuffle-Server-Threads erhöhen.
Bei größeren Maschinentypen sollten Sie möglicherweise spark.shuffle.io.numConnectionsPerPeer
erhöhen. Der Standardwert ist 1. (Setzen Sie es z. B. auf 5 Verbindungen pro Hostpaar).
Wiederholungsversuche erhöhen
Die maximale Anzahl der Versuche, die App-Master, Aufgaben und Phasen verwenden können, kann über die folgenden Attribute konfiguriert werden:
yarn:yarn.resourcemanager.am.max-attempts mapred:mapreduce.map.maxattempts mapred:mapreduce.reduce.maxattempts spark:spark.task.maxFailures spark:spark.stage.maxConsecutiveAttempts
Da Anwendungsmaster und Aufgaben in Clustern, die viele VMs auf Abruf oder Autoscaling ohne ordnungsgemäße Außerbetriebnahme verwenden, häufiger beendet werden, kann die Erhöhung der Werte der vorherigen Attribute in diesen Clustern Abhilfe schaffen (beachten Sie, dass die Verwendung von EFM mit Spark und der ordnungsgemäßen Außerbetriebnahme nicht unterstützt wird).
YARN: Ordnungsgemäße Außerbetriebnahme in EFS-Clustern
Die ordnungsgemäße Außerbetriebnahme in YARN kann verwendet werden, um Knoten schnell und mit minimalen Auswirkungen auf die Ausführung von Anwendungen zu entfernen. Bei Autoscaling-Clustern kann das Zeitlimit für eine ordnungsgemäße Außerbetriebnahme in einer AutoscalingPolicy festgelegt werden, die an den EFM-Cluster angehängt ist.
EFM-Verbesserungen für die ordnungsgemäße Außerbetriebnahme
Da Zwischendaten in einem verteilten Dateisystem gespeichert werden, können Knoten aus einem EFM-Cluster entfernt werden, sobald alle Container, die auf diesen Knoten ausgeführt werden, abgeschlossen sind. Dagegen werden Knoten erst dann aus Standard-Dataproc-Clustern entfernt, wenn die Anwendung beendet wurde
Das Entfernen von Knoten wartet nicht, bis die auf einem Knoten ausgeführten App-Master beendet wurden. Wenn der Master-Container der Anwendung beendet wird, wird er auf einem anderen Knoten verschoben, der nicht außer Betrieb genommen wird. Jobfortschritte gehen nicht verloren. Der neue App-Master stellt den Status des vorherigen App-Master durch das Einlesen des Jobverlaufs schnell wieder her.