运行 Spark 应用程序在 YARN 集群模式下不使用 SparkConf 设置

SparkConf settings not used when running Spark app in cluster mode on YARN

我编写了一个 Spark 应用程序,它通过 SparkConf 实例设置了一些配置内容,如下所示:

SparkConf conf = new SparkConf().setAppName("Test App Name");

conf.set("spark.driver.cores", "1");
conf.set("spark.driver.memory", "1800m");

conf.set("spark.yarn.am.cores", "1");
conf.set("spark.yarn.am.memory", "1800m");

conf.set("spark.executor.instances", "30");
conf.set("spark.executor.cores", "3");
conf.set("spark.executor.memory", "2048m");

JavaSparkContext sc = new JavaSparkContext(conf);

JavaRDD<String> inputRDD = sc.textFile(...);
...

当我 运行 这个应用程序使用命令 (master=yarn & deploy-mode=client)

spark-submit --class spark.MyApp --master yarn --deploy-mode client /home/myuser/application.jar

似乎一切正常,Spark History UI 显示了正确的执行者信息:

但是当 运行将它与 (master=yarn & deploy-mode=cluster)

我的 Spark UI 显示了错误的执行者信息(~512 MB 而不是~1400 MB):

此外,当 运行 在客户端模式下我的应用程序名称等于 Test App Name,但在 运行 集群模式下我的应用程序名称等于 spark.MyApp。然而,在集群模式下 运行ning 似乎采用了一些默认设置。我在这里做错了什么?如何为集群模式进行这些设置?

我在 HDP 2.5 集群上使用 Spark 1.6.2,由 YARN 管理。

好的,我想我找到问题了!简而言之:在 StandaloneYARN-managed 模式下 运行ning Spark 设置之间存在差异!


所以当你运行Spark应用在Standalone模式时,你可以关注Spark的Configuration文档,见http://spark.apache.org/docs/1.6.2/configuration.html

您可以对 Driver & Executor 使用以下设置 CPU/RAM(如文档中所述):

  • spark.executor.cores
  • spark.executor.memory
  • spark.driver.cores
  • spark.driver.memory

但是:当在 YARN 管理的 Hadoop 环境中 运行ning Spark 时,您必须小心以下设置并考虑以下几点:

  • 以 "Spark on YARN" 文档为导向,而不是上面链接的配置文档:http://spark.apache.org/docs/1.6.2/running-on-yarn.html(此处说明的属性比配置文档中说明的属性具有更高的优先级(这里好像只描述了Standalone集群vs.client模式,没有描述YARN集群vs.client模式!!))

  • yarn-cluster模式下不能使用SparkConf设置属性!而是使用相应的 spark-submit 参数:

    • --executor-cores 5
    • --executor-memory 5g
    • --driver-cores 3
    • --driver-memory 3g
  • 在 yarn-client 模式下你不能使用 spark.driver.coresspark.driver.memory 属性!您必须在 SparkConf 实例中使用相应的 AM 属性:

    • spark.yarn.am.cores
    • spark.yarn.am.memory
    • 您不能通过 spark-submit 参数设置这些 AM 属性!
  • 要在 yarn-client 模式下设置执行程序资源,您可以使用
    • spark.executor.coresspark.executor.memorySparkConf
    • --executor-coresexecutor-memory 中的参数 spark-submit
    • 如果两者都设置,SparkConf 设置将覆盖 spark-submit 参数值!

这是我的笔记的文字形式:

希望我可以帮助其他任何人解决这个问题...

补充一下 D.Müller 的回答:

同样的问题发生在我身上,我尝试了一些不同组合的设置。我是 YARN 集群上的 运行 Pypark 2.0.0。

我发现driver-memory必须在spark submit时写入,而executor-memory可以用脚本(即SparkConf)写入,应用程序仍然可以运行。

如果驱动程序内存小于 2g,我的应用程序将死掉。错误是:

ERROR yarn.ApplicationMaster: RECEIVED SIGNAL TERM

ERROR yarn.ApplicationMaster: User application exited with status 143


案例 1: 驱动程序和执行程序都用 SparkConf

编写
spark = (SparkSession
    .builder
    .appName("driver_executor_inside")
    .enableHiveSupport()
    .config("spark.executor.memory","4g")
    .config("spark.executor.cores","2")
    .config("spark.yarn.executor.memoryOverhead","1024")
    .config("spark.driver.memory","2g")
    .getOrCreate())

spark-submit --master yarn --deploy-mode cluster myscript.py


案例 2: - 火花提交中的驱动程序 - 脚本中 SparkConf 中的执行器

spark = (SparkSession
    .builder
    .appName("executor_inside")
    .enableHiveSupport()
    .config("spark.executor.memory","4g")
    .config("spark.executor.cores","2")
    .config("spark.yarn.executor.memoryOverhead","1024")
    .getOrCreate())

spark-submit --master yarn --deploy-mode cluster --conf spark.driver.memory=2g myscript.py

作业已完成,状态为成功。执行器内存正确。


案例 3: - 火花提交中的驱动程序 - 执行者未写

spark = (SparkSession
    .builder
    .appName("executor_not_written")
    .enableHiveSupport()
    .config("spark.executor.cores","2")
    .config("spark.yarn.executor.memoryOverhead","1024")
    .getOrCreate())

spark-submit --master yarn --deploy-mode cluster --conf spark.driver.memory=2g myscript.py

显然未设置执行程序内存。意思是 CASE 2 实际上捕获了执行程序内存设置,尽管它是在 sparkConf 中写入的。