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