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

12

我用Java编写了一个Spark作业,将其打包成shaded 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,因为这会变得混乱难维护。


你能告诉我你使用的主节点是什么,以及使用的部署模式是哪种吗? - user1314742
3个回答

13

11

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

执行此代码:

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

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

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


2
{btsdaf} - Ted

4

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

val fs=this.getClass().getClassLoader().getResourceAsStream("smoke_test/loadhadoop.txt")

val dataString=scala.io.Source.fromInputStream(fs).mkString

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接