使用显式setMaster(“local”)的Spark作业,通过YARN传递给spark-submit

时间:2017-07-22 02:26:02

标签: apache-spark

如果我有使用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")与删除代码有什么不太明显的影响?我想知道我所看到的是在集群内以本地模式运行的作业,而不是正确使用集群资源。

2 个答案:

答案 0 :(得分:3)

这是因为将您的申请提交给纱线发生在SparkConf.setMaster之前。

当您使用--master yarn --deploy-mode cluster时,Spark将在您的本地计算机上运行其main方法并上传jar以在Yarn上运行。纱线将分配一个容器作为应用程序主机来运行Spark驱动程序,a.k.a,您的代码。 SparkConf.setMaster("local")在Yarn容器内运行,然后创建以本地模式运行的SparkContext,并且不使用Yarn群集资源。

我建议不在代码中设置master。只需使用命令行--masterMASTER 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开头(忘记SparkConfSparkContext为太低级了。)

我知道你何时可以在Spark应用程序中拥有setMaster的唯一原因是你想在IDE中运行应用程序(例如IntelliJ IDEA)。如果没有setMaster,您将无法运行该应用程序。

解决方法是使用src/test/scala作为源(在sbt中)并使用将执行主应用程序的setMaster启动器。