Oozie作业调度 - Demo

 

Oozie是一个管理Hadoop作业、可伸缩、可扩展、可靠的工作流调度系统,它内部定义了三种作业:

1. 工作流作业:由一系列动作构成的有向无环图(DAGs

2. 协调器作业:按时间频率周期性触发Oozie工作流的作业

3.Bundle作业:管理协调器作业

 

一、首先示例提交HiveSQL脚本- 即时执行

 

1.进入到hue界面,点击【Query】- 【Schedule】- 【WorkFlow】,编辑工作流WorkFlows,

Oozie作业调度 - Demo

点击进去后,支持的Action会有很多,如下图:

hive/spark/pig/shell/Java/MR... 

Oozie作业调度 - Demo

2.起一个workFlow的名称

Oozie作业调度 - Demo

3.将hive2拖拽到指定位置

Oozie作业调度 - Demo

4.然后,上传存在于HDFS上的脚本文件,如果没有上传,那么可以首先上传

Oozie作业调度 - Demo

5.上传脚本文件:

Oozie作业调度 - Demo

test_workflow_query.hql的内容:

set hive.exec.dynamic.partition=true; 

set hive.exec.dynamic.partition.mode=nonstrict; 

set hive.exec.max.dynamic.partitions.pernode=3000; 

 

insert into test_workflow_query partition(h) 

select cast(ceil(rand()*100)as string), unix_timestamp(), cast(from_unixtime(unix_timestamp(), 'yyyy-MM-dd') as string) as h 

 Oozie作业调度 - Demo

6.然后点击“Add”添加,接下来点击保存,点击运行,点击submit 

Oozie作业调度 - Demo

7.查看运行状态,可以点击进去看具体的任务

Oozie作业调度 - Demo

Oozie作业调度 - Demo

8.看结果

运行前表中的数据:

Oozie作业调度 - Demo

运行会后表中的数据:

Oozie作业调度 - Demo

 

 

 

二、看一个结构多一点的WorkFlow过程(一个Shell脚本+Hive脚本+参数)

 

1.返回到WorkFlow的界面,点击编辑,把个刚刚的WorFlow重新编辑

Oozie作业调度 - Demo

2.添加shell脚本和另外一个hive脚本,仅实现查询

Oozie作业调度 - Demo

Shell脚本(test_workflow_query_sh.sh):

#!/bin/bash

 

hive -e 'select * from test_workflow_query'

 

echo $?

 

echo "hive任务并行执行!!!"

 

HiveSQL脚本:

select ${hivevar:fields} 

from ${tablename}; 

3.指定参数及文件

Oozie作业调度 - Demo

如果没有指定shell的files,出现的问题是:

Oozie作业调度 - Demo

 

4.点击【保存】- 【执行】

Oozie作业调度 - Demo

5.看结果

Oozie作业调度 - Demo

shell的log 

Oozie作业调度 - Demo

最底下Hive的log:

Oozie作业调度 - Demo

 

 

三、实现一个coordinate(新版这里是Schedules

 

1.如图进行创建

Oozie作业调度 - Demo

 

 

2.指定Schedules名称

Oozie作业调度 - Demo

3.选择要指定的workFlow,按照时间频率周期性触发Oozie工作流的作业

Oozie作业调度 - Demo

4.指定规则的按钮

Oozie作业调度 - Demo

5.可以切换时间编辑格式,分别为有好的和crontab格式的

Oozie作业调度 - Demo

这里要注意的是,在指定周期的时候,他会按照指定的开始时间开始执行,因此这里可以【重跑数据数据】

Oozie作业调度 - Demo

 

6.关于参数

这里的参数指的是workflow中需要指定的参数

Oozie作业调度 - Demo

咱们可以试着调节这里的参数:

6.1在【first_WorkFlow】中进行修改

Oozie作业调度 - Demo

6.2点击进去之后

Oozie作业调度 - Demo

6.3然后进行存储,之后再进入到【first_WorkFlow】进行配置

Oozie作业调度 - Demo

Oozie作业调度 - Demo

6.4点击保存,之后去Schedule中配置

指定Parameters,这里给出的参数是当天的参数

以及时区的zhi'ding 

Oozie作业调度 - Demo

${coord:formatTime(coord:dateOffset(coord:nominalTime(), -1, 'DAY'), 'yyyyMMdd')}

Oozie常见其他系统常亮:

常量表示形式

含义说明

${coord:minutes(int n)}

返回日期时间:从一开始,周期执行n分钟

${coord:hours(int n)}

返回日期时间:从一开始,周期执行n * 60分钟

${coord:days(int n)}

返回日期时间:从一开始,周期执行n * 24 * 60分钟

${coord:months(int n)}

返回日期时间:从一开始,周期执行n * M * 24 * 60分钟(M表示一个月的天数)

${coord:endOfDays(int n)}

返回日期时间:从当天的最晚时间(即下一天)开始,周期执行n * 24 * 60分钟

${coord:endOfMonths(1)}

返回日期时间:从当月的最晚时间开始(即下个月初),周期执行n * 24 * 60分钟

${coord:current(int n)}

返回日期时间:从一个Coordinator动作(Action)创建时开始计算,第ndataset实例执行时间

${coord:dataIn(String name)}

在输入事件(input-events)中,解析dataset实例包含的所有的URI

${coord:dataOut(String name)}

在输出事件(output-events)中,解析dataset实例包含的所有的URI

${coord:offset(int n, String timeUnit)}

表示时间偏移,如果一个Coordinator动作创建时间为Tn为正数表示向时刻T之后偏移,n为负数向向时刻T之前偏移,timeUnit表示时间单位(选项有MINUTEHOURDAYMONTHYEAR

${coord:hoursInDay(int n)}

指定的第n天的小时数,n>0表示向后数第n天的小时数,n=0表示当天小时数,n<0表示向前数第n天的小时数

${coord:daysInMonth(int n)}

指定的第n个月的天数,n>0表示向后数第n个月的天数,n=0表示当月的天数,n<0表示向前数第n个月的天数

${coord:tzOffset()}

ataset对应的时区与Coordinator Job的时区所差的分钟数

${coord:latest(int n)}

最近以来,当前可以用的第ndataset实例

${coord:future(int n, int limit)}

当前时间之后的dataset实例,n>=0,当n=0时表示立即可用的dataset实例,limit表示dataset实例的个数

${coord:nominalTime()}

nominal时间等于Coordinator Job启动时间,加上多个Coordinator Job的频率所得到的日期时间。例如:start=”2009-01-01T24:00Z”end=”2009-12-31T24:00Z”frequency=”${coord:days(1)}”frequency=”${coord:days(1)},则nominal时间为:2009-01-02T00:00Z2009-01-03T00:00Z2009-01-04T00:00Z2010-01-01T00:00Z

${coord:actualTime()}

Coordinator动作的实际创建时间。例如:start=”2011-05-01T24:00Z”end=”2011-12-31T24:00Z”frequency=”${coord:days(1)}”,则实际时间为:2011-05-012011-05-022011-05-032011-12-31

${coord:user()}

启动当前Coordinator Job的用户名称

${coord:dateOffset(String baseDate, int instance, String timeUnit)}

计算新的日期时间的公式:newDate = baseDate + instance * timeUnit,如:baseDate=’2009-01-01T00:00Z’instance=’2′timeUnit=’MONTH’,则计算得到的新的日期时间为’2009-03-01T00:00Z’

${coord:formatTime(String timeStamp, String format)}

格式化时间字符串,format指定模式

 

 

那么,最后,看看刚刚的Scheme跑的情况:

正在执行

Oozie作业调度 - Demo

 

已有四个WokeFlow执行成功:

Oozie作业调度 - Demo

 

四、实现Bundle

 

创建Bundle,然后添加coordinator

Oozie作业调度 - Demo

可以进行集中的管理!