![](/img/trans.png)
[英]How to submit spark job from within java program to standalone spark cluster without using spark-submit?
[英]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.