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

时间:2016-04-17 18:50:36

标签: java apache-spark

我用Java写了一个Spark工作。这份工作打包成一个带阴影的罐子并执行:

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,因为维护变得很混乱。

3 个答案:

答案 0 :(得分:9)

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

执行此代码:

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

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

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

答案 1 :(得分:8)

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

答案 2 :(得分:3)

我已经像下面的spark-scala中那样访问了我的资源文件。我已经分享了我的代码,请检查。

List<Widget> _widgetOptions = <Widget>[];