2016-04-17 23 views
5

我用Java編寫了一個Spark作業。這項工作被打包爲一個陰影罐子和執行:Java中的Spark作業:如何在羣集上運行時訪問「resources」中的文件

spark-submit my-jar.jar 

在代碼中,有駐留在src/main/resources/templates一些文件(Freemarker的模板)。當本地運行,我能夠訪問的文件:

File[] files = new File("src/main/resources/templates/").listFiles(); 

當作業在集羣上運行,執行前一行時,返回一個空指針異常。

如果我跑jar tf my-jar.jar我可以看到文件被封裝在一個文件夾templates/

[...] 
templates/ 
templates/my_template.ftl 
[...] 

我只是無法閱讀;我懷疑.listFiles()嘗試訪問羣集節點上的本地文件系統,並且這些文件不在那裏。

我很想知道我應該如何打包文件以在自包含的Spark作業中使用。我寧願不在工作之外將它們複製到HDFS,因爲它維護起來很麻煩。

+0

你能告訴你的主人是什麼嗎?以及您正在使用的部署模式? – user1314742

回答

4

似乎在Spark上運行Scala(2.11)代碼不支持在帶陰影的jar中訪問資源。

執行此代碼:

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

打印時星火之外運行的預期字符串。

在Spark中運行時,會引發java.lang.NullPointerException,因爲路徑爲空。

+0

getResourceAsStream()似乎適用於我,但不是getResource()。 – Ted

相關問題