我目前的问题是尝试开发一组提供与 Apache Oozie 集成的 Knime 节点。也就是说,我正在尝试从 Knime 中构建、启动和监控 Oozie 工作流程。
我在为线性 Oozie 工作流程实现这一点方面取得了一些成功,但在需要包含分支时变得相当困难。
作为背景,让我解释一下我为线性工作流执行此操作的方式:
本质上,我的解决方案将每个 Oozie Action 表示为一个 Knime 节点。这些节点中的每一个都有 2 种操作模式,根据某些流变量的内容调用正确的一种。这两种模式是必需的,因为我必须执行 Oozie 部分(OozieStartAction 到 OozieStopAction)两次,第一次迭代生成 Oozie 工作流,第二次启动并监控它。此外,流变量在此循环的迭代之间持续存在。
在一种操作模式中,节点将特定于它所代表的 Oozie 操作的 xml 内容附加到整个 Oozie 工作流 xml,然后转发它。
另一方面,节点简单地轮询 Oozie 以获取它所代表的操作的状态。
此工作流中使用了以下流变量:
-OOZIE_XML:包含 oozie 工作流 xml
-OOZIE_JOB_ID:使用组装工作流启动的正在运行的 oozie 作业的 ID
-PREV_ACTION_NAME:上一个动作的名称
在上面的示例中,逐步发生的情况如下:
-OozieStartNode 运行,看到它有一个空白或没有 OOZIE_XML 变量,所以它自己创建一个,设置基本的工作流应用程序并启动 xml 节点。它还创建一个值为“start”的 PREV_ACTION_NAME 流变量。
- 第一个 OozieGenericAction 看到它有一个空白的 OOZIE_JOB_ID,因此它在接收到的 OOZIE_XML 中将一个新操作附加到工作流应用程序节点,获取“名称”属性等于 PREV_ACTION_NAME 的节点并将其转换设置为它刚刚创建的操作. PREV_ACTION_NAME 然后被当前操作的名称覆盖。
...
- StopOozieAction 简单地创建一个结束节点并将前一个动作的过渡设置到它,很像前一个通用动作。
- 在第二次迭代中,OozieStart 看到它有 XML 数据,所以调用了二次执行模式。这会将工作流 XML 上传到 hdfs 并使用此工作流创建一个新的 Oozie 作业,并将收到的 JobId 转发为 OOZIE_JOB_ID。
-以下 Oozie Actions,具有有效的 OOZIE_JOB_ID,只需轮询 Oozie 以获取其动作名称的状态,一旦它们各自的动作完成运行就结束执行
我面临的主要问题是在工作流 xml 程序集中,一方面,我不能在使用分支时使用 prev 节点名称变量。如果我有许多节点链接到它的连接操作,一个前一个节点将覆盖其他节点,节点关系数据将丢失。
有没有人有任何广泛的想法我可以采取这种方式?