使用 Java 代码生成 Oozie 工作流

Generating Oozie Workflows using Java Code

查看 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

我也遇到过类似情况。

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

您可以使用基于 Scala 的 DSL https://github.com/klout/scoozie 对 Scala->oozie 生成做了类似的事情

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

看起来像这样:

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

创建的位置

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