Oozie

Posted -levi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oozie相关的知识,希望对你有一定的参考价值。

为什么要有Oozie?

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

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

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

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

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

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

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

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

 

 

主流几款工作流调度框架

特性

Hamake

Oozie

Azkaban

Cascading

工作流描述语言

XML

XML (xPDL based)

text file with key/value pairs

Java API

依赖机制

data-driven

explicit

explicit

explicit

是否要web容器

No

Yes

Yes

No

进度跟踪

console/log messages

web page

web page

Java API

Hadoop job调度支持

no

yes

yes

yes

运行模式

command line utility

daemon

daemon

API

Pig支持

yes

yes

yes

yes

事件通知

no

no

no

yes

需要安装

no

yes

yes

no

支持的hadoop版本

0.18+

0.20+

currently unknown

0.18+

重试支持

no

workflownode evel

yes

yes

运行任意命令

yes

yes

yes

yes

Amazon EMR支持

yes

no

currently unknown

yes

 

 

什么是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

<workflow-app xmlns="uri:oozie:workflow:0.4" name="shell-wf">

    <start to="shell-node1"/>

    <action name="shell-node1">

                <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>$EXEC1</exec>

                        <!-- <argument>my_output=Hello Oozie</argument> -->

                        <file>/user/admin/oozie-apps/shell/$EXEC1#$EXEC1</file>

 

                        <capture-output/>

                </shell>

                <ok to=" shell-node2"/>

                <error to="fail"/>

        </action>

              <action name="shell-node2">

                <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>$EXEC2</exec>

                        <!-- <argument>my_output=Hello Oozie</argument> -->

                        <file>/user/admin/oozie-apps/shell/$EXEC2#$EXEC2</file>

 

                        <capture-output/>

                </shell>

                <ok to="end"/>

                <error to="fail"/>

        </action>

    <decision name="check-output">

        <switch>

            <case to="end">

                $wf:actionData(‘shell-node‘)[‘my_output‘] eq ‘Hello Oozie‘

            </case>

            <default to="fail-output"/>

        </switch>

    </decision>

    <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>

 

 

test1.sh

#!/bin/bash

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

 

test2.sh

#!/bin/bash

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

 

 

执行:

上传到HDFS:

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

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

 

执行任务:

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

技术图片

使用注意事项

  1. 启动不了,则到oozie-server/temp查看是否有*.pid文件,有就删除后在启动。
  2. 如果无法关闭oozie则kill掉。
  3. mysql配置如果没有生效的话,默认使用derby数据库
  4. 在本地修改完成的job配置,必须重新上传到HDFS。
  5. Linux用户名和Hadoop的用户名不一致。
  6. 时区

 

以上是关于Oozie的主要内容,如果未能解决你的问题,请参考以下文章