目录

  • 一、概述
  • 二、Oozie架构
  • 三、Oozie环境部署(Oozie与CDH集成)
  • 1)添加服务
  • 2)将 Oozie 服务添加到 CDH
  • 3)自定义角色分配
  • 4)数据库设置
  • 5)审核更改
  • 6)开始自动安装并自启
  • 四、CDH的 Hue 整合 Oozie
  • 五、Oozie简单使用
  • 1)在Hue上操作Oozie
  • 1、利用 Hue 调度 shell 脚本
  • 2、利用 Hue 调度 hive 脚本
  • 3、 利用 Hue 配置定时调度任务
  • 2)CLI操作Oozie
  • 1、CLI 调度 shell 脚本
  • 2、执行多个任务job
  • 3、调度MR任务
  • 4、调度定时任务
  • 3)Java API操作Oozie
  • 六、常用命令
  • 七、Oozie与Azkaban对比

一、概述

Oozie是一个基于工作流引擎的开源框架,依赖于MapReduce来实现,是一个管理 Apache Hadoop 作业的工作流调度系统。是由Cloudera公司贡献给Apache的,它能够提供对Hadoop MapReduce和Pig Jobs的任务调度与协调。Oozie需要部署到Java Servlet容器中运行。

官网:https://oozie.apache.org/ 官方文档:https://oozie.apache.org/docs/5.2.1/index.html 安装包下载地址:https://dlcdn.apache.org/oozie/5.2.1/ github源码地址:https://github.com/apache/oozie.git

Oozie的特点:

  • Oozie是管理hadoop作业的调度系统;
  • Oozie的工作流作业是一系列动作的有向无环图(DAG)
  • Oozie协调作业是通过时间(频率)和有效数据触发当前的Oozie工作流程;
  • 工作流通过hPDL定义(一种XML流程定义语言);
  • 资源文件(脚本、jar包等)存放在HDFS
  • Oozie支持各种hadoop作业,例如:java map-reduce、Streaming map-reduce、pig、hive、sqoop和distcp等等,也支持系统特定的作业,例如java程序和shell脚本;
  • Oozie是一个可伸缩,可靠和可拓展的系统。

二、Oozie架构

hadoop的left outer join 和left join hadoop oozie_xml


hadoop的left outer join 和left join hadoop oozie_CDH_02

Oozie三层结构:

  • Workflow:工作流,由我们需要处理的每个工作组成,进行需求的流式处理,是对要进行的顺序化工作的抽象。
  1. 控制节点(CONTROL NODE):控制流节点一般都是定义在工作流开始或者结束的位置,比如start,end,kill等。以及提供工作流的执行路径机制,如decision, fork, join等。
  2. 动作节点(ACTION NODE) : 负责执行具体动作的节点,比如:拷贝文件,执行某个hive、shell、sqoop、pig、mr等等。

流程图如下:

hadoop的left outer join 和left join hadoop oozie_hadoop_03

  • Coordinator:协调器,可以理解为工作流的协调器,可以将多个工作流协调成一个工作流来进行处理,是对要进行的顺序化的workflow的抽象,定时触发一个workflow。流程图如下:

hadoop的left outer join 和left join hadoop oozie_Hadoop_04

  • Bundle:捆,束。将一堆的coordinator进行汇总处理,是对一堆coordiantor的抽象,用来绑定多个coordinator或者多个workflow,流程图如下:

hadoop的left outer join 和left join hadoop oozie_xml_05

三、Oozie环境部署(Oozie与CDH集成)

一般Oozie是集成到CDH上使用的,所以这里部署就通过CM去部署了

1)添加服务

hadoop的left outer join 和left join hadoop oozie_Hadoop_06


hadoop的left outer join 和left join hadoop oozie_xml_07

2)将 Oozie 服务添加到 CDH

hadoop的left outer join 和left join hadoop oozie_hadoop_08

3)自定义角色分配

hadoop的left outer join 和left join hadoop oozie_xml_09

4)数据库设置

hadoop的left outer join 和left join hadoop oozie_CDH_10


hadoop的left outer join 和left join hadoop oozie_xml_11

5)审核更改

默认就行,当然可以自行修改

hadoop的left outer join 和left join hadoop oozie_大数据_12

6)开始自动安装并自启

hadoop的left outer join 和left join hadoop oozie_大数据_13


hadoop的left outer join 和left join hadoop oozie_大数据_14

到这里Oozie服务就安装完成了。

四、CDH的 Hue 整合 Oozie

由于oozie的xml配置执行各种任务调度是在太过于繁琐,所有一般都使用hue整合oozie来使用。

修改配置

hadoop的left outer join 和left join hadoop oozie_xml_15

重启Hue服务

hadoop的left outer join 和left join hadoop oozie_CDH_16

重新登录Hue web

hadoop的left outer join 和left join hadoop oozie_CDH_17

发现多了计划程序,这就是Oozie的计划程序

hadoop的left outer join 和left join hadoop oozie_Hadoop_18

五、Oozie简单使用

1)在Hue上操作Oozie

1、利用 Hue 调度 shell 脚本

1、创建workflow

hadoop的left outer join 和left join hadoop oozie_大数据_19


hadoop的left outer join 和left join hadoop oozie_CDH_20

2、查看workflow

hadoop的left outer join 和left join hadoop oozie_大数据_21

3、配置调用任务

这里选择shell脚本,很多选择

hadoop的left outer join 和left join hadoop oozie_大数据_22


hadoop的left outer join 和left join hadoop oozie_hadoop_23


hadoop的left outer join 和left join hadoop oozie_大数据_24


hadoop的left outer join 和left join hadoop oozie_CDH_25

保存

hadoop的left outer join 和left join hadoop oozie_xml_26

4、立即执行

hadoop的left outer join 和left join hadoop oozie_Hadoop_27


hadoop的left outer join 和left join hadoop oozie_hadoop_28

发现报错了

WARN org.apache.oozie.command.wf.ActionStartXCommand: SERVER[hadoop-cdhslave02-168-182-163] USER[admin] GROUP[-] TOKEN[] APP[myworkflow001] JOB[0000003-220423133048789-oozie-oozi-W] ACTION[0000003-220423133048789-oozie-oozi-W@shell-52b4] Error starting action [shell-52b4]. ErrorType [TRANSIENT], ErrorCode [JA009], Message [JA009: Invalid resource request! Cannot allocate containers as requested resource is greater than maximum allowed allocation. Requested resource type=[memory-mb], Requested resource=<memory:2048, vCores:1>, maximum allowed allocatinotallow=<memory:1024, vCores:4>, please note that maximum allowed allocation is calculated by scheduler based on maximum resource of registered NodeManagers, which might be less than configured maximum allocatinotallow=<memory:1024, vCores:4>

原因是 yarn配置的最大容器申请资源是1024M,oozie配置的启动资源要2048M,在CM中修改oozie的相关配置。

hadoop的left outer join 和left join hadoop oozie_Hadoop_29

重启服务后重新执行

hadoop的left outer join 和left join hadoop oozie_xml_30

再去看Yarn任务

hadoop的left outer join 和left join hadoop oozie_大数据_31

其实这里只是加了一个任务,其实可以加很多任务,接下来就可自行扩展了

2、利用 Hue 调度 hive 脚本

sql文件

create database test001;
CREATE TABLE  IF NOT EXISTS test001.person_1 (
id INT COMMENT 'ID',
name STRING COMMENT '名字',
age INT COMMENT '年龄',
likes ARRAY<STRING> COMMENT '爱好',
address MAP<STRING,STRING> COMMENT '地址'
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '-'
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n';

hadoop的left outer join 和left join hadoop oozie_CDH_32

跟前面的步骤一样,只是调度的任务不同和脚本不同而已,这里就不再过多截图介绍了。

hadoop的left outer join 和left join hadoop oozie_大数据_33

通过beeline连接hive检查

$ beeline -u jdbc:hive2://hadoop-cdhmaster-168-182-161:10000  -n root
show databases;
show tables from test001;

hadoop的left outer join 和left join hadoop oozie_hadoop_34

当然也对应有个yarn任务

hadoop的left outer join 和left join hadoop oozie_CDH_35

3、 利用 Hue 配置定时调度任务

hadoop的left outer join 和left join hadoop oozie_xml_36

选择workflow

hadoop的left outer join 和left join hadoop oozie_hadoop_37


hadoop的left outer join 和left join hadoop oozie_CDH_38

【温馨提示】一定要注意时区的问题,否则调度就出错了。保存之后就可以提交定时任务。

提交Schedule

hadoop的left outer join 和left join hadoop oozie_大数据_39


hadoop的left outer join 和left join hadoop oozie_大数据_40


hadoop的left outer join 和left join hadoop oozie_hadoop_41

2)CLI操作Oozie

Oozie 提供了一个命令行实用程序oozie来执行作业和管理任务。所有操作都是通过oozie CLI 的子命令完成的。

一个Oozie 的 job 一般由以下文件组成:

  • job.properties :记录了job的属性
  • workflow.xml :使用hPDL 定义任务的流程和分支
  • 脚本文件/lib目录:用来执行具体的任务的文件

job.properties

key

含义

nameNode

HDFS地址

jobTracker

jobTracker(ResourceManager)地址

queueName

Oozie队列(默认填写default)

examplesRoot

全局目录(默认填写examples)

oozie.usr.system.libpath

是否加载用户lib目录(true/false)

oozie.libpath

用户lib库所在的位置

oozie.wf.application.path

Oozie流程所在hdfs地址(workflow.xml所在的地址)

user.name

当前用户

oozie.coord.application.path

Coordinator.xml地址(没有可以不写)

oozie.bundle.application.path

Bundle.xml地址(没有可以不写)

【温馨提示】这个文件如果是在本地通过命令行进行任务提交的话,这个文件在本地就可以了,当然也可以放在hdfs上,与workflow.xml和lib处于同一层级。nameNodejobTrackeroozie.wf.application.path在hdfs中的位置必须设置。

1、CLI 调度 shell 脚本

oozie官方提供的oozie-examples.tar.gz
这个包里也有:https://dlcdn.apache.org/oozie/5.2.1/oozie-5.2.1.tar.gz

$ tar -xf oozie-examples.tar.gz
$ cd examples/apps/
$ ll

很多示例,这里只演示几个,其余的小伙伴可以自行练习一下

hadoop的left outer join 和left join hadoop oozie_大数据_42

进入到shell的示例目录,发现有两个配置文件job.propertiesworkflow.xml

$ cd shell

修改job.properties

# 配置hdfs,地址记得改成自己环境的
nameNode=hdfs://hadoop-cdhslave01-168-182-162:8020
# 配置yarn,8088是web端口,8032是yarn的服务端口号
resourceManager=hadoop-cdhslave01-168-182-162:8032
queueName=default
examplesRoot=examples

# HDFS脚本文件存放目录
oozie.wf.application.path=${nameNode}/user/${user.name}/workflow/shell

# 定义脚本变量,也可以直接写脚本名字
shellScript=helloworld.sh

修改workflow.xml

默认是echo输出,这里修改成执行脚本

<workflow-app xmlns="uri:oozie:workflow:1.0" name="shell-wf">
    <start to="shell-node"/>
    <action name="shell-node">
        <shell xmlns="uri:oozie:shell-action:1.0">
            <resource-manager>${resourceManager}</resource-manager>
            <name-node>${nameNode}</name-node>
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>
            </configuration>
            <exec>${shellScript}</exec>
            <file>/user/oozie/workflow/shell/${shellScript}#${shellScript}</file>
            <capture-output/>
        </shell>
        <ok to="end"/>
        <error to="fail"/>
    </action>
    <kill name="fail">
        <message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <kill name="fail-output">
        <message>Incorrect output, expected [Hello Oozie] but was [${wf:actionData('shell-node')['my_output']}]</message>
    </kill>
    <end name="end"/>
</workflow-app>

脚本:helloworld.sh

#!/bin/bash
echo `date` " hello world" >> /tmp/helloworld.log

可以在job.properties定义一个变量,在workflow.xml中使用变量
把三个文件都上传到/user/oozie/workflow/shell/目录下

$ sudo -u oozie hadoop fs -mkdir -p /user/oozie/workflow/shell/
$ sudo -u oozie hadoop fs -put * /user/oozie/workflow/shell/

hadoop的left outer join 和left join hadoop oozie_大数据_43

立即执行任务

$ sudo -u oozie /usr/bin/oozie job -oozie http://hadoop-cdhslave02-168-182-163:11000/oozie/ -config job.properties -run

hadoop的left outer join 和left join hadoop oozie_CDH_44

Oozie web UI查看,登录web时,发现有问题

hadoop的left outer join 和left join hadoop oozie_Hadoop_45

Oozie web console is disabled.
To enable Oozie web console install the Ext JS library.
Refer to Oozie Quick Start documentation for details.

【Oozie web console is disabled 问题解决】

$ find /opt/ -name libext
$ cd /opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/lib/oozie/libext
$ wget http://archive.cloudera.com/gplextras/misc/ext-2.2.zip
$ sudo unzip ext-2.2.zip
$ sudo chown oozie:oozie -R ext-2.2

执行成功了

hadoop的left outer join 和left join hadoop oozie_CDH_46

再去看一下yarn任务

hadoop的left outer join 和left join hadoop oozie_CDH_47

2、执行多个任务job

$ cd /opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/share/doc/oozie-5.1.0+cdh6.3.2/examples/apps
# copy一份shell文件
$ cp -r shell shell02
$ cd shell02

新建一个shell脚本,test02.sh

#!/bin/bash
echo "test mutil workflow" >> /tmp/test02.log

修改job.properties

# 配置hdfs,地址记得改成自己环境的
nameNode=hdfs://hadoop-cdhslave01-168-182-162:8020
# 配置yarn,8088是web端口,8032是yarn的服务端口号
resourceManager=hadoop-cdhslave01-168-182-162:8032
queueName=default
examplesRoot=examples

# HDFS脚本文件存放目录
oozie.wf.application.path=${nameNode}/user/${user.name}/workflow/shell

# 定义脚本变量,也可以直接写脚本名字
shellScript=helloworld.sh
# 新增一个脚本变量
shellScript02=test02.sh

修改workflow.xml,新增一个action

<workflow-app xmlns="uri:oozie:workflow:1.0" name="shell-wf">
    <start to="shell-node01"/>
    <action name="shell-node01">
        <shell xmlns="uri:oozie:shell-action:1.0">
            <resource-manager>${resourceManager}</resource-manager>
            <name-node>${nameNode}</name-node>
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>
            </configuration>
            <exec>${shellScript}</exec>
            <file>/user/oozie/workflow/shell/${shellScript}#${shellScript}</file>
            <capture-output/>
        </shell>
        <ok to="shell-node02"/>
        <error to="fail"/>
    </action>
    <action name="shell-node02">
        <shell xmlns="uri:oozie:shell-action:1.0">
            <resource-manager>${resourceManager}</resource-manager>
            <name-node>${nameNode}</name-node>
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>
            </configuration>
            <exec>${shellScript02}</exec>
            <file>/user/oozie/workflow/shell/${shellScript02}#${shellScript02}</file>
            <capture-output/>
        </shell>
        <ok to="end"/>
        <error to="fail"/>
    </action>

    <kill name="fail">
        <message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <kill name="fail-output">
        <message>Incorrect output, expected [Hello Oozie] but was [${wf:actionData('shell-node')['my_output']}]</message>
    </kill>
    <end name="end"/>
</workflow-app>

强制覆盖

$ sudo -u oozie hadoop fs -put -f * /user/oozie/workflow/shell/

执行任务

$ sudo -u oozie /usr/bin/oozie job -oozie http://hadoop-cdhslave02-168-182-163:11000/oozie/ -config job.properties -run

hadoop的left outer join 和left join hadoop oozie_大数据_48


hadoop的left outer join 和left join hadoop oozie_CDH_49

3、调度MR任务

直接使用官方模板修改(wordcount示例)

$ cd /opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/share/doc/oozie-5.1.0+cdh6.3.2/examples/apps/map-reduce
$ ll
$ tree lib/

hadoop的left outer join 和left join hadoop oozie_Hadoop_50

先用传统方式验证一把

$ cat>./wordcount.txt<< EOF
hello oozie
hello hadoop
hadoo oozie
hello world
hello bigdata
bigdata hadoop
hello flink
EOF
$ sudo -u hdfs hadoop fs -put wordcount.txt /
# 找到hadoop-mapreduce-examples*.jar包
$ find /opt/ -name hadoop-mapreduce-examples*.jar
$ sudo -u hdfs yarn jar /opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/jars/hadoop-mapreduce-examples-3.0.0-cdh6.3.2.jar wordcount /wordcount.txt /out

hadoop的left outer join 和left join hadoop oozie_hadoop_51

配置workflow.xml

先在上面的跑的任务中查找map类和reduce

hadoop的left outer join 和left join hadoop oozie_CDH_52


hadoop的left outer join 和left join hadoop oozie_CDH_53

map类

hadoop的left outer join 和left join hadoop oozie_大数据_54

reduce类

hadoop的left outer join 和left join hadoop oozie_大数据_55

修改后的workflow.xml内容如下:

<workflow-app xmlns="uri:oozie:workflow:1.0" name="map-reduce-wf">
    <start to="mr-node"/>
    <action name="mr-node">
        <map-reduce>
            <resource-manager>${resourceManager}</resource-manager>
            <name-node>${nameNode}</name-node>
            <prepare>
                <delete path="${nameNode}/user/oozie/workflow/map-reduce/output/"/>
            </prepare>
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>
                <!-- 配置MR调度任务时,设置使用新的API-->
                <property>
                    <name>mapred.mapper.new-api</name>
                    <value>true</value>
                </property>
                <property>
                    <name>mapred.reducer.new-api</name>
                    <value>true</value>
                </property>
                <!-- 指定job key输出类型 -->
                <property>
                    <name>mapreduce.job.output.key.class</name>
                    <value>org.apache.hadoop.io.Text</value>
                </property>
                <!-- 指定job value输出类型 -->
                <property>
                    <name>mapreduce.job.output.value.class</name>
                    <value>org.apache.hadoop.io.IntWritable</value>
                </property>
                <!-- 指定输入路径 -->
                <property>
                    <name>mapred.input.dir</name>
                    <value>/user/oozie/workflow/map-reduce/wordcount.txt</value>
                </property>
                <!-- 指定输出路径 -->
                <property>
                    <name>mapred.output.dir</name>
                    <value>/user/oozie/workflow/map-reduce/output/</value>
                </property>
                <!-- 指定map类 -->
                <property>
                    <name>mapreduce.job.map.class</name>
                    <value>org.apache.hadoop.examples.WordCount$TokenizerMapper</value>
                </property>
                <!-- 指定reduce类 -->
                <property>
                    <name>mapreduce.job.reduce.class</name>
                    <value>org.apache.hadoop.examples.WordCount$IntSumReducer</value>
                </property>
                <property>
                    <name>mapred.map.tasks</name>
                    <value>1</value>
                </property>
            </configuration>
        </map-reduce>
        <ok to="end"/>
        <error to="fail"/>
    </action>
    <kill name="fail">
        <message>Map/Reduce failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <end name="end"/>
</workflow-app>

修改job.properties,内容如下:

# 配置hdfs,地址记得改成自己环境的
nameNode=hdfs://hadoop-cdhslave01-168-182-162:8020
# 配置yarn,8088是web端口,8032是yarn的服务端口号
resourceManager=hadoop-cdhslave01-168-182-162:8032
queueName=default
examplesRoot=examples

oozie.wf.application.path=${nameNode}/user/${user.name}/workflow/map-reduce/workflow.xml

# 定义脚本变量,也可以直接写脚本名字
outputDir=map-reduce

换掉lib下面的jar包,使用新API

$ cd /opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/share/doc/oozie-5.1.0+cdh6.3.2/examples/apps
$ cp /opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/jars/hadoop-mapreduce-examples-3.0.0-cdh6.3.2.jar map-reduce/lib/
$ rm -f map-reduce/lib/oozie-examples-5.1.0-cdh6.3.2.jar

把map-reduce目录推到HDFS上

$ sudo -u oozie hadoop fs -put -f map-reduce /user/oozie/workflow/

hadoop的left outer join 和left join hadoop oozie_xml_56

执行任务

$ sudo -u oozie /usr/bin/oozie job -oozie http://hadoop-cdhslave02-168-182-163:11000/oozie/ -config map-reduce/job.properties -run

登录Oozie web UI:http://hadoop-cdhslave02-168-182-163:11000/oozie/

hadoop的left outer join 和left join hadoop oozie_Hadoop_57

登录yarn web查看任务

hadoop的left outer join 和left join hadoop oozie_hadoop_58

4、调度定时任务

$ cd /opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/share/doc/oozie-5.1.0+cdh6.3.2/examples/apps
$ cd cron

修改job.properties,内容如下:

nameNode=hdfs://hadoop-cdhslave01-168-182-162:8020
resourceManager=hadoop-cdhslave01-168-182-162:8032
queueName=default
examplesRoot=examples

oozie.coord.application.path=${nameNode}/user/${user.name}/workflow/cron
# start必须设置未来时间,否则任务会失败
start=2022-04-27T23:30Z
end=2022-04-29T01:00Z
workflowAppUri=${nameNode}/user/${user.name}/workflow/cron
shellScript=test001.sh

修改workflow.xml,其实也是上面第一个示例

<workflow-app xmlns="uri:oozie:workflow:1.0" name="shell-wf">
    <start to="shell-node"/>
    <action name="shell-node">
        <shell xmlns="uri:oozie:shell-action:1.0">
            <resource-manager>${resourceManager}</resource-manager>
            <name-node>${nameNode}</name-node>
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>
            </configuration>
            <exec>${shellScript}</exec>
            <file>/user/oozie/workflow/cron/${shellScript}#${shellScript}</file>
            <capture-output/>
        </shell>
        <ok to="end"/>
        <error to="fail"/>
    </action>
    <kill name="fail">
        <message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <kill name="fail-output">
        <message>Incorrect output, expected [Hello Oozie] but was [${wf:actionData('shell-node')['my_output']}]</message>
    </kill>
    <end name="end"/>
</workflow-app>

修改coordinator.xml,内容如下:

frequency频率最低五分钟,时区调整为中国时区

<coordinator-app name="cron-coord" frequency="${coord:minutes(5)}" start="${start}" end="${end}" timezone="GMT+0800"
                 xmlns="uri:oozie:coordinator:0.2">
        <action>
        <workflow>
            <app-path>${workflowAppUri}</app-path>
            <configuration>
                <property>
                    <name>resourceManager</name>
                    <value>${resourceManager}</value>
                </property>
                <property>
                    <name>nameNode</name>
                    <value>${nameNode}</value>
                </property>
                <property>
                    <name>queueName</name>
                    <value>${queueName}</value>
                </property>
            </configuration>
        </workflow>
    </action>
</coordinator-app>

把cron整个目录推送到HDFS

$ cd ..
$ sudo -u oozie hadoop fs -put cron /user/oozie/workflow/

执行

$ sudo -u oozie /usr/bin/oozie job -oozie http://hadoop-cdhslave02-168-182-163:11000/oozie/ -config cron/job.properties -run

3)Java API操作Oozie

1、编辑好shell脚本和workflow.xml文件

$ mkdir -p /opt/test/oozie/workflow/shell
$ vi /opt/test/oozie/workflow/shell/ooziehello.sh
#!/bin/bash
name=$1
echo "hello $name" >> /tmp/oozieshell.log

$ vi /opt/test/oozie/workflow/shell/workflow.xml
<workflow-app xmlns="uri:oozie:workflow:1.0" name="shell-wf">
    <start to="shell-node"/>
    <action name="shell-node">
        <shell xmlns="uri:oozie:shell-action:1.0">
            <resource-manager>${resourceManager}</resource-manager>
            <name-node>${nameNode}</name-node>
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>
            </configuration>
            <exec>${shellScript}</exec>
            <file>/user/oozie/workflow/oozieshell/${shellScript}#${shellScript}</file>
            <capture-output/>
        </shell>
        <ok to="end"/>
        <error to="fail"/>
    </action>
    <kill name="fail">
        <message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <kill name="fail-output">
        <message>Incorrect output, expected [Hello Oozie] but was [${wf:actionData('shell-node')['my_output']}]</message>
    </kill>
    <end name="end"/>
</workflow-app>

3、把上面两个文件上传到HDFS

$ sudo -u oozie hadoop fs -mkdir /user/oozie/workflow/oozieshell/
$ sudo -u oozie hadoop fs -put * /user/oozie/workflow/oozieshell/

4、代码执行提交任务

package com.bigdata;

/**
 * workflow shell test
 */

import org.apache.oozie.client.OozieClient;
import org.apache.oozie.client.WorkflowAction;
import org.apache.oozie.client.WorkflowJob;
import java.util.List;
import java.util.Properties;

public class WorkFlowShellTest {
    public static void main(String[] args) {
        System.setProperty("user.name", "oozie");
        OozieClient oozieClient = new OozieClient("http://hadoop-cdhslave02-168-182-163:11000/oozie/");
        try {
            System.out.println(oozieClient.getServerBuildVersion());
            Properties properties = oozieClient.createConfiguration();
            properties.put("oozie.wf.application.path", "${nameNode}/user/${user.name}/workflow/oozieshell");
            properties.put("queueName", "default");
            properties.put("nameNode", "hdfs://hadoop-cdhslave01-168-182-162:8020");
            properties.put("resourceManager", "hadoop-cdhslave01-168-182-162:8032");
            properties.put("shellScript", "ooziehello.sh");
            properties.put("argument", "oozie");
            //运行workflow
            String jobid = oozieClient.run(properties);
            System.out.println("jobid:" + jobid);
            //根据workflow id获取作业运行情况
            WorkflowJob workflowJob = oozieClient.getJobInfo(jobid);
            //获取作业日志
            System.out.println(oozieClient.getJobLog(jobid));
            //获取workflow中所有ACTION
            List<WorkflowAction> list = workflowJob.getActions();
            for (WorkflowAction action : list) {
                //输出每个Action的 Appid 即Yarn的Application ID
                System.out.println(action.getExternalId());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

hadoop的left outer join 和left join hadoop oozie_大数据_59


hadoop的left outer join 和left join hadoop oozie_大数据_60

其它的示例也类似,就是把之前的job.properties,用java格式加载,运行,查询,其它都一样。所以其它示例就由小伙伴自行练习了。

六、常用命令

# 启动
$ oozied.sh start
# 停止
$ oozied.sh stop
# 提交任务并启动任务(submit和start命令合并)
$ oozie job -oozie http://hadoop-cdhslave02-168-182-163:11000/oozie -config job.properties –run
# 提交任务不启动
$ oozie job -oozie http://hadoop-cdhslave02-168-182-163:11000/oozie -config job.properties –submit
# 启动任务
$ oozie job -oozie http://hadoop-cdhslave02-168-182-163:11000/oozie -start 0001837-220423150913947-oozie-oozi-W

### workflow任务
# 查看所有workflow任务
$ oozie jobs
# 查看信息
$ oozie job -oozie http://hadoop-cdhslave02-168-182-163:11000/oozie -info 0001837-220423150913947-oozie-oozi-W
# 查看日志
$ oozie job -oozie http://hadoop-cdhslave02-168-182-163:11000/oozie -log 0001837-220423150913947-oozie-oozi-W
# Kill任务
$ oozie job -oozie http://hadoop-cdhslave02-168-182-163:11000/oozie/ -kill 0001831-220423150913947-oozie-oozi-W
# 或者下面这句
$ oozie job -kill 0001831-220423150913947-oozie-oozi-W

### coordinator 定时任务
# 查看定时任务
$ oozie jobs -jobtype coordinator -oozie http://hadoop-cdhslave02-168-182-163:11000/oozie/
$ oozie jobs -jobtype coordinator
# 删除定时任务
$ oozie job -kill 0000345-220423150913947-oozie-oozi-C

七、Oozie与Azkaban对比

对比指标

Azkaban

Oozie

功能

Azkaban与Oozie均可以调度mapreduce、pig、java脚本工作流任务;Azkaban与Oozie均可以定时执行工作流任务。

与Azkaban 一样

工作流传参

Azkaban支持直接传参,例如${input}。

Oozie支持参数和EL表达式,例如${fs:dirSize(myInputDir)}。

定时执行

Azkaban的定时执行任务是基于时间的。

Oozie的定时执行任务是基于时间和输入数据资源管理。

工作流执行

Azkaban有两种运行模式,分别是solo server mode(executor server和web server部署在同⼀台节点)和multi server mode(executor server和web server可以部署在不同节点)。

Oozie作为工作流服务运行,支持多用户和多工作流。

综上所述,Oozie相比Azkaban是一个重量级的任务调度系统,功能全面,但配置使用也更复杂(xml)。如果可以不在意某些功能的缺失,轻量级调度Azkaban是很不错的候选对象。所以如果不是用CDH,还是使用Azkaban方便简单~