0

Tomcat を使用した動的 Web プロジェクトがあります (hadoop がインストールされています)。ユーザーが Web サイトを介して Hadoop アプリケーションの引数を定義できるようにしたいと考えています。サーバー上で、提供されたクエリ引数を使用して、hadoop を介して jar を実行します。基本的に、サーバーで次のコマンドを実行します。

hadoop jar query.jar query

Hadoop のため、動的 Web プロジェクトで query.jar のメソッドを直接使用することはできません。したがって、サーバーがcmdで上記のコマンドを実行するようにしたいだけです。サーバーの WEB-INF/lib フォルダーに query.jar を配置しました。サーブレットで次のコードを試しました。

String query = request.getParameter("query");
    String execute = "hadoop jar WEB-INF/lib/query.jar " + query;
    Process process = Runtime.getRuntime().exec(execute);
    try {
        process.waitFor();
    } catch (InterruptedException ex) {
        System.out.print("Error running jar");
    }
    System.out.print("Execution Successful");

そして、常に「Execution Successful」を取得しますが、サーバー上で Hadoop ジョブが実行されることはありません。実行文字列で指定した query.jar へのパスは正しいですか? 他に間違いはありますか?

4

1 に答える 1

0

取得したからExecution Successfulといって、正しく実行されたとは限りません。コードを次のように変更します。

String query = sanitize(request.getParameter("query"));
String hadoopHome = System.getenv("HADOOP_HOME");
if(hadoopHome == null) {
    hadoopHome = "<ABSOLUTE PATH TO HADOOP>";
}
String execute = hadoopHome + "/bin/hadoop jar <ABSOLUTE PATH TO>/query.jar <Class Name> " + query;
Process process = Runtime.getRuntime().exec(execute);
int i = -1;
try {
    i = process.waitFor();
} catch (InterruptedException ex) {
    System.out.print("Error running jar");
}
if(i == 0) {
    System.out.print("Execution Successful");
} else {
    System.out.print("Error running jar");
}

これはサーバー側で実行されるため、メソッドsanitizeは悪意のあるコードを削除する必要があります。

于 2013-02-22T13:12:20.707 に答える