我想知道当我同时提交两个相同的工作流程工作(只是Oozie示例示例)时,oozie如何处理冲突(如果确实存在)。 我可以提交相同的两个工作成功和oozie服务器返回两个不同的jobId.In Oozie Web控制台,我看到两个工作的状态都是RUNNING,然后所有SUCCEEDED一段时间后。 我的workflow.xml作为关注者:
<workflow-app xmlns="uri:oozie:workflow:0.2" name="map-reduce-wf">
<start to="mr-node"/>
<action name="mr-node">
<map-reduce>
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<prepare>
<delete path="${nameNode}/user/${wf:user()}/mapreduce_test/output-data"/>
</prepare>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>default</value>
</property>
<property>
<name>mapred.mapper.class</name>
<value>org.apache.oozie.example.SampleMapper</value>
</property>
<property>
<name>mapred.reducer.class</name>
<value>org.apache.oozie.example.SampleReducer</value>
</property>
<property>
<name>mapred.map.tasks</name>
<value>1</value>
</property>
<property>
<name>mapred.input.dir</name>
<value>/user/${wf:user()}/mapreduce_test/input</value>
</property>
<property>
<name>mapred.output.dir</name>
<value>/user/${wf:user()}/mapreduce_test/output-data/</value>
</property>
</configuration>
</map-reduce>
<ok to="end"/>
<error to="fail"/>
</action>
<kill name="fail">
<message>Map/Reduce failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name="end"/>
</workflow-app>
我知道在“准备”标签中删除输出目录有助于使动作可重复并在失败后启用重试,我也了解基本动作运行模型。
所以,我的问题是:
答案 0 :(得分:0)
Oozie没有检测到任何工作重复或任何类似的工作。它接受工作流作业并在集群上安排它们以便执行和监视,直到完成或失败。
同样的两个作业真的同时运行了吗?(我看到这两个作业都在oozie web控制台中处于运行状态)。
是。这两个工作将同时运行。
是否存在写冲突?(两个相同的工作点一个输出目录)
Oozie没有与write conflicts
相关的任何检查。我猜这些都是map reduce或hdfs框架。
答案 1 :(得分:0)
根据您的问题: 1. Oozie在集群上调度作业,直到结束,状态如成功/失败。 2.两个作业都将同时运行,并将执行已定义的相同操作。
要避免使用相同的内容,您可以执行下面的步骤,这些步骤会有所帮助。
Oozie Jobs通过触发job.properties或coordinator.properties开始执行,并按照通过job.xml / coordinator.xml传递的提及间隔启动工作流程。
因此,当提交请求时,它会在
中重新输入Oozie的Metastore DB中的表格{可能是&#34; Oracle / MySQL / Postgress / Derby&#34;。协调员的COORD_JOBS和工作流程的WF_JOBS
因此,即使已触发作业,也可以在每次为尊重的作业设置新ID时重复开始。 {将COORDINATOR JOB ID设置为增量基础}。
避免重复处理同一作业的一种方法是,您可以通过Metastore数据库结束进行一些验证检查。
在Metastore DB下为COORD_JOBS表创建一个触发器,它将使用作业名称检查表条目,查询类似
IF (SELECT COUNT(*) FROM COORD_JOBS WHERE (app_name = NEW.app_name) AND (status="RUNNING")) > 0 THEN
SET NEW='Error: Cannot Update table.';
END IF;
每次Oozie尝试使用新作业进行更新时,COORD_JOBS / WF_JOBS表中的这些数据库表触发器都会进行检查。
COORD_JOBS表可以替换为WF_JOBS表,该表存储由Coordinator.properties启动的工作流作业详细信息,