【问题标题】:Spark job in Java: how to access files from 'resources' when run on a clusterJava中的Spark作业:在集群上运行时如何从“资源”访问文件
【发布时间】:2020-03-13 01:59:10
【问题描述】:

我用 Java 编写了一个 Spark 作业。作业被打包为带阴影的 jar 并执行:

spark-submit my-jar.jar

在代码中,有一些文件(Freemarker 模板)位于src/main/resources/templates。在本地运行时,我可以访问文件:

File[] files = new File("src/main/resources/templates/").listFiles();

作业在集群上运行时,执行上一行时返回空指针异常。

如果我运行jar tf my-jar.jar,我可以看到文件打包在templates/ 文件夹中:

 [...]
 templates/
 templates/my_template.ftl
 [...]

我只是无法阅读它们;我怀疑.listFiles() 试图访问集群节点上的本地文件系统,但文件不存在。

我很想知道我应该如何打包文件以在独立的 Spark 作业中使用。我宁愿不在工作之外将它们复制到 HDFS,因为维护起来很麻烦。

【问题讨论】:

  • 你能告诉你的主人是什么吗?以及您使用的是哪种部署模式?

标签: java apache-spark


【解决方案1】:

您现有的代码将它们引用为未打包并发送到 Spark 节点的文件。但是,由于它们在您的 jar 文件中,您应该可以通过 Foo.getClass().getResourceAsStream("/templates/my_template_ftl") 引用它们。有关 Java 资源流的更多信息:http://www.javaworld.com/article/2077352/java-se/smartly-load-your-properties.html

【讨论】:

    【解决方案2】:

    在 Spark 上运行 Scala (2.11) 代码似乎不支持访问阴影 jar 中的资源。

    执行此代码:

    var path = getClass.getResource(fileName)
    println("#### Resource: " + path.getPath())
    

    在 Spark 之外运行时打印预期的字符串。

    在 Spark 中运行时,会引发 java.lang.NullPointerException,因为路径为空。

    【讨论】:

    • getResourceAsStream() 似乎对我有用,但不是 getResource()。
    【解决方案3】:

    我在 spark-scala 中访问了如下所示的资源文件。我已经分享了我的代码,请检查。

    val fs=this.getClass().getClassLoader().getResourceAsStream("smoke_test/loadhadoop.txt")
    
    val dataString=scala.io.Source.fromInputStream(fs).mkString
    

    【讨论】:

      猜你喜欢
      • 2019-10-27
      • 2015-04-25
      • 2021-05-10
      • 2017-02-25
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-30
      相关资源
      最近更新 更多