2016-12-08 4 views
0

Javaラッパープログラムから糸ジョブを実行しようとしています。ProcessBuilderを使用してJavaプログラムからヤーンジョブを実行するとファイルが存在しませんエラー

  1. ヘッダファイル:その場所で、私は、ファイルの名前が、場所とファイル拡張子を知らないと、ファイルは1つだけあります
  2. 入力ファイルのディレクトリ
のMapReduceジャーは、2つの入力をとり

これら以外にも、出力ディレクトリがあります。 ProcessBuilderをコードは次のようになります。実行時には

HEADER_PATH = INPUT_DIRECTORY+"/HEADER/*.tsv"; 
INPUT_FILES = INPUT_DIRECTORY+"/DATA/"; 
OUTPUT_DIRECTORY = OUTPUT_DIRECTORY+"/"; 

ProcessBuilder mapRProcessBuilder = new ProcessBuilder("yarn","jar",JAR_LOCATION,"-Dmapred.job.queue.name=name","-Dmapred.reduce.tasks=500",HEADER_PATH,INPUT_DIRECTORY,OUTPUT_DIRECTORY); 
System.out.println(mapRProcessBuilder.command().toString()); 
Process mapRProcess = mapRProcessBuilder.start(); 

、私は次のエラーを取得:

Exception in thread "main" java.io.FileNotFoundException: Requested file /input/path/dir1/HEADER/*.tsv does not exist.

をしかし、私は同じコマンドを実行すると:

yarn jar jarfile.jar -Dmapred.job.queue.name=name -Dmapred.reduce.tasks=500 /input/path/dir1/HEADER/*.tsv /input/Dir /output/Dir/ 

それはすべて正常に動作します。

Javaからコマンドを実行しているときに何が問題になるのですか?

答えて

1

*は、ワイルドカードではなくリテラル文字列の一部として扱われています。したがって、グロビングは希望のパス名に展開されていません。ディレクトリ内のファイルは1つだけ存在する場合

、なぜあなたはそのパスが何であるかを見つけると、引数の代わりに

などとして、それに合格しません。

File dir = new File(INPUT_DIRECTORY+"/HEADER); 
if (dir.list().length > 0) 
    String HEADER_PATH = dir.list()[0].getAbsolutePath(); 
+0

これは意味があります。実際には、ヘッダファイルのハードコーディングされたフルパスを提供することによっても、同じエラーを出していましたが、いくつかのリテラル値がjavaから渡されている可能性があります。あなたの提案は役に立ちます!ありがとう! – A8H1

関連する問題