Java中的Spark作业:如何在群集上运行时从"资源"访问文件

Ale*_*ord 8 java apache-spark

我用Java写了一个Spark工作.该作业打包为阴影jar并执行:

spark-submit my-jar.jar
Run Code Online (Sandbox Code Playgroud)

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

File[] files = new File("src/main/resources/templates/").listFiles();
Run Code Online (Sandbox Code Playgroud)

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

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

 [...]
 templates/
 templates/my_template.ftl
 [...]
Run Code Online (Sandbox Code Playgroud)

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

我很想知道如何打包要在自包含的Spark作业中使用的文件.我不想在工作之外将它们复制到HDFS,因为维护变得很麻烦.

Oli*_*ain 10

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


Cra*_*son 10

似乎在Spark上运行Scala(2.11)代码不支持访问着色jar中的资源.

执行此代码:

var path = getClass.getResource(fileName)
println("#### Resource: " + path.getPath())
Run Code Online (Sandbox Code Playgroud)

在Spark外部运行时打印预期的字符串.

在Spark中运行时,java.lang.NullPointerException会引发a ,因为path为null.

  • getResourceAsStream()似乎对我有用,但getResource()却不行。 (2认同)