Bei der neuesten Zusammenstellung von Interviews wurden häufig Spark-Wissenspunkte abgefragt

Fragenführer:

1. Was sind die Merkmale von RDD?
2. Was ist der Unterschied zwischen Map und MapPartitions?
3. 
Warum startet die Spark-Anwendung den Job, ohne genügend Ressourcen zu erhalten? Welche Probleme können auftreten?


Fünf Funktionen

von

RDD : 1. Eine Liste von Partitionen RDD ist eine Liste von Partitionen (in einem Knoten). Beim Laden von Daten als RDD folgt diese im Allgemeinen der Lokalität der Daten (im Allgemeinen wird ein Block in HDFS als Partition geladen).

2. Eine Funktion zum Berechnen jeder Teilung

. Jede Partition des RDD hat eine Funktion auf jeder Partition, die eine Funktionsanwendung ist. Ihre Aufgabe besteht darin, die Konvertierung von Partitionen zwischen RDDs zu realisieren.

3. Eine Liste von Abhängigkeiten von anderen RDDs

RDD zeichnet seine Abhängigkeiten auf. Abhängigkeiten werden auch in breite Abhängigkeiten und enge Abhängigkeiten unterteilt, aber nicht alle RDDs haben Abhängigkeiten. Um Fehler (Neuberechnung, Cache, Prüfpunkt) zu tolerieren, dh die RDD im Speicher wird neu berechnet, wenn sie fehlschlägt oder verloren geht.

4. Optional ist ein Partitionierer für RDDs mit Schlüsselwerten

optional. Wenn die im RDD gespeicherten Daten in Form von Schlüsselwerten vorliegen, können Sie einen benutzerdefinierten Partitionierer für die Neupartitionierung übergeben. Beispielsweise partitioniert der benutzerdefinierte Partitionierer hier basierend auf dem Schlüssel. Fügen Sie dann dieselben Schlüsseldaten in verschiedenen RDDs in dieselbe Partition ein

5. Optional eine Liste bevorzugter Orte, an denen jeder Split für den

zu berechnenden optimalen Ort berechnet wird. Dies ist der Ort der Daten.

Der Unterschied zwischen Map und MapPartitions-

Map besteht darin, jedes Element in
rdd zu bearbeiten . MapPartitions arbeitet mit dem Iterator jeder Partition in rdd.

Vorteile von MapPartitions:

Wenn es sich beispielsweise um eine normale Map handelt, enthält eine Partition 10.000 Elemente Daten. ok, dann muss deine Funktion 10.000 mal ausgeführt und berechnet werden.
Nach Verwendung der MapPartitions-Operation führt eine Task die Funktion nur einmal aus, und die Funktion empfängt alle
Partitionsdaten gleichzeitig . Es muss nur einmal ausgeführt werden und die Leistung ist relativ hoch. Wenn während des Map-Prozesses häufig zusätzliche Objekte erstellt werden müssen (z. B. werden die Daten in rdd über jdbc in die Datenbank geschrieben, map muss für jedes Element einen Link erstellen und mapPartition erstellt für jede Partition einen Link), ist mapPartitions effizienter als map Viele.
SparkSql oder DataFrame optimieren das Programm standardmäßig für mapPartition.

Nachteile von MapPartitions:

Wenn es sich um eine normale Map-Operation handelt, wird ein Datenelement in einer Funktionsausführung verarbeitet. Wenn der Speicher nicht ausreicht, z. B. wenn 1.000 Datenelemente verarbeitet werden, reicht der Speicher zu diesem Zeitpunkt nicht aus, und der vorhandene Die 1.000 verarbeiteten Daten sind Müll, der aus dem Speicher gesammelt wird, oder verwenden andere Methoden, um Platz zu schaffen.
Daher verursachen normale Kartenoperationen normalerweise keine Speicher-OOM-Ausnahmen.
Bei MapPartitions-Vorgängen kann es jedoch vorkommen, dass für große Datenmengen, z. B. sogar eine Partition mit 1 Million Daten,
nach dem Übergeben einer Funktion gleichzeitig nicht genügend Speicher vorhanden ist. Es gibt jedoch keine Möglichkeit, Speicherplatz, möglicherweise OOM, Speicherüberlauf freizugeben .

Große Abhängigkeit, enge Abhängigkeit

Enge Abhängigkeit: Jede Partition der übergeordneten RDD kann nur von einer untergeordneten RDD-Partition verwendet werden (1 zu 1 oder viele zu 1).
Große Abhängigkeit: Jede Partition der übergeordneten RDD kann von mehreren untergeordneten RDD-Partitionen verwendet werden (1) Zu vielen).
Einige häufig vorkommende breite und enge Abhängigkeiten und
enge Abhängigkeiten: Map, Filter, Union, MapPartitions, Join (wenn der Partitionierer HashPartitioner ist)
Breite Abhängigkeiten: sortByKey, Join (wenn der Partitionierer kein HashPartitioner ist)
Ist reductByKey eine große Abhängigkeit oder eine enge Abhängigkeit? / todo
https://www.cnblogs.com/upupfeng/p/12344963.html
https://github.com/rohgar/scala- ... Enge Abhängigkeiten
https://blog.csdn.net/qq_34993631/article / details / 88890669

Was die Anzahl der Partitionen bestimmt

https://blog.csdn.net/thriving_fcl/article/details/78072479

Funken Parallelität

Der Standardwert von spark.sql.shuffle.partitions ist 200. Dies ist die Standardanzahl von Partitionen in den zurückgegebenen RDDs, die vom Benutzer explizit durch Join, ReduceByKey und Parallelisierung von Konvertierungen festgelegt wird. Beachten Sie, dass spark.default.parallelism nur für unformatierte RDDs zu gelten scheint und bei der Verarbeitung von Datenrahmen ignoriert wird.
spark.default.parallelism wird in sparksql nicht verwendet. Konfigurieren Sie die Anzahl der Partitionen, die beim Mischen von Verbindungen oder beim Aggregieren von Daten verwendet werden.
https://www.jianshu.com/p/e721f002136c

Gemeinsame

Spark- Variablen Bei der Anwendungsentwicklung wird eine Funktion an Spark-Vorgänge (wie Zuordnen und Reduzieren) übergeben und auf einem Remote-Cluster ausgeführt. Diese Funktion wird tatsächlich ausgeführt Unabhängige Kopien aller verwendeten Variablen. Diese Variablen werden auf jede Maschine kopiert. Im Allgemeinen scheint das Lesen und Schreiben gemeinsamer Variablen zwischen Aufgaben offensichtlich nicht effizient genug zu sein. Spark bietet jedoch weiterhin zwei begrenzte gemeinsam genutzte Variablen für zwei allgemeine Verwendungsmuster: Broadcast-Variablen und Akkumulatoren.

(1) Broadcast-Variablen -
Broadcast-Variablen werden im Speicher jedes Knotens zwischengespeichert, anstatt jeder Aufgabe. -
Nachdem die Broadcast-Variable erstellt wurde, ist jeder Funktionsaufruf, der im Cluster
ausgeführt werden kann. Broadcast-Variablen sind schreibgeschützt. Kann nach der Übertragung nicht geändert werden -
Bei der Übertragung großer Datenmengen versucht Spark, effiziente Übertragungsalgorithmen zu verwenden, um die Kommunikationskosten zu senken. Der
Methodenparameter val BroadcastVar = sc.broadcast (Array (1, 2, 3)) ist die zu sendende Variable

( 2) Akku
Der Akkumulator unterstützt nur Additionsoperationen, die effizient parallel geschaltet und zur Implementierung der Zähler- und Variablensummierung verwendet werden können. Spark unterstützt nativ numerische Typen und Standardzähler für Variablensätze, Benutzer können jedoch neue Typen hinzufügen. Nur der Fahrer kann den Wert des Akkumulators
https://www.jianshu.com/p/aeec7d8bc8c4

Funken-Datenversatz

https://www.jianshu.com/p/e721f002136c

Funken-Shuffle

https://www.jianshu.com abrufen / p / a3bb3001abae
https://www.jianshu.com/p/98a1d67bc226
Hashshuffle (veraltet)
Sortshuffle (die aktuelle Standard-Shuffle-Methode, einschließlich BypassMergeSortShuffle) Unsichere Shuffle-
oder Wolfram-Sort-



Shuffle- Optimierung :

https: //www.cnogs. com / haozheng ... b094f36b72c7d3.html

Details zur Shuffle-Konfiguration:

https://blog.csdn.net/lds_include/article/details/89197291

Der Unterschied zwischen Spark- und Hadoop-Shuffle (Hervorhebung)

https://www.jianshu.com/p / 58c7b7f3efbe Grundlegende Artikel zur

Optimierung der Funkenleistung

:https://tech.meituan.com/2016/04/29/spark-tuning-basic.html
Erweitert: https://tech.meituan.com/2016/05/12/spark-tuning-pro.html

Warum Wenn die Spark-Anwendung nicht genügend Ressourcen erhält, wird der Job ausgeführt. Welche Probleme

können dazu führen, dass beim Ausführen des Jobs nicht genügend Clusterressourcen vorhanden sind und die Ausführung des Jobs beendet wird und nicht genügend Ressourcen zugewiesen werden. Ein Teil des Executors wird zugewiesen. Der Job beginnt mit der Ausführung der Aufgabe. Es sollte sein, dass der Taskplanungsthread und die Executor-Ressourcenanwendung asynchron sind. Wenn Sie warten möchten, bis alle Ressourcen angewendet wurden, bevor Sie den Job ausführen, müssen Sie spark.scheduler.maxRegisteredResourcesWaitingTime auf einen großen Wert setzen: spark.scheduler.minRegisteredResourcesRatio Auf 1 gesetzt, sollte aber mit tatsächlichen Überlegungen kombiniert werden, da es sonst leicht ist, Ressourcen für eine lange Zeit nicht zuzuweisen, und der Job nicht immer ausgeführt werden kann.
Das Mindestverhältnis der registrierten Ressourcen (registrierte Ressourcen / erwartete Gesamtressourcen) (Ressourcen sind Ausführende im Garnmodus, CPU-Kerne im Standalone-Modus und im grobkörnigen Mesos-Modus [Der Wert von 'spark.cores.max' ist die erwartete Gesamtressource für Mesos-Grob-). Körnungsmodus]), auf den gewartet werden muss, bevor die Planung beginnt. Angegeben als Doppel zwischen 0,0 und 1,0. Unabhängig davon, ob das minimale Ressourcenverhältnis erreicht wurde, wird die maximale Wartezeit vor Beginn der Planung von der Konfiguration spark.scheduler.maxRegisteredResourcesWaitingTime gesteuert.
Standard: 0,8 für den YARN-Modus; 0.0 für den Standalone-Modus und den grobkörnigen Mesos-

Funken Lineage

https://blog.csdn.net/m0_37914799/article/details/85009466

spark 粗粒 度 、 细粒度

https://www.jianshu.com/p/d6df42c10a5c

Funkenprüfpunkt

https://www.jianshu.com/p/259081b0083a

Funkenkomponente
 

  • Treiberpragramm: Das Treiberprogramm der Anwendung, mit dem die Hauptfunktion der Anwendung ausgeführt und der SparkContext-Prozess erstellt wird, um die Betriebsumgebung der Anwendung vorzubereiten.
  • SparkContext: SparkContext wird in Spark verwendet, um mit ClusterManager zu kommunizieren, Ressourcen zu beantragen, Aufgaben zuzuweisen und zu überwachen.
  • ClusterManager: Der Knoten, der für die Verwaltung und Zuweisung von Clusterressourcen verantwortlich ist. Er überwacht den WorkerNode mithilfe des Heartbeat. Im Standalone-Modus ist er der Master und im Garnmodus der Resource Manager.
  • Arbeitsknoten: Der Slave-Knoten im Cluster, der für die Berechnung und Steuerung verantwortlich ist, kann den Exector oder den Treiber starten.
  • Executor: ClusterManager, das Executor-Programm der Anwendung, weist jedem Executor der Anwendung einen Prozess zu und führt TaskSet mithilfe der Thread-Pool-Zuweisung aus.
  • Aufgabe: Die Grundeinheit für die Ausführung von Aufgaben in Executor. Mehrere Aufgaben können eine Stufe bilden.
  • TaskSet (Task-Set): Eine Reihe verwandter Tasks, jedoch keine Shuffle-Abhängigkeit zwischen ihnen.








Spark- Job-Prozess 1. Das Anwendungsprogramm startet das Treiberprogramm und erstellt einen SparkContext.
2. SparkContext gilt für den Ressourcenmanager zum Ausführen von Executor-Knotenressourcen, und der Executor-Knoten startet SatandaloneExectuorBackend. Executor meldet dem Ressourcenmanager regelmäßig die Ressourcennutzung.
3. Der Executor-Knoten sendet den SparkContext an den SparkContext Bewerben Sie sich für eine Aufgabe, dann sendet SparkContext das Executor-Programm in Application an Executor.
4. SparkContext erstellt RDD-Objekte in DAG (gerichtetes azyklisches Diagramm) und sendet es dann an DAG Scheduler.
5. DAG Scheduler teilt DAT in mehrere auf Jede Phase besteht aus mehreren Aufgaben. Anschließend wird das TaskSet an den TaskScheduler gesendet.
6. Der TaskScheduler sendet die Aufgaben im TaskSet an den Executor, um sie auszuführen, und der Executor verwendet den Thread-Pool, um diese Aufgaben auszuführen. Der Executor befindet sich in den Aufgaben Alle Ressourcen werden nach dem Ausführen freigegeben:

https://www.jianshu.com/p/3e1abd37aadd

sparkContext

https://www.cnblogs.com/xia520pi/p/8609602.html

Speichersystem

http://arganzheng.life/spark -executor-memory-management.html

spark Block

https://blog.csdn.net/imgxr/article/details/80129296

Datenlokalität

https://www.cnblogs.com/cc11001100/p/10301716.html

Funken sql drei Arten von Join

https://blog.csdn.net / wlk_328909605 / article / details / 82933552
https://blog.csdn.net/aa5305123/article/details/83037838

Ausführungsplan für sparksql

https://www.cnblogs.com/johnny666888/p/12343338.html

RDD, Datame, Der Unterschied zwischen

DataFrame kennt nur das Feld, aber nicht den Typ des Felds. Wenn Sie diese Vorgänge ausführen, können Sie nicht überprüfen, ob der Typ beim Kompilieren fehlschlägt. Sie können beispielsweise einen String subtrahieren und während der Ausführung einen Fehler melden. Und DataSet kennt nicht nur das Feld, sondern auch den Feldtyp, sodass eine strengere Fehlerprüfung durchgeführt wird. Genau wie die Analogie zwischen JSON-Objekten und Klassenobjekten.
https://www.pianshen.com/article/273498711/

spark codegen

https://zhuanlan.zhihu.com/p/92725597

Ich denke du magst

Origin blog.csdn.net/ytp552200ytp/article/details/108658409
Empfohlen
Rangfolge