2016-07-27 50 views
0

我有一個火花應用程序。這是從oracle讀取數據到數據框中的數據。然後我將它轉換成javaRDD並將其保存爲hdfs。 我在8節點集羣上運行這個紗線。當我在spark-webUI上看到這個工作時。我可以看到它只有2個容器和2個cpus。Spark工作沒有得到足夠的集羣容器

我正在閱讀oracle的5個表。每張桌子有大約5億行。數據大小約爲80GB。

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

此外,我使用:

火花提交--class 「oracle.table.join.JoinRdbmsTables」 --master 紗線--deploy模式集羣--num-執行人40 oracleDataWrite .jar

我可以看到40個容器被分配到工作。但是,我只能在web-ui上看到1活動任務

我有另一個火花應用程序。這是加載一個20GB的文本文件,然後我正在做一些數據處理和保存到hdfs。我可以看到它分配了大約64個容器和cpus。

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

它們之間的區別是:: - >>因爲我而對於第一我使用SQLContext使用數據幀使用sparkJavaContext第二應用。

注意:我沒有得到兩個任何錯誤。

這裏是一段代碼我使用加載5表

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"); 

任何幫助將不勝感激:)

回答

0

當上紗運行是通過設置設定執行人的數目 - num-executors N.注意,這並不意味着你會得到N個執行者,只有N將被要求從紗線。您實際獲得的金額取決於您爲每個執行者請求的資源數量。例如,如果每個節點都有專用於Yarn的25GB(yarn-site.xml yarn.nodemanager.resource.memory-mb),並且您有8個節點,並且Yarn上沒有其他應用程序正在運行,那麼請求8個執行程序〜20GB。請注意,除了使用--executor-memory請求的內容之外,Spark還會增加10%的開銷(默認值),因此您無法要求整個25GB。或多或少類似於--execturo-cores(yarn-site.xml yarn.nodemanager.resource.cpu-vcores)。

關於任務量的第二個問題是一個獨立的東西, 退房這個good explanation on how stages are split into tasks

+0

同意你的觀點。 Thanx回答。但是,我知道這件事。如果你考慮我的第二個應用程序,那麼我沒有提到任何命令中的num-executers。它根據輸入的大小分配。但是對於第一個應用程序來說,它並沒有得到足夠的收益,只有2個。所以我給了一個隨機數的執行器。但是這個工作正在順序運行。我不知道爲什麼:( –

相關問題