Ich denke, ich bin noch nicht vollständig verstehen, wie Spark funktioniert.Apache Spark: Treiber (statt nur die Executors) versucht, eine Verbindung zu Cassandra
Hier ist mein Setup:
Ich bin eine Spark-Cluster im Standalone-Modus ausgeführt wird. Ich benutze 4 Maschinen dafür: Einer ist der Meister, die anderen drei sind Arbeiter.
Ich habe eine Anwendung geschrieben, die Daten aus einem Cassandra-Cluster liest (siehe https://github.com/journeymonitor/analyze/blob/master/spark/src/main/scala/SparkApp.scala#L118).
Der Cassandra-Cluster mit 3 Knoten wird auf denselben Computern ausgeführt, die auch die Spark Worker-Knoten hosten. Der Spark-Master-Knoten keinen Cassandra Knoten ausgeführt:
Machine 1 Machine 2 Machine 3 Machine 4
Spark Master Spark Worker Spark Worker Spark Worker
Cassandra node Cassandra node Cassandra node
Die Überlegung dahinter ist, dass ich möchte Datenlokalität optimieren - wenn meine Spark-App auf dem Cluster ausgeführt wird, jeder Arbeiter braucht nur an seinen lokalen Cassandra zu sprechen Knoten.
Nun, wenn mein Spark-App zum Cluster Einreichung von spark-submit --deploy-mode client --master spark://machine-1
von Maschine 1 (der Spark-Master) ausgeführt wird, erwarte ich, dass die folgenden:
- eine Treiber-Instanz auf dem Spark-Meister gestartet
- die Treiber startet ein Executor auf jeder Funken Worker
- die Fahrer verteilt meine Anwendung auf jedem Executor
- meine Anwendung auf jedem Executor läuft und von dort, spricht mit Cassandra über
127.0.0.1:9042
Dies scheint jedoch nicht der Fall zu sein. Stattdessen versucht der Spark-Master, mit Cassandra zu sprechen (und scheitert, weil auf dem Rechner von Maschine 1 kein Cassandra-Knoten vorhanden ist).
Was habe ich falsch verstanden? Funktioniert es anders? Liest der Treiber tatsächlich die Daten von Cassandra und verteilt die Daten an die Executors? Aber dann konnte ich nie Daten größer als memory of Machine 1
lesen, auch wenn der Gesamtspeicher meines Clusters ausreichend ist.
Oder spricht der Treiber mit Cassandra, um keine Daten zu lesen, sondern um herauszufinden, wie die Daten partitioniert werden, und weist die Executors an, "ihren" Teil der Daten zu lesen?
Wenn jemand mich erleuchten kann, würde das sehr geschätzt werden.
In diesem Fall sind es die Metadaten über den Token-Bereich und wie er zwischen Knoten +1 aufgeteilt ist – RussS