Apache Oozie教程:工作流图、调度器
⚡ 智能摘要
Apache Oozie 是 Hadoop 的工作流调度器,它将依赖作业作为有向无环图运行,结合了 MapReduce、Pig 和 Hive 操作的工作流引擎以及由时间和数据可用性驱动的协调器引擎。

什么是 Apache Oozie?
Apache Oozie 是一个工作流调度器,用于 Hadoop的这是一个运行依赖作业工作流的系统。用户可以在这里创建工作流的有向无环图,这些工作流可以在Hadoop中并行或顺序运行。
它由两部分组成:
Oozie 具有可扩展性,能够管理 Hadoop 集群中数千个工作流(每个工作流包含数十个作业)的及时执行。下图展示了调度器在集群中的位置以及它所驱动的作业。
Oozie 的灵活性也很强。用户可以轻松地启动、停止、暂停和重新运行作业。Oozie 让重新运行失败的工作流变得非常简单。用户很容易理解,由于停机或故障而错过或失败的作业,要补上它们有多么困难。甚至可以跳过特定的故障节点。
项目状态: Apache Oozie 已被 Apache 软件公司弃用 Foundation 2025年2月及之后的搬迁 阿帕奇阁楼 预计于 2025 年 4 月完成。最终版本仍为 2021 年 2 月发布的 5.2.1 版本,源代码库目前为只读。现有集群仍在运行该版本,因此了解以下机制仍然很有意义,但新的流水线通常基于 Apache Airflow 构建。
Oozie是如何工作的?
Oozie 作为集群中的一项服务运行,客户端提交工作流定义以供立即或稍后处理。
Oozie 工作流由动作节点和控制流节点组成。
操作节点代表工作流任务,例如,将文件移动到 高密度文件系统运行 MapReduce、Pig 或 Hive 作业,使用以下方式导入数据 勺子或者运行 shell 脚本或用以下语言编写的程序 Java.
控制流节点通过允许条件逻辑等结构来控制操作之间的工作流执行,其中可以根据先前操作节点的结果遵循不同的分支。
起始节点、结束节点和错误节点都属于此类节点。
- 起始节点 指定工作流作业的开始。
- 结束节点 标志着工作结束。
- 错误节点 指示错误发生以及要打印的相应错误消息。
工作流执行完毕后,Oozie 会使用 HTTP 回调函数向客户端更新工作流状态。进入或退出操作节点也可能触发此回调函数。
Oozie 控制节点和操作类型
除了开始、结束和错误之外,工作流 XML 还支持少量控制节点,这些节点可以塑造图形。
- 决定: 对表达式进行求值,并将工作流发送到几个分支中的一个,相当于 switch 语句。
- 叉子: 将路径拆分,使两个或多个操作并行运行。
- 加入: 等待匹配分支的每个分支都完成后再继续。
- 杀: 立即终止工作流程并记录失败消息。
动作节点涵盖了工作本身,每个动作节点都有自己的 XML 元素:
- MapReduce、Pig、Hive 和 Sqoop actions 会启动相应的 Hadoop 作业。
- java的 在集群上运行主类; 壳 和 SSH 运行脚本。
- fs 执行 HDFS 清理工作ping 例如移动、删除、创建目录和更改权限。
- 电子邮件 通知收件人,并且 子工作流程 调用另一个工作流应用程序。
工作流程图示例
下图 trac是一个从起始节点开始,经过 MapReduce 操作,到达结束节点或操作失败时到达错误路径的小型工作流。
Oozie 工作类型
Oozie 将工作描述为三个层次。每一层都包裹着它下面的那一层,因此一个软件包最终控制着许多独立的工作流程。
| 职业属性 | 它的定义 | 触发者 |
|---|---|---|
| 工作流程 | 工作流文件 workflow.xml 中编写的包含动作节点和控制节点的有向无环图。 | 手动提交,或由协调员提交 |
| 协调员 | 针对单个工作流程的重复性计划,包括开始时间、结束时间和频率。 | 时钟时间和输入数据可用性 |
| 仪器套件选项 | 一组协调器应用程序,作为一个数据管道进行统一管理。 | 适用于所有协调员的启动时间 |
这种区别在实践中很重要:工作流回答“运行什么”,协调器回答“何时运行”,而捆绑包回答“什么一起启动和停止”。
打包和部署 Oozie 工作流应用程序
工作流应用程序包含工作流定义和所有相关资源,例如 MapReduce Jar 文件、Pig 脚本等。应用程序需要遵循简单的目录结构,并部署到 HDFS,以便 Oozie 可以访问它们。
下面展示了一个示例目录结构:
<name of workflow>/
├── lib/
│ └── hadoop-examples.jar
└── workflow.xml
必须将 workflow.xml(工作流定义文件)放在顶层目录(即包含工作流名称的父目录)中。lib 目录包含 MapReduce 类的 Jar 文件。符合此布局的工作流应用程序可以使用任何构建工具构建,例如 Ant 或 Maven。
需要使用命令将这样的构建版本复制到 HDFS,例如:
% hadoop fs -put hadoop-examples/target/<name of workflow dir> name of workflow
运行 Oozie 工作流作业的步骤
在本节中,我们将了解如何运行工作流作业。要运行此作业,我们将使用 Oozie 命令行工具(与 Oozie 服务器通信的客户端程序)。
1. 导出 OOZIE_URL 环境变量,用于告诉 oozie 命令要使用哪个 Oozie 服务器(这里我们使用的是本地运行的服务器):
% export OOZIE_URL="http://localhost:11000/oozie"
2. 运行工作流作业:
% oozie job -config ch05/src/main/resources/max-temp-workflow.properties -run
-config 选项指的是本地 Java properties 文件包含工作流 XML 文件中参数的定义,以及 oozie.wf.application.path,它告诉 Oozie 工作流应用程序在 HDFS 中的位置。
属性文件的示例内容:
nameNode=hdfs://localhost:8020 jobTracker=localhost:8021 oozie.wf.application.path=${nameNode}/user/${user.name}/<name of workflow>
3. 获取工作流作业的状态。
可以使用带有“-info”选项的子命令“job”查看工作流作业的状态,在“-info”之后指定作业 ID。
e.g., % oozie job -info <job id>
输出结果显示状态,状态包括 RUNNING、KILLED 或 SUCCEEDED。
4. 可以使用类似这样的 Hadoop 命令查看工作流成功执行的结果:
% hadoop fs -cat <location of result>
为什么要使用 Oozie?
使用 Oozie 的主要目的是管理 Hadoop 系统中正在处理的不同类型的作业。
用户以有向无环图的形式指定作业之间的依赖关系。Oozie 会接收这些信息,并按照工作流中指定的顺序执行作业。这样,用户就无需花费时间管理整个工作流。此外,Oozie 还允许用户指定特定作业的执行频率。
Oozie 的功能
- Oozie 具有客户端 API 和命令行界面,可用于从远程桌面启动、控制和监控作业。 Java 应用程序。
- 利用其 Web 服务 API,可以从任何地方控制作业。
- Oozie 具有执行定期计划运行作业的功能。
- Oozie 具备在任务完成后发送电子邮件通知的功能。
Oozie 与 Apache Airflow 的对比
由于 Oozie 已停止维护,如今大多数团队在评估调度器时,都会将他们现有的系统与 Apache Airflow 进行比较。这两个工具从相反的角度解决了同一个问题。
| 方面 | Apache Oozie | 阿帕奇气流 |
|---|---|---|
| 定义语言 | 以 XML 编写的工作流 | DAG 写成如下形式 Python 码 |
| 适用范围 | 围绕 Hadoop 操作(例如 MapReduce、Pig、Hive 和 Sqoop)构建 | 通用型,支持云服务、数据库和容器操作 |
| 生产计划 | 协调员的工作受时间和数据可用性的限制。 | 定时任务加上等待外部条件的传感器 |
| 项目状态 | 将于 2025 年退役并封存;最终版本 5.2.1 | 积极开发的 Apache 顶级项目 |
对于已经运行 Oozie 的集群来说,它仍然是更简单的选择,因为其操作与 Hadoop 组件一一对应。而对于任何新的项目,尤其是涉及 Hadoop 之外的管道,Airflow 则是更实用的选择。


