Apache Oozie教程:工作流图、调度器

⚡ 智能摘要

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

  • 🔘 两台发动机: 工作流引擎运行 Hadoop 作业图;协调器引擎按计划或在数据到达时触发它们。
  • ☑️ 节点类型: 行动节点执行工作;决策、分叉和合并等控制节点引导路径。
  • 三种工作类型: 工作流、协调器和捆绑器作业堆叠起来,构成完整的数据管道。
  • 🧪 部署: 工作流应用程序是一个包含 workflow.xml 和 lib 文件夹的目录,已复制到 HDFS 中。
  • 🛠️ 命令行: 设置 OOZIE_URL使用 oozie job -run 提交,然后轮询 oozie job -info,直到它报告 SUCCEEDED。
  • ⚠️ 项目状态: Oozie 于 2025 年退役,归入 Apache Attic,因此新的管道通常使用 Apache Airflow。

Apache Oozie教程,涵盖工作流、协调器作业和Hadoop调度

什么是 Apache Oozie?

Apache Oozie 是一个工作流调度器,用于 Hadoop的这是一个运行依赖作业工作流的系统。用户可以在这里创建工作流的有向无环图,这些工作流可以在Hadoop中并行或顺序运行。

它由两部分组成:

  • 工作流引擎: 工作流引擎的职责是存储和运行由Hadoop作业组成的工作流,例如: 映射简化, , 蜂房.
  • 协调器引擎: 它根据预定义的计划和数据的可用性运行工作流作业。

Oozie 具有可扩展性,能够管理 Hadoop 集群中数千个工作流(每个工作流包含数十个作业)的及时执行。下图展示了调度器在集群中的位置以及它所驱动的作业。

Apache 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 工作类型

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 则是更实用的选择。

常见问题

不。Apache 软件 Foundation Oozie 于 2025 年 2 月退役,并于 2025 年 4 月完成了 Attic 的迁移。最终版本是 2021 年 2 月发布的 5.2.1 版本,存储库为只读,但文档仍然在线。

AI 助手可以将描述的流水线转化为调度器配置,解释作业图死锁的原因,并将集群日志汇总成可能的根本原因。它适用于初稿编写和问题分类,但不适用于批准生产调度。

Copilot 可以快速生成看似合理的 workflow.xml 文件,但它经常会生成错误的元素名称或错误的模式版本。请先使用 5.2.1 模式验证生成的 XML 文件,并在测试集群上进行预运行。

协调器将频率、开始时间和结束时间与数据集定义结合起来。它仅当时钟到达下一个时间间隔且所有声明的输入数据集都存在于 HDFS 中时才会触发,因此延迟的数据会延迟运行。

使用重新运行操作和原始作业 ID 再次提交作业,并指定要跳过或重复的节点。Oozie 会重用已完成的操作,因此只会运行图中剩余的部分。

PREP 表示作业已被接受但尚未启动,通常是因为 HDFS 中的应用程序路径错误或物化时间尚未到达。SUSPENDED 表示有人暂停了作业,或者某个操作失败导致工作流暂停。

服务器使用自身的主体和密钥表运行,客户端通过 HTTP 协议经由 SPNEGO 进行身份验证。工作流携带委托令牌,因此每个操作都以提交用户的身份而非服务器的身份到达 HDFS 和 YARN。

Cron 会执行一个命令,然后就忘记它了。调度器 tracks 处理作业之间的依赖关系,等待输入数据到达,记录每个操作的状态,并允许您仅重新运行失败的部分。

总结一下这篇文章: