workflow.xml 是 oozie 定义 hadoop 工作流的 xml 蓝图,本质为 dag;须以 为根,含 和 ,节点通过 / 跳转,依赖参数由 job.properties 提供,且所有 hdfs 路径需完整 uri。

workflow.xml 是 Oozie 用来声明式定义 Hadoop 工作流的 XML 文件,本质是一个 DAG(有向无环图)描述:每个节点代表一个操作(如 MapReduce、Spark、Shell、Fork、Join),边代表执行顺序与依赖关系。
它不是脚本,不写逻辑;而是“蓝图”——Oozie Server 读取后解析、调度、监控并容错执行。
workflow.xml 的基本结构长什么样
必须包含 <workflow-app></workflow-app> 根元素,定义 name 和 xmlns,内部以 <start></start> 开始,以 <end></end> 结束,中间是节点定义和跳转(<ok></ok>/<error></error>)。
<workflow-app xmlns="uri:oozie:workflow:0.5" name="my-wf">
<start to="mr-job"/>
<p><action name="mr-job">
<map-reduce>
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.mapper.class</name>
<value>org.example.TokenizerMapper</value>
</property>
</configuration>
<file>hdfs://path/to/job.jar#job.jar</file>
</map-reduce>
<ok to="end"/>
<error to="fail"/>
</action></p><p><kill name="fail">
<message>Workflow failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill></p><p><end name="end"/>
</workflow-app>-
${jobTracker}和${nameNode}是参数占位符,需在job.properties中赋值 - 所有 HDFS 路径必须用完整 URI(如
hdfs://nn:8020/user/oozie/wf.xml),不能省略协议 -
<file></file>中的#job.jar表示将该 JAR 下载到容器本地 classpath,这是 MapReduce action 正常运行的关键
怎么提交 workflow.xml 到 Oozie 执行
不能直接双击或用 java -jar 运行 —— 它必须通过 Oozie Client 提交到 Oozie Server(即 REST 接口)。
- 先确保
workflow.xml和所有依赖(JAR、脚本、配置文件)已上传到 HDFS 指定路径(如/user/oozie/workflows/myapp/) - 准备
job.properties,至少含:oozie.wf.application.path=hdfs://nn:8020/user/oozie/workflows/myapp/jobTracker=rm-host:8050nameNode=hdfs://nn:8020 - 用命令行提交:
oozie job -config job.properties -run - Oozie 返回一串
job-0000001-230401123456789-oozie-oozi-W类似 ID,可用oozie job -info <id></id>查状态
注意:oozie.wf.application.path 指向的是目录,不是 workflow.xml 文件本身;Oozie 默认在该目录下找名为 workflow.xml 的文件。
常见失败原因和绕不过去的坑
90% 的 workflow 启动失败不是语法错,而是环境或路径问题。
-
EL expression error: Cannot resolve variable [jobTracker]→job.properties缺少该变量,或拼写不一致(比如用了jt却在 XML 里写${jobTracker}) -
JA009: File does not exist: hdfs://.../workflow.xml→ 路径没传对,或用户没权限读该 HDFS 目录(Oozie Server 以提交用户身份访问 HDFS) -
JA018: Could not find main class→<file></file>或<archive></archive>没正确引用 JAR,或未用#挂载别名导致类加载失败 - 使用
Sparkaction 时,spark.master必须设为yarn,且不能写local[*];Oozie 不支持本地模式 - 中文注释或 UTF-8 BOM 头会导致 XML 解析失败,保存
workflow.xml时选 “UTF-8 without BOM”
Oozie 对 XML 格式极其严格:标签闭合、命名空间、缩进无关,但大小写敏感、属性名不可错、空格不能出现在 <start to="xxx"></start> 的引号外。调试时优先看 Oozie Web Console 的日志链接,而不是终端返回信息。










