带有显式 setMaster( "local" 的 Spark job ,使用 YARN 传递给 spark-submit



如果我有一个用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。只需使用命令行--masterMASTERenv即可指定Spark主节点。

如果我有一个使用 setMaster("local"( 编译的 Spark 作业 (2.2.0(,如果我使用 spark-submit --master yarn --部署模式集群发送该作业会发生什么

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启动器。

最新更新