2016-12-12 13 views
0

私の大学の一部のマシン(Linux Fedora 25を実行しているすべてのマシン)にHadoop YARNクラスタを設定しました。 YARNでmapreduceジョブを実行すると、私は別のプログラムに行う呼び出しの出力を受け取ることができません。興味深いことに、自分の仕事をローカルで実行すると(mapred-site.xmlで設定されています)、プログラムを呼び出してその出力を受け取る方法はうまくいきます。以下は私のexecuteShellCommandクラスです。これはインスタンス化され、最初のマップタスクで使用されます。私は確信して作ったYARNジョブのProcessBuilderからの出力がありません

public class ExecuteShellCommand { 


    public String executeCommand(String command) { 

     StringBuffer output = new StringBuffer(); 
     Process p; 
     try { 
      String [] args = command.split(" "); 
      String cmd = args[0]; 
      ProcessBuilder pb = new ProcessBuilder().command(cmd, args[1], args[2], args[3], args[4], args[5], args[6], args[7]).directory(new File("path to executable")); 
      p = pb.start(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); 
      p.waitFor(); 
      String line = ""; 
      while ((line = reader.readLine())!= null) { 
       output.append(line + "\n"); 

      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
      return e.toString(); 
      } 
    return output.toString(); 

    } 

} 

絞り込みを確認する:

1)権限が適切に必要なすべてのファイル/ディレクトリに設定されている

2地図のタスクは、現在のユーザーとして実行されている)(私)、これなし不正アクセス

3)私は、ファイルを受信して​​いないとの問題が例外を見つけていないので、私は呼んでいるプログラムへのパスが正しい

4は、i)をチェックプロセスpの入力/出力ストリーム(入力ストリームは[email protected]として設定され、出力ストリームはnull)

5)使用する必要があるプログラムを呼び出す代わりに、単純な「エコー"コマンドを受信できませんでした。

6)私も

p = Runtime.getRuntime().exec("myCommand") 

を使用して試してみましたが、私はすでに述べたように、私はローカルでジョブを実行するときの結果は完全に、(何も出力を受信して​​いない)

私のexecuteCommandメソッドの機能と同じです私が呼び出すプログラムからの出力を返します。 YARNでのみ問題が発生します。私は、問題が適切なバッファから読み込まないか、ProcessBuilderに発行されたコマンドが実際には決して実行されないことによって引き起こされたと感じています。私はここで何が起こっているのかをデバッグする方法についてかなり困惑しており、どんなヒントも大いに評価されるでしょう!

答えて

0

何時間ものソリューションを試してみた結果、ProcessBuilderで生成されたプロセスからエラーストリームを取得する方法を理解しました。プロセスの作業ディレクトリを設定すると、私が渡していた引数の1つにパスを更新するのを忘れていました。 D'oh !!!

関連する問題