作者:feify_fei512_478 | 来源:互联网 | 2023-09-13 17:27
一、oozie介绍
官网首页介绍:http://oozie.apache.org
(1)Oozie是一个管理 Apache Hadoop 作业的工作流调度系统。
(2)Oozie的 workflow jobs 是由 actions 组成的 有向无环图(DAG)。
(3)Oozie的 coordinator jobs 是由时间 (频率)和数据可用性触发的重复的 workflow jobs 。
(4)Oozie与Hadoop生态圈的其他部分集成在一起,支持多种类型的Hadoop作业(如Java map-reduce、流式map-reduce、Pig、Hive、Sqoop和Distcp)以及特定于系统的工作(如ava程序和shell脚本)。
(5)Oozie是一个可伸缩、可靠和可扩展的系统。
二、对比选型
简单项目的话可以用crontab来做控制,但是项目比较复杂的话会发现还是有很多不方便的,比如失败重启和日志查看等问题,所以我们通常在Azkaban和oozie之间做对比,选择适合自己公司或者项目的任务调度工具
- 执行方式:Oozie底层在提交Hadoop Spark作业而Azkaban是直接操作shell语句。
- 工作流定义: Oozie是通过xml定义的而Azkaban为properties来定义。
- 部署过程: Oozie的部署相对困难些,同时它是从Yarn上拉任务日志。
- 任务检测: Azkaban中如果有任务出现失败,只要进程有效执行,那么任务就算执行成功,这是BUG,但是Oozie能有效的检测任务的成功与失败。
- 操作工作流: Azkaban使用Web操作。Oozie支持Web,RestApi,Java API操作。
- 权限控制: Oozie基本无权限控制,Azkaban有较完善的权限控制,供用户对工作流读写执行操作。
- 运行环境: Oozie的action主要运行在hadoop中而Azkaban的actions运行在Azkaban的服务器中。
- 记录workflow的状态: Azkaban将正在执行的workflow状态保存在内存中,Oozie将其保存在Mysql中。
- 出现失败的情况: Azkaban会丢失所有的工作流,但是Oozie可以在继续失败的工作流运行
两者在功能方面大致相同,在安全性上可能Oozie会比较好,加之我们选择了CDH作为大数据平台,所以就用了其自带的oozie工具,且有相应的可视化操作工具hue配套使用,较为便捷。
三、架构原理
Oozie主要有三个层层包裹的主要概念
- Workflow:工作流,由我们需要处理的每个工作组成,进行需求的流式处理,是对要进行的顺序化工作的抽象。
- Coordinator:协调器,可以理解为工作流的协调器,可以将多个工作流协调成一个工作流来进行处理,是对要进行的顺序化的workflow的抽象。
- Bundle:捆,束。将一堆的coordinator进行汇总处理,是对一堆coordiantor的抽象。
关于oozie的作业
Oozie的作业有三部分组成,分别是job.properties,workflow.xml,lib文件夹。下面分别介绍
Job.properties
从名称也能看出来,这个文件是用来配置作业(job)中用到的各种参数的,总结如下
注:
1、这个文件如果是在本地通过命令行进行任务提交的话,这个文件在本地就可以了,当然也可以放在hdfs上,与workflow.xml和lib处于同一层级。
2、nameNode,jobTracker和workflow.xml在hdfs中的位置必须设置。
一个简单的job.properties文件如下:
nameNode=hdfs://cm1:8020
jobTracker=cm1:8032
queueName=default
examplesRoot=examples
oozie.wf.application.path=${nameNode}/user/workflow/oozie/shell
workflow.xml:
这个文件是定义任务的整体流程的文件,需要注意的有三点:版本信息,EL函数,节点信息。
先上一个例子:
01.
02.
03.
04.
05.
06. ${fs:exists(concat(concat("/xxx/output/xxxList/",
07. task_id),"/_SUCCESS"))}
08.
09.
10.
11.
12.
13.
14. ${fs:exists(concat(concat(“/xxx/output/", task_id),"/_SUCCESS"))}
15.
16.
17.
18.
19.
20.
21. ${jobTracker}
22. ${namenode}
23.
24.
25. mapreduce.job.queuename
26. ${queueName}
27.
28.
29. com.xxx.Main
30.
31.
32.
33.
34.
35. Map/Reduce failed.error message[${wf:errorMessage(wf:lastErrorNode())}]
36.
37.
38.
- 版本信息:
这个是写在第一行的,如下:
在xmls属性中定义了workflow的版本为0.4,workflow的版本不能高于oozie兼容的最高版本,可以降低。
- EL函数
常用的EL函数有基本的EL函数,workFlow EL函数和HDFSEL函数。分别如下:
- 节点:
Oozie的节点分成两种,流程控制节点和动作节点。所谓的节点实际就是一组标签。两种节点分别如下:
A. 流程控制节点
-
——定义workflow的开始
-
——定义workflow的结束
-
——实现switch功能
-
标签连用
- ——调用子workflow
-
——程序出错后跳转到这个节点执行相关操作
-
——并发执行workflow
-
——并发执行结束(与fork一起使用)
案例:
B. 动作节点
-
——表示运行的是shell操作
-
——表示运行的java程序
-
——表示是对hdfs进行操作
-
——表示进行的是MR操作
-
——表示进程的是hive操作
-
——表示进行的是sqoop的相关操作
Workflow.xml综述
文件需要被放在HDFS上才能被oozie调度,如果在启动需要调动MR任务,jar包同样需要在hdfs上。最终的目录结构如下:
/xxx/oozie/workflow.xml
/xxx/oozie/lib
/xxx/oozie/lib/mr-1.7-SNAPSHOT-**package**.jar
/xxx/oozie/lib/xxx.mr-1.7-SNAPSHOT-**package**.jar
Lib文件夹:
在workflow工作流定义的同级目录下,需要有一个lib目录,在lib目录中存在java节点MapReduce使用的jar包。需要注意的是,oozie并不是使用指定jar包的名称来启动任务的,而是通过制定主类来启动任务的。在lib包中绝对不能存在某个jar包的不同版本,不能够出现多个相同主类。
四、安装搭建
在搭建好CDH后,可以直接通过添加服务的方式实现oozie的安装,比较方便。当然也可以在服务器上搭建独立的oozie服务,具体可参考https://oozie.apache.org/docs/5.0.0/AG_Install.html
搭设后进入oozie web控制台,地址为:OozieserverIp:11000/oozie/ (OozieserverIp为oozie所在的服务器的ip地址),界面如下:
注:如果界面报错 Oozie web console is disabled,请看https://docs.cloudera.com/documentation/enterprise/5-5-x/topics/admin_oozie_console.html
五、开发使用
1.拷贝官方自带实例模板
cp -r examples/apps/shell/ oozie-apps
2.修改job.properties
nameNode=hdfs://hadoop:8020
jobTracker=hadoop:8032
queueName=default
examplesRoot=oozie-apps
oozie.wf.application.path=${nameNode}/user/hadoop/${examplesRoot}/shell
EXEC=mem.sh #放一个脚本文件,脚本文件名称
3.修改workflow.xml
${jobTracker}${nameNode}mapred.job.queue.name${queueName}${EXEC}${nameNode}/user/hadoop/${examplesRoot}/shell/${EXEC}#${EXEC}Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]
4.在shell目录下创建mem.sh
#!/bin/sh
/usr/bin/date -R >> /opt/modules/oozie-4.1.0-cdh5.7.0/oozie-apps/shell/1.log
/usr/bin/free -m >> /opt/modules/oozie-4.1.0-cdh5.7.0/oozie-apps/shell/1.log
/usr/bin/df -lh >> /opt/modules/oozie-4.1.0-cdh5.7.0/oozie-apps/shell/1.log
echo ------------------- >> /opt/modules/oozie-4.1.0-cdh5.7.0/oozie-apps/shell/1.log
注:/usr/bin/date为命令绝对路径,可以通过which date获得
5.上传到hdfs
bin/hdfs dfs -put /opt/modules/oozie-4.1.0-cdh5.7.0/oozie-apps/shell /user/hadoop/oozie-apps/
6.执行:
bin/oozie job -oozie http://hadoop:11000/oozie -config oozie-apps/shell/job.properties -run
7.检查结果
cat /opt/modules/oozie-4.1.0-cdh5.7.0/oozie-apps/shell/1.log