Ich versuche, einige XML-Daten, die in einer JMS-Warteschlange (QPID) empfangen werden, mithilfe von Spark Streaming zu verarbeiten. Nachdem ich xml als DStream erhalten habe wandle ich sie in Dataframes um, damit ich sie mit einigen meiner statischen Daten in Form von bereits geladenen Dataframes verbinden kann. Aber nach API-Dokumentation für foreachRdd-Methode auf DStream: es auf Treiber ausgeführt wird, so bedeutet dies, dass alle Verarbeitungslogik nur auf Treiber ausgeführt wird und nicht an Worker/Executoren verteilt werden.Wird foreachRDD auf dem Treiber ausgeführt?
API Dokumentation
foreachRDD(func)
Der generische Ausgabe Operator, der eine Funktion gilt, func, jeden RDD aus dem Strom erzeugt wird. Diese Funktion sollte die Daten in jeder RDD zu einem externen System schieben, wie zum Beispiel die RDD in Dateien speichern oder über das Netzwerk in eine Datenbank schreiben. Hinweis , dass die Funktion func im Treiberprozess unter der Streaming-Anwendung ausgeführt wird, und in der Regel RDD-Aktionen darin haben, dass die Berechnung der Streaming-RDDs erzwingen wird.
Nun, das ist so verwirrend "Nein, die Funktion selbst läuft auf dem Treiber, aber vergiss nicht, dass sie auf einem RDD arbeitet", nehme an, dass "rdd.foreRADD (func)" aufgerufen wird, und diese "func" -Funktion schreibt Daten über a in eine Redis global var 'redisis_client', dh' func' bezieht sich auf 'redis_client', also Q ist: wird irgendeine Ausnahme in 'foreachRDD'-Aufruf ausgelöst, da' redis_client' nicht serialisierbar ist. – avocado
@loganecolss Ich stimme zu, die Semantik der Ausführung ist kompliziert. 'rdd.foreachRDD' führt' func' auf den Executoren aus. Wenn 'func' * den' redis_client' durch Schließen erfasst, erhalten Sie eine 'TaskNotSerializable' Ausnahme. Wenn die Instanz von 'redis_client' in 'func' zugewiesen ist, ist alles in Ordnung. –
@YuvalItzchakov Zitieren Sie Ihren Kommentar: _rdd.foreachRDD führt func auf den Executoren aus._ Aus der [docs] (https://spark.apache.org/docs/latest/streaming-programming-guide.html#output- operations-on-dstreams), führt "foreachRDD" 'func' auf dem ** Driver ** aus. 'foreach',' foreachPartition' läuft jedoch auf ** Executors **. –