2015-11-24 2 views
6

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.

Antwort

6

Treiberprogramm ist verantwortlich für das Erstellen von SparkContext-, SQLContext- und Planungsaufgaben auf den Worker-Knoten. Es umfasst das Erstellen von logischen und physischen Plänen und das Anwenden von Optimierungen. Dazu muss es Zugriff auf das Datenquellenschema und mögliche weitere Informationen wie Schema oder andere Statistiken haben. Die Implementierungsdetails variieren von Quelle zu Quelle, aber im Allgemeinen bedeutet dies, dass Daten auf allen Knoten, einschließlich Anwendungs-Master, zugänglich sein sollten.

Am Ende des Tages sind Ihre Erwartungen fast richtig. Chunks der Daten werden einzeln auf jedem Worker abgerufen, ohne das Treiberprogramm durchlaufen zu müssen. Der Treiber muss jedoch in der Lage sein, eine Verbindung zu Cassandra herzustellen, um die erforderlichen Metadaten abzurufen.

+2

In diesem Fall sind es die Metadaten über den Token-Bereich und wie er zwischen Knoten +1 aufgeteilt ist – RussS

Verwandte Themen