2016-04-17 1 views
5

JavaでSparkジョブを書きました。ジョブが斜線ジャーとしてパッケージ化されて実行される:コードでJavaのスパークジョブ:クラスタ上で実行されたときに 'リソース'からファイルにアクセスする方法

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()がクラスタノードのローカルファイルシステムにアクセスしようとしていると考えています。ファイルはそこにありません。

自己完結したスパークジョブでファイルをどのようにパッケージ化するべきかを知りたいのですが、興味があります。私はむしろHDFSにコピーしないでください。なぜなら、それはメンテナンスが面倒ですから。

+0

あなたのマスターは何ですか?どのモードを使用していますか? – user1314742

答えて

6

あなたの既存のコードはパッケージ化されていないファイルとしてそれらを参照しており、Sparkノードに配送されています。しかし、あなたのjarファイルの中にあるので、Foo.getClass().getResourceAsStream("/templates/my_template_ftl")でそれらを参照できるはずです。 Javaリソースストリームの詳細はこちらhttp://www.javaworld.com/article/2077352/java-se/smartly-load-your-properties.html

4

SparkでScala(2.11)コードを実行すると、影付きのjarファイルのリソースへのアクセスがサポートされていないようです。

このコードを実行:

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

は、Sparkの外で実行予想文字列を出力します。

スパーク内で実行すると、パスがヌルなのでjava.lang.NullPointerExceptionが生成されます。

+0

getResourceAsStream()は私にとってはうまくいくようですが、getResource()では動作しません。 – Ted

関連する問題