Spark工作没有在集群上获得足够的容器

时间:2016-07-27 07:01:52

标签: java apache-spark yarn spark-dataframe

我有一个火花应用程序。这是从oracle读取数据到数据帧。然后我将其转换为javaRDD和savingAsTExt转换为hdfs。 我在8节点集群上的纱线上运行它。当我在spark-webUI上看到这份工作时。我可以看到它只有2个容器和2个cpus。

我正在从oracle阅读5个表。每个表都有大约5亿行。数据大小约为80GB。

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

我也用过:

  

spark-submit --class" oracle.table.join.JoinRdbmsTables" - 主   yarn --deploy-mode cluster --num-executors 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

它们之间的区别是:: - >>对于第二个应用程序,我使用sparkJavaContext,而对于第一个我使用SQLContext来使用数据框架。

注意:我并没有因此而出现任何错误。

这是我用来加载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"); 

任何帮助将不胜感激:)

1 个答案:

答案 0 :(得分:0)

通过设置--num-executors N来设置在纱线上运行时执行程序的数量。请注意,这并不意味着您将获得N个执行程序,只会从Yarn请求N.实际获得的金额取决于您为每个执行者请求的资源量。例如,如果每个节点有25GB专用于Yarn(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