代码之家  ›  专栏  ›  技术社区  ›  Davis Broda

使用Java代码生成Oozie工作流

  •  4
  • Davis Broda  · 技术社区  · 10 年前

    通过查看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 回复  |  直到 10 年前
        1
  •  3
  •   foo_bar    9 年前

    我也遇到过类似的情况。

    我建议使用oozie模式定义(xsd)并通过xjc生成java等效对象。给定这些对象,您可能可以创建工作流(但不是微不足道的)

    您可以使用基于标量的DSL https://github.com/klout/scoozie 与Scala做了类似的事情->oozie一代

        2
  •  1
  •   asalamon74    5 年前

    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
  •  1
  •   Ahmed Moawad    9 年前

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

    它看起来像这样: enter image description here

    enter image description here

        4
  •  0
  •   Prabakaran    9 年前

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