Oozie workflow.xml是什么 如何用它来定义Hadoop工作流

1次阅读

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

Oozie workflow.xml是什么 如何用它来定义Hadoop工作流

workflow.xml 是 Oozie 用来声明式定义 Hadoop 工作流的 XML 文件,本质是一个 DAG(有向无环图)描述:每个节点代表一个操作(如 mapreducesparkShellForkJoin),边代表执行顺序与依赖关系。

它不是脚本,不写逻辑;而是“蓝图”——Oozie Server 读取后解析、调度、监控并容错执行。


workflow.xml 的基本结构长什么样

必须包含 <workflow-app></workflow-app> 根元素,定义 namexmlns,内部以 <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:8050
    nameNode=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,或未用 # 挂载别名导致类加载失败
  • 使用 Spark action 时,spark.master 必须设为 yarn,且不能写 local[*];Oozie 不支持本地模式
  • 中文注释或 UTF-8 bom 头会导致 XML 解析失败,保存 workflow.xml 时选 “UTF-8 without BOM”

Oozie 对 XML 格式极其严格:标签闭合、命名空间、缩进无关,但大小写敏感、属性名不可错、空格不能出现在 <start to="xxx"></start> 的引号外。调试时优先看 Oozie Web console 的日志链接,而不是终端返回信息。

text=ZqhQzanResources