来自纱线群集模式的Spark-submit抛出错误

时间:2017-04-05 11:29:56

标签: apache-spark

当我们在yarn-cluster上提交spark作业时,我们如何将配置文件传递给执行者?

如果我将我的以下spark-submit命令更改为 - master yarn-client ,那么它可以正常工作,我得到各自的输出

 spark-submit\
 --files /home/cloudera/conf/omega.config \
 --class com.mdm.InitProcess \
 --master yarn-cluster \
 --num-executors 7 \
 --executor-memory 1024M  \
 /home/cloudera/Omega.jar \  
 /home/cloudera/conf/omega.config

我的火花代码:

 object InitProcess
  {
      def main(args: Array[String]): Unit = {
           val config_loc = args(0)
           val config = ConfigFactory.parseFile(new File(config_loc ))
           val jobName =config.getString("job_name")


      .....
      }

  }

我收到以下错误

17/04/05 12:01:39 ERROR yarn.ApplicationMaster: User class threw exception:     com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'job_name'
com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'job_name'

有人可以帮助我在--master yarn-cluster中运行此命令吗?

1 个答案:

答案 0 :(得分:0)

yarn-clientyarn-cluster之间的区别在于yarn-client中的驱动程序位置位于运行spark-submit命令的计算机上。

在您的情况下,配置文件的位置为/home/cloudera/conf/omega.config,当您从当前计算机运行驱动程序时,可以在yarn-client运行时找到该文件的位置这个完整/路径/到/文件。

但无法在yarn-cluster模式下访问,因为驱动程序正在其他主机上运行,​​而该主机并不保存此完整/路径/到/文件。

我建议按以下格式执行命令:

spark-submit\
 --master yarn-cluster \
 --num-executors 7 \
 --executor-memory 1024M  \
 --class com.mdm.InitProcess \
 --files /home/cloudera/conf/omega.config \
 --jar /home/cloudera/Omega.jar omega.config 

使用带有完整路径名的--files发送配置文件,并将其作为参数提供给jar文件名(不是完整路径),因为文件将被下载到工作者的未知位置。

在您的代码中,您可以使用SparkFiles.get(filename)来获取下载文件的实际完整路径名

您的代码更改应类似于:

       val config_loc = SparkFiles.get(args(0))
  

SparkFiles docs

     

公共类 SparkFiles

     

解析通过SparkContext.addFile()添加的文件的路径。