如果我有使用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")
与删除代码有什么不太明显的影响?我想知道我所看到的是在集群内以本地模式运行的作业,而不是正确使用集群资源。
答案 0 :(得分:3)
这是因为将您的申请提交给纱线发生在SparkConf.setMaster
之前。
当您使用--master yarn --deploy-mode cluster
时,Spark将在您的本地计算机上运行其main方法并上传jar以在Yarn上运行。纱线将分配一个容器作为应用程序主机来运行Spark驱动程序,a.k.a,您的代码。 SparkConf.setMaster("local")
在Yarn容器内运行,然后创建以本地模式运行的SparkContext,并且不使用Yarn群集资源。
我建议不在代码中设置master。只需使用命令行--master
或MASTER
env指定Spark主控。
答案 1 :(得分:1)
如果我有使用setMaster(“local”)编译的Spark作业(2.2.0),如果我使用spark-submit发送该作业将会发生什么--master yarn-deploy-mode cluster
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
启动器。