Oozie

为什么要有Oozie?

在数据业务场景,对于数据的处理往往是分阶段处理,而不同的阶段可能采用了不同的技术框架去完成这个业务需求,且可能在不同的阶段要干不同的事。

炒饭(锅) à 吃饭(碗) à 筷子(动手)

要吃饭就要等炒饭先用锅炒好,要用筷子动手吃饭就要等碗里装了饭,这是一个流水线式的过程,如果用设定时间的方式,到了什么时候就拿完去装饭,但如果今天兼职的人特别多,那么炒的饭必然就多了,时间也长了,但是设定时间到了,还没炒好,可是有一堆人挤在厨房喊要饭,问题就出现了。

于是有的人会想,如果有一个监督人帮我去这个监控、通知、控制好整个流程,那样多好啊,厨房就不会给天天催了,也不会发生拥挤的情况。

      小结:一个完整的数据分析系统通常是由大量的任务单元组成,Shell脚本、Java程序、MapReduce程序、Hive脚本等等,各个任务单元之间存在时间先后及前后依赖关系。

      为了很好的组织这样的复杂执行计划,需要一个工作流调度系统来调用执行。

      简单的工作流调度:Liunx的crontab来定义

      复杂的工作流调度:Oozie、Azakaban等。。。



主流几款工作流调度框架

特性HamakeOozieAzkabanCascading

工作流描述语言XMLXML (xPDL based)text file with key/value  pairsJava API

依赖机制data-drivenexplicitexplicitexplicit

是否要web容器NoYesYesNo

进度跟踪console/log messagesweb pageweb pageJava API

Hadoop job调度支持noyesyesyes

运行模式command line utilitydaemondaemonAPI

Pig支持yesyesyesyes

事件通知nononoyes

需要安装noyesyesno

支持的hadoop版本0.18+0.20+currently unknown0.18+

重试支持noworkflownode  evelyesyes

运行任意命令yesyesyesyes

Amazon EMR支持yesnocurrently unknownyes



什么是Oozie?

      Oozie(驯象人)是一个基于工作流引擎的开源框架,由Cloudera公司贡献给Apache的,用在一个工作流内以一个特定顺序运行一组工作或流程。

      Oozie在集群中扮演的是定时调度任务,多任务,并开源按照业务逻辑顺序调度。



组成

Workflow顺序执行流程节点,执行分支多节点或合并多分点为一个分支。

Coordinator定时触发Workflow

BundleJob绑定多个Coordinator


Oozie节点

      控制流节点(Control Flow Nodes):一般都是定义在工作流开始或结束,比如start、end、kill等,以及提供工作流的执行路径。

      动作节点(Action Nodes):执行具体动作的节点。



案例

job.properties

#NameNode地址

nameNode=hdfs://hadoop-senior00-levi.com:8082

#ResourceManager地址,默认端口8032

jobTracker=hadoop-senior00-levi.com:8032

#内部的Event队列名称

queueName=default

examplesRoot=oozie-apps

#程序位置

oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/shell

#执行这个脚本

EXEC1=test1.sh

EXEC2=test2.sh


workflow.xml

   

   

               

                       ${jobTracker}

                       ${nameNode}

                       

                               

                                       mapred.job.queue.name

                                       ${queueName}



                        ${EXEC1}


                       /user/admin/oozie-apps/shell/${EXEC1}#${EXEC1}


                       


               

               


             

               

                       ${jobTracker}

                       ${nameNode}

                       

                               

                                       mapred.job.queue.name

                                       ${queueName}



                        ${EXEC2}


                       /user/admin/oozie-apps/shell/${EXEC2}#${EXEC2}


                       


               

               


   

       

           

               ${wf:actionData('shell-node')['my_output'] eq 'Hello Oozie'}


           



   

       Shell action failed, errormessage[${wf:errorMessage(wf:lastErrorNode())}]


   

       Incorrect output, expected [Hello Oozie] but was[${wf:actionData('shell-node')['my_output']}]


   



test1.sh

#!/bin/bash

/usr/bin/date > /tmp/test.log

/usr/bin/date > /tmp/test.log


执行:

上传到HDFS:

hdfs dfs -rmr /user/levi/oozie-apps

hdfs dfs -put oozie-apps/ /user/levi


执行任务:

bin/oozie job --ooziehttp://hadoop-senior00-levi.com:11000/oozie -config oozie-apps/shell/job.properties-run























使用注意事项

[if !supportLists]1.    [endif]启动不了,则到oozie-server/temp查看是否有*.pid文件,有就删除后在启动。

[if !supportLists]2.    [endif]如果无法关闭oozie则kill掉。

[if !supportLists]3.    [endif]Mysql配置如果没有生效的话,默认使用derby数据库

[if !supportLists]4.    [endif]在本地修改完成的job配置,必须重新上传到HDFS。

[if !supportLists]5.    [endif]Linux用户名和Hadoop的用户名不一致。

[if !supportLists]6.    [endif]时区

你可能感兴趣的:(Oozie)