在YARN上以群集模式运行Spark应用时未使用SparkConf设置

时间:2017-05-04 13:49:19

标签: apache-spark memory-management yarn executor

我编写了一个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&amp; deploy-mode=client)运行此应用程序时

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

一切似乎都运行良好,Spark History UI显示正确的执行者信息: enter image description here

但在使用(master=yarn&amp; deploy-mode=cluster

运行时

我的Spark UI显示错误的执行程序信息(~512 MB而不是~1400 MB): enter image description here

在客户端模式下运行时,我的应用名称等于Test App Name,但在群集模式下运行时,我的应用名称为spark.MyApp。但是,在群集模式下运行时,似乎会采用某些默认设置。我在这做错了什么?如何为群集模式进行这些设置?

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

2 个答案:

答案 0 :(得分:9)

好的,我想我发现了问题!简而言之:在独立 YARN管理模式下运行Spark设置之间存在差异!

因此,当您在独立模式中运行Spark应用程序时,您可以专注于Spark的配置文档,请参阅http://spark.apache.org/docs/1.6.2/configuration.html

您可以将以下设置用于Driver&amp;执行器CPU / RAM(正如文档中所述):

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

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

  • 定位于“Spark on YARN”文档,而不是上面链接的配置文档:http://spark.apache.org/docs/1.6.2/running-on-yarn.html(这里解释的属性优先于配置文档中解释的属性(这似乎是仅描述独立群集与客户端模式,而不是YARN群集与客户端模式!!))

  • 您无法使用SparkConf在纱线群集模式下设置属性!而是使用相应的spark-submit参数:

    • --executor-cores 5
    • --executor-memory 5g
    • --driver-cores 3
    • --driver-memory 3g
  • 在纱线客户端模式下,您无法使用spark.driver.coresspark.driver.memory属性!您必须在SparkConf实例中使用相应的AM属性:

    • spark.yarn.am.cores
    • spark.yarn.am.memory
    • 您无法通过spark-submit参数设置这些AM属性!
  • 要在yarn-client模式下设置执行程序资源,您可以使用
      spark.executor.cores
    • spark.executor.memorySparkConf --executor-cores
    • 中的
    • executor-memoryspark-submit参数
    • 如果同时设置两者,则SparkConf设置会覆盖spark-submit参数值!

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

enter image description here

希望我可以帮助其他人... ...

答案 1 :(得分:2)

再加上D.Müller的回答:

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

我发现驱动程序内存必须在spark提交期间写入,但执行程序内存可以用脚本编写(即SparkConf),应用程序仍然可以工作。

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

  

ERROR yarn.ApplicationMaster:RECEIVED SIGNAL TERM

     

错误yarn.ApplicationMaster:退出状态为143的用户应用程序

案例1: 司机&amp;执行者都用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

Job finished with Failed status Error message Executors summary in Spark UI

案例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

工作以成功状态完成。执行者记忆正确。

Executors summary in Spark UI

案例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

Executors summary in Spark UI

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