【问题标题】:Spark job not getting Enough Containers on clusterSpark 作业没有在集群上获得足够的容器
【发布时间】:2016-07-27 21:42:42
【问题描述】:

我有一个 spark 应用程序。它将数据从 oracle 读取到数据帧中。然后我将其转换为 javaRDD 并将 AsTText 保存为 hdfs。 我在 8 节点集群上的 yarn 上运行它。当我在 spark-webUI 上看到工作时。我可以看到它只有 2 个容器和 2 个 cpu。

我正在从 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" --master yarn --deploy-mode cluster --num-executors 40 oracleDataWrite.jar

我可以看到 40 个容器被分配到工作中。但是,我只能在 web-ui 上看到 1 个活动任务

我有另一个 spark 应用程序。它正在加载一个 20GB 的文本文件,然后我正在对数据进行一些处理并保存到 hdfs。我可以看到它被分配了大约 64 个容器和 CPU。

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

任何帮助将不胜感激:)

【问题讨论】:

    标签: java apache-spark hadoop-yarn spark-dataframe


    【解决方案1】:

    通过设置 --num-executors N 来设置在 yarn 上运行时的执行器数量。请注意,这并不意味着您将获得 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

    【讨论】:

    • 同意你的看法。感谢您的回答。但是,我知道这件事。如果您考虑我的第二个应用程序,那么我没有在命令中提及任何 num-executers。它根据输入的大小进行分配。但是对于第一个应用程序,它还不够,它只有 2 个。所以我给了一个随机数量的执行器。但这项工作是按顺序运行的。我不知道为什么:(
    猜你喜欢
    • 2015-08-20
    • 1970-01-01
    • 2023-03-13
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    相关资源
    最近更新 更多