使用Java代码生成Oozie工作流

时间:2015-02-05 19:52:11

标签: java oozie

通过Oozie示例和文档,您可能需要一个工作流文件才能从Java代码运行oozie作业。是否可以直接从Java代码提交作业,而无需工作流文件?是否存在通过Java代码动态生成这些文件的预先存在的方法?是否有任何预先存在的工具可以使它们更容易生成?或者我是否必须编写完整的代码来生成文件?

现状

    OozieClient wc = new OozieClient("http://bar:8080/oozie");

    Properties conf = wc.createConfiguration();
    conf.setProperty(OozieClient.APP_PATH, "workflow file path");
    // set other properties
    ...

    // submit and start the workflow job
    wc.run(conf);

理想的情况是模糊的。

OozieAction action = new OozieAction("actionName");
action.setOkDestination("nextAction");
action.setErrorDestination("errorDestination");
//Rest of config for action

OozieWorkflow workflow = new Oozieworkflow();
workfow.setStartAction(action);
workflow.addAction(otherAction);
//rest of conf

OozieClient wc = new OozieClient("http://bar:8080/oozie");
wc.runWorkflow(workflow);

如果前者不可能,那么另一种情况是可取的:

OozieAction action = new OozieAction("actionName");
action.setOkDestination("nextAction");
action.setErrorDestination("errorDestination");

//Rest of config for action

OozieWorkflow workflow = new Oozieworkflow();
workfow.setStartAction(action);
workflow.addAction(otherAction);

//rest of conf

workflow.writeToFile("some localFile")


//load file to HDFS

//This would also work
// workflow.writeToHDFS("someHdfsLocation");

OozieClient wc = new OozieClient("http://bar:8080/oozie");

//run with created workflow

4 个答案:

答案 0 :(得分:3)

我一直处于类似情况。

我建议使用oozie模式定义(xsd)并通过xjc生成java等效对象。鉴于这些对象,您可以创建工作流程(尽管不是很简单)

您可以使用基于scala的DSL https://github.com/klout/scoozie与Scala-> oozie generation

类似

答案 1 :(得分:1)

有一个图形工具可以通过eclipse插件生成Oozi工作流程。在Eclipse市场找到它:https://marketplace.eclipse.org/content/oozie-eclipse-plugin

看起来像这样: enter image description here

enter image description here

答案 2 :(得分:1)

Oozie 5.1.0添加了对Fluent Job API的支持,这使得可以编写Java代码而不是工作流XML文件(实际上,Oozie将为您生成XML文件)。

用于创建类似于Oozie的shell操作演示的工作流的Java代码的简单示例:

public class MyFirstWorkflowFactory implements WorkflowFactory {

    @Override
    public Workflow create() {
        final ShellAction shellAction = ShellActionBuilder.create()
                .withName("shell-action")
                .withResourceManager("${resourceManager}")
                .withNameNode("${nameNode}")
                .withConfigProperty("mapred.job.queue.name", "${queueName}")
                .withExecutable("echo")
                .withArgument("my_output=Hello Oozie")
                .withCaptureOutput(true)
                .build();

        final Workflow shellWorkflow = new WorkflowBuilder()
                .withName("shell-workflow")
                .withDagContainingNode(shellAction).build();

        return shellWorkflow;
    }
}

更详细的文档可以在这里找到:https://oozie.apache.org/docs/5.1.0/DG_FluentJobAPI.html

答案 3 :(得分:0)

在你的HDFS中有一个静态oozie工作流,它只需要2个参数,并将parameter1的内容(比如用户输入的内容)写入参数2(比如写入HDFS)。现在调用oozie CLI并将app.path指定为workflow1

创建的位置