2016-07-27 37 views
0

Ich habe eine Funken-Anwendung. Welches liest Daten von Oracle in Datenrahmen. Dann konvertiere ich es in JavaRDD und SavingAsTExt in hdfs. Ich führe dies auf Garn auf 8-Knoten-Cluster. Wenn ich den Job auf spark-webUI sehe. Ich kann sehen, dass es nur 2 Container und 2 CPUs bekommt.Spark-Job nicht genug Container auf Cluster

Ich lese 5 Tabellen von Oracle. Jeder Tisch hat ungefähr 500 Millionen Reihen. Die Datengröße beträgt etwa 80 GB.

spark-submit --class "oracle.table.join.JoinRdbmsTables" --master yarn --deploy-mode cluster oracleData.jar 

Auch i verwendet:

funkenunterwerfen --Klasse "oracle.table.join.JoinRdbmsTables" --master Garn --deploy-mode-Cluster --num Zieher 40 oracleDataWrite .jar

Ich konnte sehen, dass 40 Container dem Job zugewiesen wurden. Allerdings konnte ich nur 1 aktive Aufgabe auf Web-Ui sehen.

Ich habe eine andere Funkenanwendung. Welches eine 20GB Textdatei lädt, dann mache ich etwas Verarbeitung für Daten und das Speichern in hdfs. Ich kann sehen, dass es mit ungefähr 64 Behältern und CPUs zugewiesen wird.

spark-submit --class "practice.FilterSave" --master yarn --deploy-mode cluster batch-spark-0.0.1-SNAPSHOT-jar-with-dependencies.jar mergedData.json 

Der Unterschied zwischen ihnen ist :: - >> für die zweite Anwendung i sparkJavaContext verwenden, während für die ersten i SqlContext ist mit Daten-Rahmen zu verwenden.

HINWEIS: Ich bekomme keine Fehlermeldung für BEIDE.

Hier ist das Stück Code i 5 Tabelle

Map<String, String> options = new HashMap(); 
options.put("driver", "oracle.jdbc.driver.OracleDriver"); 
options.put("url", "XXXXXXX"); 
options.put("dbtable", "QLRCR2.table1"); 
DataFrame df=sqlcontext.load("jdbc", options); 
//df.show(); 
JavaRDD<Row> rdd=df.javaRDD(); 
rdd.saveAsTextFile("hdfs://path"); 

Map<String, String> options2 = new HashMap(); 
options2.put("driver", "oracle.jdbc.driver.OracleDriver"); 
options2.put("url", "XXXXXXX"); 
options2.put("dbtable", "QLRCR2.table2"); 
DataFrame df2=sqlcontext.load("jdbc", options); 
//df2.show(); 
JavaRDD<Row> rdd2=df2.javaRDD(); 
rdd2.saveAsTextFile("hdfs://path"); 

jede Hilfe :)

Antwort

0

Die Zahl der Testamentsvollstrecker geschätzt wird geladen bin mit, wenn sie auf Garn läuft, indem festgelegt - num-executors N. Beachten Sie, dass dies NICHT bedeutet, dass Sie N Executoren erhalten, nur dass N von Yarn angefordert wird. Der Betrag, den Sie tatsächlich erhalten können, hängt von der Menge der Ressourcen ab, die Sie pro Executor anfordern. Wenn zum Beispiel jeder Knoten 25 GB für Garn (yarn-site.xml yarn.nodemanager.resource.memory-mb) hat und Sie über 8 Knoten verfügen und keine andere Anwendung auf Yarn läuft, ist es sinnvoll, 8 Executoren mit anzufordern ~ 20GB. Beachten Sie, dass zusätzlich zu dem, was Sie mit --executor-memory anfordern, Spark einen Overhead von 10% (den Standard) hinzufügt, so dass Sie nicht nach den ganzen 25 GB fragen können. Mehr oder weniger ähnlich ist --eexecturo-cores (yarn-site.xml yarn.nodemanager.resource.cpu-vcores).

Die zweite Frage, die Menge an Aufgaben in Bezug auf ist eine separate Sache, Check out diese good explanation on how stages are split into tasks

+0

mit Ihnen einverstanden ist. Danke für die Antwort. Allerdings bin ich mir dieser Sache bewusst. Wenn du meine zweite Anwendung in Betracht ziehst, erwähne ich keine num-Executers im Befehl. Es wird basierend auf der Größe der Eingabe zugewiesen. Aber für die erste Anwendung wird es nicht genug und es wird nur 2. Also gab ich eine zufällige Anzahl von Executers. aber der Job wird sequenziell ausgeführt. Ich weiß nicht warum :( –