Java 使用Knime定义Oozie工作流

Java 使用Knime定义Oozie工作流,java,oozie,knime,Java,Oozie,Knime,我目前的问题是试图开发一组Knime节点,以提供与ApacheOozie的集成。也就是说,我正试图从Knime内部构建、启动和监控Oozie工作流 我在为线性Oozie工作流实现这一点上取得了一些成功,但当需要包括分支时,我变得非常困惑 作为背景,让我解释一下我为线性工作流所做的工作: 本质上,我的解决方案将每个Oozie操作表示为Knime节点。每个节点都有2种操作模式,根据特定流变量的内容调用相应的模式。这两种模式是必需的,因为我必须执行两次Oozie部分(OozieStartAction

我目前的问题是试图开发一组Knime节点,以提供与ApacheOozie的集成。也就是说,我正试图从Knime内部构建、启动和监控Oozie工作流

我在为线性Oozie工作流实现这一点上取得了一些成功,但当需要包括分支时,我变得非常困惑

作为背景,让我解释一下我为线性工作流所做的工作:

本质上,我的解决方案将每个Oozie操作表示为Knime节点。每个节点都有2种操作模式,根据特定流变量的内容调用相应的模式。这两种模式是必需的,因为我必须执行两次Oozie部分(OozieStartAction到OozieStopAction),第一次迭代生成Oozie工作流,第二次启动并监视它。此外,流变量在该循环的迭代之间保持不变

  • 在一种操作模式中,节点将特定于它所表示的Oozie操作的xml内容附加到整个Oozie工作流xml中,然后转发它

  • 在另一种情况下,节点只是轮询Oozie以获取它所表示的操作的状态

此工作流中使用了以下流变量:

-OOZIE_XML:包含OOZIE工作流XML

-OOZIE_JOB_ID:使用组装的工作流启动的正在运行的OOZIE JOB的ID

-上一个操作的名称:上一个操作的名称

在上面的示例中,逐步发生的情况如下:

-OozieStartNode运行时,看到它有一个空的或没有OOZIE_XML变量,所以它自己创建一个,设置基本工作流应用程序并启动XML节点。它还创建一个值为“start”的PREV_ACTION_NAME flow var

-第一个OozieGenericAction看到它有一个空的OOZIE_作业ID,因此它在收到的OOZIE_XML中向工作流应用程序节点附加一个新操作,获取“name”属性等于PREV_action_name的节点,并将其转换设置为它刚刚创建的操作。上一个动作的名称将被当前动作的名称覆盖

-StopOozieAction只是创建一个结束节点,并将上一个操作的转换设置为结束节点,这与上一个通用操作非常相似

-在第二次迭代中,OozieStart看到它有XML数据,因此调用了辅助执行模式。这会将工作流XML上载到hdfs中,并使用此工作流创建一个新的Oozie作业,并将收到的作业ID作为Oozie_作业ID转发

-以下Oozie操作具有有效的Oozie_作业ID,只需轮询Oozie以了解其操作名称的状态,并在其各自的操作完成运行后结束执行

我面临的主要问题是在工作流xml程序集中,例如,我不能在使用分支时使用prev node name变量。如果我有一个连接操作,有许多节点链接到它,一个prev节点将覆盖其他节点,节点关系数据将丢失


有没有人对我采用哪种方法有什么广泛的想法?

在递归循环中有一列名为(以前的帐户名)的地方,如何使用一个变量来表示列。对于所有行,在一个中保持相同的值似乎有些过分,但是递归循环将像其他任何列一样传递该值

顺便说一句,你看过这些吗?

像递归循环这样的东西不适合您的分支和合并吗?(我不熟悉Oozie。)我不确定,因为我已经在递归循环中嵌入了这个工作流。嵌套循环没有问题吗?我指的是像节点一样的递归的自定义实现,而不是KNIME节点。我认为嵌套应该不是问题,但我还没有尝试过。嗯,你能详细介绍一下这个想法吗?恐怕我对Iris的实现不太了解。你的描述和它的功能很相似。要保留prev node name变量,可以在
prev\u ACTION\u name
前面加上其节点id(或时间戳),结果类似于
node 64PREV\u ACTION\u name
。使用Java代码片段或自定义节点,您可以找到想要使用的适当的
PREV\u ACTION\u NAME
。也许这不是最好的主意,但目前我只有这些。