如何从Oozie Java操作中运行配置单元命令?

如何从Oozie Java操作中运行配置单元命令?,java,hadoop,hive,oozie,Java,Hadoop,Hive,Oozie,我有一个运行Java操作的oozie工作流。在java操作中,我需要描述一个配置单元表来获取表的模式。我通过使用process builder并执行包含descripe table查询的shell脚本来实现这一点 我的descripbetable.sh: hive -e 'describe <tableName>` 脚本执行,但无法将hive识别为命令 /tmp/describeTable.sh: line 1: hive: command not found 我也尝试过/usr

我有一个运行Java操作的oozie工作流。在java操作中,我需要描述一个配置单元表来获取表的模式。我通过使用process builder并执行包含
descripe table查询的shell脚本来实现这一点

我的descripbetable.sh:

hive -e 'describe <tableName>`
脚本执行,但无法将
hive
识别为命令

/tmp/describeTable.sh: line 1: hive: command not found
我也尝试过
/usr/bin/hive-e'description'
,但效果并不理想

当我在本地FS上以jar文件的形式执行java程序时,它工作得很好,但当我作为oozie工作流的一部分运行它时,它失败了

我不知道如何让这个工作,我真的很感激一些想法

编辑

添加process builder的完整代码:

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;
fs.copyToLocalFile(bashScriptPath,新路径(“/tmp/descripbetable.sh”);
ProcessBuilder=newProcessBuilder(“bash”,“/tmp/descripbetable.sh”);
目录(新文件(currentLocalDir));
ArrayList columnList=新建ArrayList();
System.err.println(“尝试运行脚本”);
试一试{
最终流程=builder.start();
InputStream=process.getInputStream();
InputStreamReader isr=新的InputStreamReader(is);
BufferedReader br=新的BufferedReader(isr);
BufferedReader error1=新的BufferedReader(新的InputStreamReader(process.getErrorStream());
字符串errorLine=null;
System.err.println(“错误流:”);
而((errorLine=error1.readLine())!=null){
系统错误打印项次(错误行);
}
弦线;
System.err.println(“输入流”);
而((line=br.readLine())!=null){
System.err.println(“运行脚本的行:“+line”);
字符串[]输出=行。拆分(“\t”);
columnList.add(输出[0]);
}
is.close();
isr.close();
br.close();
System.err.println(“列列表:“+columnList”);
返回列列表;

Oozie以Map Reduce作业的形式运行大多数(如果不是所有的话)操作,因此您看到的错误消息可能是因为java操作正在您的一个计算节点上执行,而不是您提交Oozie作业的机器或运行Oozie服务器的机器


您可以确保配置单元安装在集群中的所有计算节点上,或者在Java操作中使用配置单元Java API并添加配置单元库(以及所有依赖项)到您的Oozie作业在HDFS中的共享库路径。

尝试从您的descripbetable.sh运行“which hive”或“echo$path”以查看为什么它找不到hiveIt说找不到hive命令…我想hive没有安装在集群的所有节点上?echo$path打印一个空行,顺便说一句。宾果!您的使用方式有问题ProcessBuilder@Oleks我已经为process builder部分添加了完整的代码。我不确定我做错了什么。
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;