大数据组件之oozie

一、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.  <workflow-app xmlns="uri:oozie:workflow:0.4" name="${sys_name}-MonitorPlus-Task-${task_id}">  
02.      <start to=“check-xxx-succ-flag"/>  
03.    
04.      <decision name=“check-xxx-succ-flag">  
05.          <switch>  
06.  <case to="check-mr-succ-flag">${fs:exists(concat(concat("/xxx/output/xxxList/",   
07.       task_id),"/_SUCCESS"))}</case>  
08.  <default to=“do-xxx"/>  
09.          </switch>  
10.     </decision>  
11.   
12.     <decision name="check-mr-succ-flag">  
13.         <switch>  
14.             <case to="end">${fs:exists(concat(concat(“/xxx/output/", task_id),"/_SUCCESS"))}</case>  
15.             <default to="do-mr"/>  
16.         </switch>  
17.     </decision>  
18.   
19.     <action name=“do-xxx" retry-max="3" retry-interval="10">  
20.         <java>  
21.             <job-tracker>${jobTracker}</job-tracker>  
22.             <name-node>${namenode}</name-node>  
23.             <configuration>  
24.                 <property>  
25.                     <name>mapreduce.job.queuename</name>  
26.                     <value>${queueName}</value>  
27.                 </property>  
28.             </configuration>  
29.            <main-class>com.xxx.Main</main-class>       
30.          </java>
31.        <ok to=”end”/>
32.        <error to=”fail”/>
33.     </action>
34.     <kill name=”fail”>
35.         <message>Map/Reduce failed.error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
36.     </kill>
37.     <end name=”end”/>
38. </workflow-app>
  1. 版本信息:
    这个是写在第一行的,如下:
<workflow-app xmlns="uri:oozie:workflow:0.4" name="${sys_name}-MonitorPlus-Task-${task_id}">

在xmls属性中定义了workflow的版本为0.4,workflow的版本不能高于oozie兼容的最高版本,可以降低。

  1. EL函数
    常用的EL函数有基本的EL函数,workFlow EL函数和HDFSEL函数。分别如下:
  1. 节点:
    Oozie的节点分成两种,流程控制节点和动作节点。所谓的节点实际就是一组标签。两种节点分别如下:

A. 流程控制节点

  • <start />——定义workflow的开始
  • <end />——定义workflow的结束
  • <decision />——实现switch功能
  • <switch><case /><default /></switch>标签连用
  • <sub-workflow>——调用子workflow
  • <kill />——程序出错后跳转到这个节点执行相关操作
  • <fork />——并发执行workflow
  • <join />——并发执行结束(与fork一起使用)

案例:


B. 动作节点

  • <shell />——表示运行的是shell操作
  • <java />——表示运行的java程序
  • <fs />——表示是对hdfs进行操作
  • <MR />——表示进行的是MR操作
  • <hive />——表示进程的是hive操作
  • <sqoop />——表示进行的是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控制台

注:如果界面报错 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

<start to="shell-node"/>
    <action name="shell-node">
        <shell xmlns="uri:oozie:shell-action:0.2">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>
            </configuration>
            <exec>${EXEC}</exec>    
            <file>${nameNode}/user/hadoop/${examplesRoot}/shell/${EXEC}#${EXEC}</file>  
        </shell>
        <ok to="end"/>
        <error to="fail"/>
    </action>   
    <kill name="fail">
        <message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>   
    <end name="end"/>

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容