【问题标题】:Submit Spark with additional input提交带有额外输入的 Spark
【发布时间】:2014-08-10 12:53:48
【问题描述】:

我使用 Spark 构建了一个机器学习管道,该管道将作业 XML 文件作为输入,用户可以在其中指定数据、特征、模型及其参数。使用这个作业 XML 输入文件的原因是用户可以简单地修改他们的 XML 文件来配置管道,而不需要从源代码重新编译。但是,目前 Spark 作业通常被打包成一个 uber-Jar 文件,并且在将作业提交给 YARN 时似乎没有办法提供额外的 XML 输入。

我想知道是否有任何解决方案或替代方案?

【问题讨论】:

    标签: apache-spark hadoop-yarn


    【解决方案1】:

    我会查看Spark-JobServer 您可以使用它将您的作业连同配置一起提交到 Spark 集群。您可能必须将您的 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"
      }
    }
    

    【讨论】:

    • 您还可以使用NamedRDD 功能“缓存”RDD,这对于将预先计算的模型保存在内存中然后对它们运行查询非常有用。如果您发现问题已得到解答,请不要忘记接受并关闭问题。
    【解决方案2】:

    如果您希望将 xml 文件与 jar 捆绑在一起,则应使用资源目录来放置该 xml 文件。这是基本的 Java/Scala 事物。

    建议阅读:Get a resource using getResource()

    在不重建 jar 的情况下替换 jar 中的 xml:How do I update one file in a jar without repackaging the whole jar?

    【讨论】:

    • 当然,如果xml文件是在Maven构建之前创建的,那么绝对可以将它们包含在资源目录中。但是这里我想避免再次构建:作为管道的用户,我只想在运行时使用XML来指定要使用的组件及其属性,而我不想在我想指定的时候重新构建jar文件一个 XML。
    • 公平点,我已经更新了我的答案以解决您的问题。我认为更新 jar 文件只需几行 bash。
    • 那也是一个不错的文件。因此,与其在运行时动态指定文件,不如使用静态文件并用 bash 包装。这样每次在提交作业之前,都使用 bash 脚本来替换文件。谢谢。
    【解决方案3】:

    我用来解决这个问题的最终解决方案是:

    1. 将 XML 文件存储在 HDFS 中,

    2. 传入XML文件的文件位置,

    3. 使用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)) }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-31
      • 2019-07-10
      • 1970-01-01
      • 2014-08-18
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      相关资源
      最近更新 更多