1

我目前的问题是尝试开发一组提供与 Apache Oozie 集成的 Knime 节点。也就是说,我正在尝试从 Knime 中构建、启动和监控 Oozie 工作流程。

我在为线性 Oozie 工作流程实现这一点方面取得了一些成功,但在需要包含分支时变得相当困难。

作为背景,让我解释一下我为线性工作流执行此操作的方式:

Knime/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 节点名称变量。如果我有许多节点链接到它的连接操作,一个前一个节点将覆盖其他节点,节点关系数据将丢失。

有没有人有任何广泛的想法我可以采取这种方式?

4

1 回答 1

0

如何使用变量列在递归循环中有一个名为(上一个动作名称)的列。为所有行保持相同的值似乎有点过分,但递归循环会像任何其他列一样传递它。

顺便说一句,你见过这些吗? https://www.knime.org/knime-big-data-connectors

于 2016-03-01T13:35:55.620 回答