当我们在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中运行此命令吗?
答案 0 :(得分:0)
yarn-client
和yarn-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
解析通过SparkContext.addFile()添加的文件的路径。