0

Java アクションを実行する Oozie ワークフローがあります。Java アクション内で、テーブルのスキーマを取得するために Hive テーブルを記述する必要があります。これを行うには、プロセス ビルダーを使用し、以下を含むシェル スクリプトを実行します。describe table query

私のdescribeTable.sh:

hive -e 'describe <tableName>`

Java コードがこのスクリプトを生成したら、それをローカル FS にコピーし/tmp、次のようにプロセス ビルダーを使用してスクリプトを実行します。

fs.copyToLocalFile(bashScriptPath, new Path("/tmp/describeTable.sh"));
ProcessBuilder builder = new ProcessBuilder("bash", "/tmp/describeTable.sh");

hiveスクリプトは実行されるが、コマンドとして認識されない

/tmp/describeTable.sh: line 1: hive: command not found

私も試しまし/usr/bin/hive -e 'describe <tableName>'たが、うまくいきません。

Java プログラムは、ローカル FS で jar ファイルとして実行すると正常に動作しますが、oozie ワークフローの一部として実行すると失敗します。

これを機能させる方法がわかりません。いくつかのアイデアをいただければ幸いです。

編集

プロセス ビルダーの完全なコードを追加します。

fs.copyToLocalFile(bashScriptPath, new Path("/tmp/describeTable.sh"));
    ProcessBuilder builder = new ProcessBuilder("bash", "/tmp/describeTable.sh");
    builder.directory(new File(currentLocalDir));
    ArrayList<String> columnList = new ArrayList<String>();
    System.err.println("trying to run script");
    try {
        final Process process = builder.start();
        InputStream is = process.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        BufferedReader error1 = new BufferedReader(new InputStreamReader(process.getErrorStream()));
        String errorLine=null;
        System.err.println("error stream: ");
        while((errorLine=error1.readLine())!=null){
            System.err.println(errorLine);
        }
        String line;
        System.err.println("input stream");
        while((line=br.readLine())!=null) {
            System.err.println("line from running script: " + line);
            String[] output = line.split("\t");
            columnList.add(output[0]);

        }
        is.close();
        isr.close();
        br.close();
        System.err.println("column list:" + columnList);
        return columnList;
4

1 に答える 1