繁体   English   中英

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

[英]Spark job in Java: how to access files from 'resources' when run on a cluster

我用 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,因为维护起来会很麻烦。

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

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

执行这段代码:

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM