oozie的workflow.xml如何写hivesql先串行后并行
时间: 2024-09-12 14:10:24 浏览: 40
Oozie是一个工作流调度系统,用于管理Hadoop作业。在Oozie的工作流(Workflow)中,可以通过`workflow.xml`文件定义一系列作业的执行顺序。如果你想在`workflow.xml`中编写Hive SQL任务,并且希望这些任务先串行执行,然后并行执行,你可以使用`<decision>`、`<fork>`和`<join>`标签来实现。
首先,你需要按顺序定义串行执行的Hive SQL任务。然后,通过`<fork>`标签创建一个分支,允许后续的Hive SQL任务并行执行。最后,使用`<join>`标签将这些并行的任务重新汇聚在一起,这样可以确保在继续执行后续任务之前所有并行任务都已经完成。
下面是一个简单的例子来说明这一点:
```xml
<workflow-app xmlns="uri:oozie:workflow:0.5" name="HiveWorkflow">
<!-- 初始化 -->
<start to="hiveAction1"/>
<!-- Hive SQL 任务1 -->
<action name="hiveAction1">
<hive xmlns="uri:oozie:hive-action:0.2">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<script>hive_query1.sql</script>
</hive>
<ok to="fork"/>
<error to="kill"/>
</action>
<!-- Hive SQL 任务2 -->
<action name="hiveAction2">
<hive xmlns="uri:oozie:hive-action:0.2">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<script>hive_query2.sql</script>
</hive>
<ok to="fork"/>
<error to="kill"/>
</action>
<!-- 分叉点,创建并行执行的任务 -->
<decision name="fork">
<switch>
<case to="hiveAction3">true</case>
</switch>
</decision>
<!-- Hive SQL 任务3 -->
<action name="hiveAction3">
<hive xmlns="uri:oozie:hive-action:0.2">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<script>hive_query3.sql</script>
</hive>
<ok to="join"/>
<error to="kill"/>
</action>
<!-- Hive SQL 任务4 -->
<action name="hiveAction4">
<hive xmlns="uri:oozie:hive-action:0.2">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<script>hive_query4.sql</script>
</hive>
<ok to="join"/>
<error to="kill"/>
</action>
<!-- 汇聚点,等待并行任务完成 -->
<join name="join" to="finalAction"/>
<!-- 最终任务 -->
<action name="finalAction">
<hive xmlns="uri:oozie:hive-action:0.2">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<script>hive_final_query.sql</script>
</hive>
<ok to="end"/>
<error to="kill"/>
</action>
<!-- 结束 -->
<kill name="kill">
<message>Hive job failed, error message: ${wf:errorMessage(wf:lastErrorNode())}</message>
</kill>
<end name="end"/>
</workflow-app>
```
在这个例子中,`hiveAction1`和`hiveAction2`会先串行执行,然后通过`<decision>`标签分叉,使`hiveAction3`和`hiveAction4`并行执行。这两个并行任务都会汇聚到`<join>`标签,等待它们都完成后,才会执行最终的`finalAction`任务。
阅读全文