簡體   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