在 Oozie 中单独处理行

Process Rows Separately in Oozie

我有一个包含 2 列的简单输入文件,例如

pkg1 date1
pkg2 date2
pkg3 date3
...
...

我想创建一个单独处理每一行的 oozie 工作流。对于每一行,我想 运行 一个接一个地执行多个操作(Hive、Pig..),然后处理另一行。 但这比我想象的要难。我想,我必须以某种方式创建一个循环并遍历它。

你能给我架构方面的建议吗?

Oozie 不支持 loops/cycles,因为它是有向无环图

https://oozie.apache.org/docs/3.3.0/WorkflowFunctionalSpec.html#a2.1_Cycles_in_Workflow_Definitions

另外,没有内置的方式(据我所知)将数据从 Hive 读取到 Oozie 工作流并使用它来控制 Oozie 工作流的流程。

您可以有一个单独的 Oozie 工作流来启动一些自定义流程(例如 Shell 操作),并在该流程中从 Hive 读取数据,并为每个条目启动一个新的、单独的 Oozie 工作流.

我完全同意@Mattinbits,您必须使用一些程序代码(shell 脚本、Python 等)来运行 循环并触发适当的Pig/Hive 任务。

但是如果您的进程必须等待任务完成才能启动下一批,协调部分可能会变得更多实施起来很复杂。我可以想到一种非常邪恶的方式来使用 Oozie 进行协调...

  • 写下一个通用的 Oozie 工作流,其中 运行 是一组参数的 Pig/Hive 操作,作为属性传递
  • 写下一个 "master template" Oozie 工作流,它只是 运行 上面的 WF 作为一个 sub-workflow 和属性的虚拟值
  • 将模板分成 3 部分:XML header、sub-workflow 调用(带有属性实际值的占位符)和 XML 页脚
  • 然后,您的循环将通过连接 header 动态构建实际的 "master" 工作流,为第一组值调用 sub-workflow,为第二组值调用另一个,等等等等,然后是页脚——最后将工作流提交到 Oozie 服务器(使用 REST 或命令行界面)

当然还有一些其他事情需要处理——为 sub-workflows 动作生成唯一名称,链接它们,处理错误。平常的东西。