任务调度框架之oozie

 

目录

Oozie(基于cdh平台) 1

一、Oozie 简介 1

二、Oozie的功能模块介绍 1

三oozie部署 2

四案例 4

五可能遇到的问题 13


Oozie(基于cdh平台)

一、Oozie 简介

Oozie 英文翻译为:驯象人。一个基于工作流引擎的开源框架,由Cloudera 公司贡献给

Apache,提供对Hadoop Mapreduce、Pig Jobs 的任务调度与协调。Oozie 需要部署到Java

Servlet 容器中运行。主要用于定时调度任务,多任务可以按照执行的逻辑顺序调度。

二、Oozie的功能模块介绍

2.1、模块

1) Workflow

顺序执行流程节点,支持fork(分支多个节点),join(合并多个节点为一个)

2) Coordinator

定时触发workflow

3) Bundle Job

绑定多个Coordinator

2.2、常用节点

1) 控制流节点(Control Flow Nodes

控制流节点一般都是定义在工作流开始或者结束的位置,比如start,end,kill 等。以及提供工

作流的执行路径机制,如decision,fork,join 等。

2) 动作节点(Action Nodes

负责执行具体动作的节点,比如:拷贝文件,执行某个Shell 脚本等等。

三oozie部署

1前提 :安装好 coluder Manager  见 cdh平台文档





2添加ooze 服务



四案例

1调度shell 脚本

  $ vi oozie-apps/shell/p1.sh

内容如下:

#!/bin/bash

/sbin/ifconfig > /tmp/p1.log



修改job.properties workflow.xml 文件注意文件的名字不可以改动

job.properties

#HDFS 地址

nameNode=hdfs://linux01:8020

#ResourceManager 地址

jobTracker=linux02:8032

#队列名称

queueName=default

examplesRoot=oozie-apps

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

EXEC=p1.sh

 

 


workflow.xml


<?xml version="1.0" encoding="utf-8"?>

<!--name标识这个节点-->

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

  <start to="shell-node"/>  

<!--actionName标识当前需要运行的节点-->


  <action name="shell-node">

<shell xmlns="uri:oozie:shell-action:0.2">  

  <!--${jobTracker} ${nameNode}表示的是job。Properties的配置中的内容 -->


      <job-tracker>${jobTracker}</job-tracker>  

      <name-node>${nameNode}</name-node>  

      <configuration>

        <property>

          <name>mapred.job.queue.name</name>  

          <value>${queueName}</value>

        </property>

      </configuration>  

<!-对应job properties 中的配置内容 -->


      <exec>${EXEC}</exec>  

      <!-- <argument>my_output=Hello Oozie</argument> -->  <!-对应的是hdfs 上的文件位置    #${EXEC} 是固定写法-->


      <file>/user/admin/oozie-apps/shell/${EXEC}#${EXEC}</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>




2

把该文件上传到hdfs上对应的位置  job.Properties对应的位置


hadoop fs -put [所有文件  p1.sh  job.Properties  workflow.xml]  [job.Properties对应的位置  oozie.wf.application.path实际制定的位置 ]


3执行oozie 服务

命令如下

oozie job -oozie http://z:11000/oozie -config oozie-apps/shell/job.properties -run

解释

http://z:11000oozie部署的服务器地址

oozie-apps/shell/job.properties配置文件在服务器的地址注意并不是hdfs上的地址


oozie job -oozie http://z:11000/oozie -config oozie-apps/shell/job.properties -run





4结束任务


oozie job -oozie http://linux01:11000/oozie -kill 0000004-170425105153692-oozie-z-W


解释 0000004-170425105153692-oozie-z-W

Oozie启动后会产生的服务标识



2调度多个任务

编写脚本p1.sh

#!/bin/bash

/sbin/ifconfig > /tmp/p1.log



P2.sh

#!/bin/bash

/sbin/ifconfig > /tmp/p2 .log




Job.properties

nameNode=hdfs://z101:8020

jobTracker=z102:8032

queueName=default

examplesRoot=oozie-apps

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

EXEC1=p1.sh

EXEC2=p2.sh





Workflow.xml

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

<start to="p1-shell-node"/>

<action name="p1-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>${EXEC1}</exec>

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

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

<capture-output/>

</shell>

 如果成功 执行下一个脚本  如果失败 不执行

<ok to="p2-shell-node"/>

<error to="fail"/>

</action>

<action name="p2-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>${EXEC2}</exec>

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

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

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




2

把该文件上传到hdfs上对应的位置  job.Properties对应的位置


hadoop fs -put [所有文件  p1.sh  job.Properties  workflow.xml]  [job.Properties对应的位置  oozie.wf.application.path实际制定的位置 ]




3执行oozie 服务

命令如下

oozie job -oozie http://z:11000/oozie -config oozie-apps/shell/job.properties -run

解释

http://z:11000oozie部署的服务器地址

oozie-apps/shell/job.properties配置文件在服务器的地址注意并不是hdfs上的地址


oozie job -oozie http://z:11000/oozie -config oozie-apps/shell/job.properties -run





4结束任务


oozie job -oozie http://linux01:11000/oozie -kill 0000004-170425105153692-oozie-z-W


解释 0000004-170425105153692-oozie-z-W

Oozie启动后会产生的服务标识


3定时调度任务

前提同步服务器时间

检查系统当前时区:

# date -R

注意这里,如果显示的时区不是+0800,你可以删除localtime 文件夹后,再关联一个正确时

区的链接过去,命令如下

# rm -rf /etc/localtime

# ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime


同步时间

# ntpdate pool.ntp.org

修改NTP 配置文件:

# vi /etc/ntp.conf

去掉下面这行前面的# ,并把网段修改成自己的网段:

restrict 192.168.122.0 mask 255.255.255.0 nomodify notrap

注释掉以下几行:

#server 0.centos.pool.ntp.org

#server 1.centos.pool.ntp.org

#server 2.centos.pool.ntp.org

把下面两行前面的#号去掉,如果没有这两行内容,需要手动添加

server 127.127.1.0 # local clock

fudge 127.127.1.0 stratum 10



重启NTP 服务:

# systemctl start ntpd.service,

注意,如果是 centOS7 以下的版本,使用命令:service ntpd start

# systemctl enable ntpd.service,

注意,如果是 centOS7 以下的版本,使用命令:chkconfig ntpd on



集群其他节点去同步这台时间服务器时间:

首先需要关闭这两台计算机的 ntp 服务

# systemctl stop ntpd.service,

centOS7 以下,则:service ntpd stop

# systemctl disable ntpd.service,

centOS7 以下,则:chkconfig ntpd off

# systemctl status ntpd,查看 ntp 服务状态

# pgrep ntpd,查看 ntp 服务进程 id

同步第一台服务器 linux01 的时间:

# ntpdate linux01


制定周期时间


# crontab -e

*/10 * * * * /usr/sbin/ntpdate linux01


重启定时服务即可

# systemctl restart crond.service,

centOS7 以下使用:service crond restart,



编写脚本p1.sh

#!/bin/bash

/sbin/ifconfig >> /tmp/p1.log


Job.properties

nameNode=hdfs://linux01:8020

jobTracker=linux02:8032

queueName=default

examplesRoot=oozie-apps

oozie.coord.application.path=${nameNode}/user/${user.name}/${examplesRoot}/cron

#start:必须设置为未来时间,否则任务失败

start=2017-07-29T17:00+0800

end=2017-07-30T17:00+0800

workflowAppUri=${nameNode}/user/${user.name}/${examplesRoot}/cron

EXEC1=p1.sh

EXEC2=p2.sh



coordinator.xml

<coordinator-app name="cron-coord" frequency="${coord:minutes(5)}" start="${start}"

end="${end}" timezone="GMT+0800" xmlns="uri:oozie:coordinator:0.2">

<action>

<workflow>

<app-path>${workflowAppUri}</app-path>

<configuration>

<property>

<name>jobTracker</name>

<value>${jobTracker}</value>

</property>

<property>

<name>nameNode</name>

<value>${nameNode}</value>

</property>

<property>

<name>queueName</name>

<value>${queueName}</value>

</property>

</configuration>

</workflow>

</action>

</coordinator-app>



workflow.xml

<workflow-app xmlns="uri:oozie:workflow:0.5" name="one-op-wf">

<start to="p3-shell-node"/>

<action name="p3-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>${EXEC3}</exec>

<file>/user/admin/oozie-apps/cron/${EXEC3}#${EXEC3}</file>

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

<capture-output/>

</shell>

<ok to="end"/>

<error to="fail"/>

</action>

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




2

把该文件上传到hdfs上对应的位置  job.Properties对应的位置


hadoop fs -put [所有文件  p1.sh  job.Properties  workflow.xml]  [job.Properties对应的位置  oozie.wf.application.path实际制定的位置 ]




3执行oozie 服务

注意定时任务需要修改配置如下



增加属性和属性值如下

属性:oozie.processing.timezone

属性值:GMT+0800

解释:修改时区为东八区区时



命令如下

oozie job -oozie http://z:11000/oozie -config oozie-apps/shell/job.properties -run

解释

http://z:11000oozie部署的服务器地址

oozie-apps/shell/job.properties配置文件在服务器的地址注意并不是hdfs上的地址


oozie job -oozie http://z:11000/oozie -config oozie-apps/shell/job.properties -run





4结束任务


oozie job -oozie http://linux01:11000/oozie -kill 0000004-170425105153692-oozie-z-W


解释 0000004-170425105153692-oozie-z-W

Oozie启动后会产生的服务标识



注意oozie执行周期的最小单位 是5 分钟  低于五分钟  执行失败


五可能遇到的问题


[if !supportLists]1) [endif]授权配置如下标识所有用户使用root用户  密码123456来登陆

grant all on *.* to root@'%' identified by '123456';

flush privileges;

刷新配置


2) workflow.xml 配置的时候不要忽略file 属性

3) jps 查看进程时,注意有没有bootstrap

4) 关闭oozie

如果bin/oozied.sh stop 无法关闭,则可以使用kill -9 [pid],之后oozie 根目录下的

oozie-server/temp/xxx.pid 文件一定要删除。

5) Oozie 重新打包时,一定要注意先关闭进程,删除对应文件夹下面的pid 文件。(可以参

考第4 条目)

6) 配置文件一定要生效

起始标签和结束标签无对应则不生效,配置文件的属性写错了,那么则执行默认的属性。

7) libext 下边的jar 存放于某个文件夹中,导致share/lib 创建不成功。

8) 调度任务时,找不到指定的脚本,可能是oozie-site.xml 里面的Hadoop 配置文件没有关

联上。

9) 修改Hadoop 配置文件,需要重启集群。一定要记得scp 到其他节点。

10) JobHistoryServer 必须开启,集群要重启的。

11) Mysql 配置如果没有生效的话,默认使用derby 数据库。

12) 在本地修改完成的job 配置,必须重新上传到HDFS

13) HDFS 中上传的oozie 配置文件下载下来查看是否有错误。

14) Linux 用户名和Hadoop 的用户名不一致。

15sharelib 找不到,包括重新初始化oozie

如果部署oozie 出错,修复执行,初始化oozie

1、停止oozie(要通过jps 检查bootstrap 进程是否已经不存在)

2、删除oozie-server/temp/*

3、删除HDFS 上的sharelib 文件夹

4、删除oozie.sql 文件,删除Mysql 中删除oozie 库,重新创建

5、重新按照顺序执行文档中“初始化oozie"这个步骤

六利用hue调度oozie 任务


在action下创建 workflow,在创建scheduler,在创建bundle

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

推荐阅读更多精彩内容

  • 1 Oozie 简介 一个基于工作流引擎的开源框架,提供对 Hadoop MapReduce、Pig Jobs 的...
    djm猿阅读 281评论 0 0
  • 简介 (翻译自官网) Oozie是一个用于管理Apache Hadoop作业的工作流调度程序系统。 Oozie W...
    红莲之火阅读 17,996评论 0 2
  • 为什么要有Oozie? 在数据业务场景,对于数据的处理往往是分阶段处理,而不同的阶段可能采用了不同的技术框架去完成...
    _Levi__阅读 5,775评论 2 1
  • 在Oozie的workflow上面调用jar包workflow.xml <?xml version="1.0" e...
    wangliang938阅读 1,603评论 1 0
  • 一. Oozie简介 Apache Oozie是用于Hadoop平台的一种工作流调度引擎。 作用 统一调度ha...
    达微阅读 1,770评论 0 3