我编写了一个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显示正确的执行者信息:
但在使用(master=yarn
&amp; deploy-mode=cluster
)
我的Spark UI显示错误的执行程序信息(~512 MB而不是~1400 MB):
在客户端模式下运行时,我的应用名称等于Test App Name
,但在群集模式下运行时,我的应用名称为spark.MyApp
。但是,在群集模式下运行时,似乎会采用某些默认设置。我在这做错了什么?如何为群集模式进行这些设置?
我在由YARN管理的HDP 2.5群集上使用Spark 1.6.2。
答案 0 :(得分:9)
因此,当您在独立模式中运行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.cores
和spark.driver.memory
属性!您必须在SparkConf
实例中使用相应的AM属性:
spark.yarn.am.cores
spark.yarn.am.memory
spark-submit
参数设置这些AM属性!spark.executor.cores
spark.executor.memory
和SparkConf
--executor-cores
executor-memory
和spark-submit
参数
SparkConf
设置会覆盖spark-submit
参数值!这是我的笔记的文字形式:
希望我可以帮助其他人... ...
答案 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
案例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中写入。