Oozie是一个管理Hadoop作业、可伸缩、可扩展、可靠的工作流调度系统,它内部定义了三种作业:
1. 工作流作业:由一系列动作构成的有向无环图(DAGs)
2. 协调器作业:按时间频率周期性触发Oozie工作流的作业
3.Bundle作业:管理协调器作业
一、首先示例提交HiveSQL脚本- 即时执行
1.进入到hue界面,点击【Query】- 【Schedule】- 【WorkFlow】,编辑工作流WorkFlows,
点击进去后,支持的Action会有很多,如下图:
hive/spark/pig/shell/Java/MR...
2.起一个workFlow的名称
3.将hive2拖拽到指定位置
4.然后,上传存在于HDFS上的脚本文件,如果没有上传,那么可以首先上传
5.上传脚本文件:
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 |
6.然后点击“Add”添加,接下来点击保存,点击运行,点击submit
7.查看运行状态,可以点击进去看具体的任务
8.看结果
运行前表中的数据:
运行会后表中的数据:
二、看一个结构多一点的WorkFlow过程(一个Shell脚本+Hive脚本+参数)
1.返回到WorkFlow的界面,点击编辑,把个刚刚的WorFlow重新编辑
2.添加shell脚本和另外一个hive脚本,仅实现查询
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.指定参数及文件
如果没有指定shell的files,出现的问题是:
4.点击【保存】- 【执行】
5.看结果
shell的log
最底下Hive的log:
三、实现一个coordinate(新版这里是Schedules)
1.如图进行创建
2.指定Schedules名称
3.选择要指定的workFlow,按照时间频率周期性触发Oozie工作流的作业
4.指定规则的按钮
5.可以切换时间编辑格式,分别为有好的和crontab格式的
这里要注意的是,在指定周期的时候,他会按照指定的开始时间开始执行,因此这里可以【重跑数据数据】
6.关于参数
这里的参数指的是workflow中需要指定的参数
咱们可以试着调节这里的参数:
6.1在【first_WorkFlow】中进行修改
6.2点击进去之后
6.3然后进行存储,之后再进入到【first_WorkFlow】进行配置
6.4点击保存,之后去Schedule中配置
指定Parameters,这里给出的参数是当天的参数
以及时区的zhi'ding
${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)创建时开始计算,第n个dataset实例执行时间 |
${coord:dataIn(String name)} |
在输入事件(input-events)中,解析dataset实例包含的所有的URI |
${coord:dataOut(String name)} |
在输出事件(output-events)中,解析dataset实例包含的所有的URI |
${coord:offset(int n, String timeUnit)} |
表示时间偏移,如果一个Coordinator动作创建时间为T,n为正数表示向时刻T之后偏移,n为负数向向时刻T之前偏移,timeUnit表示时间单位(选项有MINUTE、HOUR、DAY、MONTH、YEAR) |
${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)} |
最近以来,当前可以用的第n个dataset实例 |
${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:00Z、2009-01-03T00:00Z、2009-01-04T00:00Z、…、2010-01-01T00:00Z |
${coord:actualTime()} |
Coordinator动作的实际创建时间。例如:start=”2011-05-01T24:00Z”,end=”2011-12-31T24:00Z”,frequency=”${coord:days(1)}”,则实际时间为:2011-05-01,2011-05-02,2011-05-03,…,2011-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跑的情况:
正在执行
已有四个WokeFlow执行成功:
四、实现Bundle
创建Bundle,然后添加coordinator
可以进行集中的管理!