Oozie学习

|

一、Oozie介绍

1、基本内容

• Oozie是用于 Hadoop 平台的开源的工作流调度引擎。

工作流:

分为开始 , 中间过程 ,结束 等流程

定时调度: Crontab

• 用来管理Hadoop作业。
• 属于web应用程序,由Oozie client和Oozie Server两个组件构成。
• Oozie Server运行于Java Servlet容器(Tomcat)中的web程序。
• 官网:https://oozie.apache.org/

2、Oozie作用

– 统一调度hadoop系统中常见的mr任务启动、hdfs操作、shell调度、hive操作等
– 使得复杂的依赖关系、时间触发、事件触发使用xml语言进行表达,开发效率提高
– 一组任务使用一个DAG来表示,使用图形表达流程逻辑更加清晰
– 支持很多种任务调度,能完成大部分hadoop任务处理
– 程序定义支持EL常量和函数,表达更加丰富

二、Oozie架构

三者是递进关系:Workflow(工作流) → Coordinator(协调器) → Bundle( 束;捆)

三、Oozie安装

• 安装方式:
– 手动安装
– Cloudera Manger添加服务

• Oozie Web控制台
– 解压ext-2.2到/var/lib/oozie目录下

1
2
3
4
yum install unzip -y 
unzip ext-2.2.zip -d /var/lib/oozie/
## unzip --help
##-d extract files into exdir 将文件解压到指定目录

– Oozie服务中配置启用web控制台
– 保存,重启oozie服务

• Oozie配置

– 1、节点内存配置
– 2、 oozie.service.callablequeueservice.callable.concurrency(节点并发)
– 3、 oozie.service.callablequeueservice.queue.size(队列大小)
– 4、 oozie.service.ActionService.executor.ext.classes(扩展)

• Oozie共享库 (存放一些常用的 jar 包)

(该路径在HDFS上) /user/oozie/share/lib

• web管理地址

入口一:

原生入口

1
2
>  http://oozie_host_ip:11000/oozie/
>

提交任务后,需要手点击刷新

入口二:

HUE

在CDH中添加HUE服务,点击进入HUE→快速链接:Hue Web UI

1
2
>  http://oozie_host_ip:8888
>

在Query Editor中选择Hive/Impala查询 ,直接写SQL

无需手动刷新

有文件浏览器 、 Job Browser (MR的Job)

• oozie管理

– 任务列表查看
– 任务状态查看
– 流程返回信息
– 节点信息查看
– 流程图信息
– 日志查看
– 系统信息查看和配置

四、Oozie CLI 命令

• 启动任务:

(涉及到权限问题时,切换用户: su - hdfs 切换文件用户组:chown hdfs:hdfs job.properties)

(查询端口号:netstat -anpt | grep 8032 或 lsof -i 8032 )

1
oozie job -oozie http://ip:11000/oozie/ -config job.properties -run

• 停止任务:

1
oozie job -oozie http://ip:11000/oozie/ -kill 0000002-150713234209387-oozie-oozi-W

• 提交任务:

1
oozie job -oozie http://ip:11000/oozie/ -config job.properties –submit

• 开始任务:

1
oozie job -oozie http://ip:11000/oozie/ -config job.properties –start 0000003-150713234209387-oozie-oozi-W

• 查看任务执行情况:

1
oozie job -oozie http://ip:11000/oozie/ -config job.properties –info 0000003-150713234209387-oozie-oozi-W

五、Oozie配置

1、Job配置

  • 共享库在HDFS上
  • 后两个地址可以不配

2、WorkFlow配置

workflow.xml

1、版本信息

1
<workflow-app xmlns="uri:oozie:workflow:0.4" name=“workflow name">

2、EL函数

– 基本的EL函数

• String firstNotNull(String value1, String value2)
• String concat(String s1, String s2)
• String replaceAll(String src, String regex, String replacement)
• String appendAll(String src, String append, String delimeter)
• String trim(String s)
• String urlEncode(String s)
• String timestamp()
• String toJsonStr(Map) (since Oozie 3.3)
• String toPropertiesStr(Map) (since Oozie 3.3)
• String toConfigurationStr(Map) (since Oozie 3.3)

– WorkFlow EL

• String wf:id() – 返回当前workflow作业ID
• String wf:name() – 返回当前workflow作业NAME
• String wf:appPath() – 返回当前workflow的路径
• String wf:conf(String name) – 获取当前workflow的完整配置信息
• String wf:user() – 返回启动当前job的用户
• String wf:callback(String stateVar) – 返回结点的回调URL,其中参数为动作指定的退出状态
• int wf:run() – 返回workflow的运行编号,正常状态为0
• Map wf:actionData(String node) – 返回当前节点完成时输出的信息
• int wf:actionExternalStatus(String node) – 返回当前节点的状态
• String wf:lastErrorNode() – 返回最后一个ERROR状态推出的节点名称
• String wf:errorCode(String node) – 返回指定节点执行job的错误码,没有则返回空
• String wf:errorMessage(String message) – 返回执行节点执行job的错误信息,没有则返回空

– HDFS EL
• boolean fs:exists(String path)
• boolean fs:isDir(String path)
• long fs:dirSize(String path) – 目录则返回目录下所有文件字节数;否则返回-1
• long fs:fileSize(String path) – 文件则返回文件字节数;否则返回-1
• long fs:blockSize(String path) – 文件则返回文件块的字节数;否则返回-1

3、节点

A、流程控制节点

• start – 定义workflow开始
• end – 定义workflow结束
• decision – 实现switch功能

1
2
3
4
5
6
7
8
<decision name="[NODE-NAME]">
<switch>
<case to="[NODE_NAME]">[PREDICATE]</case>
...
<case to="[NODE_NAME]">[PREDICATE]</case>
<default to="[NODE_NAME]" />
</switch>
</decision>

• sub-workflow – 调用子workflow
• kill – 杀死workflow
• fork – 并发执行workflow

• join – 并发执行结束(与fork一起使用)

1
2
3
4
5
6
7
8
<fork name="[FORK-NODE-NAME]">
<!--并发执行-->
<path start="[NODE-NAME]" />
...
<path start="[NODE-NAME]" />
</fork>
...
<join name="[JOIN-NODE-NAME]" to="[NODE-NAME]" />

B、动作节点

1
<action>

• shell
• java
• fs
• MR
• hive
• sqoop

  • Shell节点

    —job.properties

1
2
3
4
5
6
nameNode=hdfs://node1:8020
jobTracker=node1:8021
queueName=default
examplesRoot=examples
##workflow.xml文件所在的路径
oozie.wf.application.path=${nameNode}/user/workflow/oozie/shell

–-workflow.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<workflow-app xmlns="uri:oozie:workflow:0.3" name="shell-wf">
<start to="shell-node"/>
<action name="shell-node">
<shell xmlns="uri:oozie:shell-action:0.1">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>

<!--真正的执行业务逻辑: 打印-->
<exec>echo</exec>
<argument>hi shell in oozie</argument>

</shell>
<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>
  • 调用impala

—job.properties

1
2
3
4
5
6
7
nameNode=hdfs://node1:8020
jobTracker=node1:8032
queueName=default
examplesRoot=examples
oozie.usr.system.libpath=true
oozie.libpath=${namenode}/user/${user.name}/workflow/impala/lib
oozie.wf.application.path=${nameNode}/user/${user.name}/workflow/impala

–-workflow.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<workflow-app xmlns="uri:oozie:workflow:0.4" name="impala-wf">
<start to="shell-node"/>
<action name="shell-node">
<shell xmlns="uri:oozie:shell-action:0.1">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<exec>impala-shell</exec>
<argument>-i</argument>
<argument>node2</argument>
<argument>-q</argument>
<argument>invalidate metadata</argument>
<capture-output/>
</shell>
......
</action>
.......
</workflow-app>
  • fs节点

– - workflow.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.5">
...
<action name="[NODE-NAME]">
<fs>
<delete path='[PATH]'/>
<mkdir path='[PATH]'/>
<move source='[SOURCE-PATH]' target='[TARGET-PATH]'/>
<chmod path='[PATH]' permissions='[PERMISSIONS]' dir-files='false' />
<touchz path='[PATH]' />
<chgrp path='[PATH]' group='[GROUP]' dir-files='false' />
</fs>
<ok to="[NODE-NAME]"/>
<error to="[NODE-NAME]"/>
</action>
</workflow-app>
  • Java节点

—- job.properties

1
2
3
4
5
6
7
nameNode=hdfs://node1:8020
jobTracker=node1:8032
queueName=default
examplesRoot=examples
oozie.usr.system.libpath=true
oozie.libpath=${nameNode}/user/workflow/lib/lib4java
oozie.wf.application.path=${nameNode}/user/workflow/oozie/java

—-workflow.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<workflow-app xmlns="uri:oozie:workflow:0.3" name="mr-wc-wf">
<start to="mr-node"/>
<action name="mr-node">
<java>
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<prepare>
<delete path="${nameNode}/user/path" />
<mkdir path="${nameNode}/user/path" />
</prepare>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<!--<arg>args1</arg>
<arg>args2</arg>-->
<main-class>com.pagename.classname</main-class>
</java>
<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>
文章目录
  1. 一、Oozie介绍
    1. 1、基本内容
    2. 2、Oozie作用
  2. 二、Oozie架构
  3. 三、Oozie安装
  4. 四、Oozie CLI 命令
  5. 五、Oozie配置
    1. 1、Job配置
    2. 2、WorkFlow配置
      1. 1、版本信息
      2. 2、EL函数
      3. 3、节点
        1. Shell节点
        2. 调用impala
        3. fs节点
|
载入天数...载入时分秒...