运行 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 管理。
好的,我想我找到问题了!简而言之:在 Standalone 和 YARN-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.cores
和 spark.driver.memory
属性!您必须在 SparkConf
实例中使用相应的 AM 属性:
spark.yarn.am.cores
spark.yarn.am.memory
- 您不能通过
spark-submit
参数设置这些 AM 属性!
- 要在 yarn-client 模式下设置执行程序资源,您可以使用
spark.executor.cores
和 spark.executor.memory
在 SparkConf
--executor-cores
和 executor-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 中写入的。
我编写了一个 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 管理。
好的,我想我找到问题了!简而言之:在 Standalone 和 YARN-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.cores
和spark.driver.memory
属性!您必须在SparkConf
实例中使用相应的 AM 属性:spark.yarn.am.cores
spark.yarn.am.memory
- 您不能通过
spark-submit
参数设置这些 AM 属性!
- 要在 yarn-client 模式下设置执行程序资源,您可以使用
spark.executor.cores
和spark.executor.memory
在SparkConf
--executor-cores
和executor-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 中写入的。