2016-07-27 19 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个。所以我给了一个随机数的执行器。但是这个工作正在顺序运行。我不知道为什么:( –

相关问题