如果我有一个用setMaster("local")
编译的 Spark 作业 (2.2.0(,如果我使用spark-submit --master yarn --deploy-mode cluster
发送该作业会发生什么?
我尝试了这个,看起来作业确实被打包并在 YARN 集群上而不是在本地执行。
我不清楚的是:
-
为什么会这样? 根据文档,您在
SparkConf
中设置的内容明确优先于从命令行或通过spark-submit
传入的内容(请参阅:https://spark.apache.org/docs/latest/configuration.html(。 这是否不同,因为我正在使用SparkSession.getBuilder
? -
将
setMaster("local")
留在代码中与删除代码有什么不太明显的影响吗? 我想知道我所看到的是否类似于在群集内以本地模式运行的作业,而不是正确使用群集资源。
这是因为将您的应用程序提交给 Yarn 发生在SparkConf.setMaster
之前。
当你使用--master yarn --deploy-mode cluster
时,Spark 会在你的本地机器上运行它的 main 方法,并上传 jar 在 Yarn 上运行。Yarn 将分配一个容器作为应用程序主节点来运行 Spark 驱动程序,也就是您的代码。SparkConf.setMaster("local")
在 Yarn 容器内运行,然后创建在本地模式下运行的 SparkContext,并且不使用 Yarn 群集资源。
我建议不要在你的代码中设置master。只需使用命令行--master
或MASTER
env即可指定Spark主节点。
如果我有一个使用 setMaster("local"( 编译的 Spark 作业 (2.2.0(,如果我使用 spark-submit --master yarn --部署模式集群发送该作业会发生什么
setMaster
具有最高优先级,因此排除了其他选项。
我的建议:不要使用这个(除非你说服我错了 - :)感到挑战(
这就是为什么我强烈主张尽早并经常使用spark-submit
。它默认为local[*]
并且做得很好。它甚至在最新版本的 Spark 中得到了改进,它添加了一个漂亮的应用程序名称(又名appName
(,因此您不必设置它(甚至......请不要。。。硬核它(。
鉴于我们正处于Spark 2.2天,Spark SQL是Spark中所有好东西的入口点,你应该始终从SparkSession
开始(忘记SparkConf
或SparkContext
太低级(。
我知道何时可以在Spark应用程序中setMaster
的唯一原因是当您想在IDE中运行该应用程序时(例如IntelliJ IDEA(。如果没有setMaster
您将无法运行该应用程序。
解决方法是对源使用src/test/scala
(在 sbt 中(,并使用带有将执行主应用程序的setMaster
启动器。