我使用Spark构建了一个机器学习管道,它将一个作业XML文件作为输入,用户可以在其中指定数据,功能,模型及其参数。使用此作业XML输入文件的原因是用户可以简单地修改其XML文件以配置管道,而无需从源代码重新编译。但是,目前Spark作业通常打包到一个uber-Jar文件中,当作业提交给YARN时,似乎无法提供额外的XML输入。
我想知道是否有任何解决方案或替代品?
答案 0 :(得分:1)
我查看Spark-JobServer您可以使用它将您的作业与配置一起提交给Spark Cluster。您可能必须使您的XML适应配置使用的JSON格式,或者以某种方式封装它。
以下是有关如何提交作业+配置的示例:
curl -d "input.string = a b c a b see" 'localhost:8090/jobs?appName=test&classPath=spark.jobserver.WordCountExample'
{
"status": "STARTED",
"result": {
"jobId": "5453779a-f004-45fc-a11d-a39dae0f9bf4",
"context": "b7ea0eb5-spark.jobserver.WordCountExample"
}
}
答案 1 :(得分:0)
如果要将xml文件与jar捆绑在一起,则应使用resources目录放置xml文件。这是一个基本的Java / Scala事物。
建议阅读:Get a resource using getResource()
要替换jar中的xml而不重建jar:How do I update one file in a jar without repackaging the whole jar?
答案 2 :(得分:0)
我用来解决这个问题的最终解决方案是:
将XML文件存储在HDFS中,
传入XML文件的文件位置
使用InputStreamHDFS
直接从HDFS读取:
val hadoopConf = sc.hadoopConfiguration
val jobfileIn:Option[InputStream] = inputStreamHDFS(hadoopConf, filename)
if (jobfileIn.isDefined) {
logger.info("Job file found in file system: " + filename)
xml = Some(XML.load(jobfileIn.get))
}