oozie hive spark2 action 自定义参数设置
需求是hive 和spark 运行时特别是sql,通常要基数据和sql做些有优化,而不能使用默认的配置或是yarn的自动分配机制,因此给hive可以指定运行的参数或是hive.site.xml,而spark 可以在配置里加spark-opt参数,参考如下:
Oozie WorkFlow中Hive Action案例
官方地址
http://archive.cloudera.com/cdh5/cdh/5/oozie-4.0.0-cdh5.3.6/DG_HiveActionExtension.html
复制样例重新命名后对hive进行修改
cp -r examples/apps/hive oozie-apps/
mv oozie-apps/hive hive-select
修改hive-select中的job.properties
“`
nameNode=hdfs://hadoop-senior.beifeng.com:8020
jobTracker=hadoop-senior.beifeng.com:8032
queueName=default
examplesRoot=examples
oozieAppsRoot=user/beifeng/oozie-apps
oozieDataRoot=user/beifeng/oozie/datas
oozie.use.system.libpath=true
oozie.wf.application.path=nameNode/nameNode/{oozieAppsRoot}/hive-select/workflow.xml
inputDir=hive-select/input
outputDir=hive-select/output
>oozie.use.system.libpath=true 表示使用hdfs系统beifeng用户下的share依赖包。
注意:端口号是否正确。hdfs:8020 jobtracker:8032
###测试hive使用的api是新版本还是老版本
+ [beifeng@hadoop-senior hive-0.13.1-cdh5.3.6]$ bin/hive
+ select count(1) from dept;
+ http://hadoop-senior.beifeng.com:8088/cluster
![](https://upload-images.jianshu.io/upload_images/4176128-ccb5b5fdf485acad.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/4176128-0b85ae5ce81abd52.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/4176128-2115e0cf837dde5a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
###在hive中创建dept表
CREATE TABLE IF NOT EXISTS default.dept
(
dept_no string COMMENT ‘id’,
dept_name string ,
dept_url string
)
COMMENT ‘dept’
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’
STORED AS TEXTFILE
LOCATION ‘/user/hive/warehouse/dept’
###编写hive的sql脚本
- 1
load data local inpath ‘/opt/datas/dept.txt’ overwrite into table dept;
###编写流程xml文件
- 1
- 2
>注意:workflow和hive的版本信息。根据.cloudera的oozie官方文档说明为主。
###创建hdfs上的oozie-app目录
```
bin/hdfs dfs -mkdir -p /user/beifeng/oozie-apps
复制oozie中的工作流select-dept到hdfs系统
../hadoop-2.5.0-cdh5.3.6/bin/hdfs dfs -put oozie-apps/hive-select /user/beifeng/oozie-apps/
- 1
复制hive配置文件及修改工作流文件
cp ../hive-0.13.1-cdh5.3.6/conf/hive-site.xml oozie-apps/hive-select/
- 1
创建hive的依赖jar包lib及上传
mkdir -p oozie-apps/hive-select/lib
cp ../hive-0.13.1-cdh5.3.6/lib/mysql-connector-java-5.1.27-bin.jar oozie-apps/hive-select/lib
复制hive-select 到HDFS
bin/hdfs dfs -put ../oozie-4.0.0-cdh5.3.6/oozie-apps/hive-select/* /user/beifeng/oozie-apps/hive-select/
- 1
设置oozie请求地址
export OOZIE_URL=http://hadoop-senior.beifeng.com:11000/oozie
- 1
运行job
bin/oozie job -config oozie-apps/hive-select/job.properties -run
- 1
查看job运行状态
bin/oozie job -info 0000001-180315133250705-oozie-beif-W
- 1
查看mysql中dept表中是否已有数据
使用Hue创建Spark1和Spark2的Oozie工作流
1.文档编写目的
使用Hue可以方便的通过界面制定Oozie的工作流,支持Hive、Pig、Spark、Java、Sqoop、MapReduce、Shell等等。Spark?那能不能支持Spark2的呢,接下来本文章就主要讲述如何使用Hue创建Spark1和Spark2的Oozie工作流。
- 内容概述
1.添加Spark2到Oozie的Share-lib
2.创建Spark2的Oozie工作流
3.创建Spark1的Oozie工作流
4.总结
- 测试环境
1.CM和CDH版本为5.11.2
2.操作系统:RedHat7.2
3.采用sudo权限的ec2-user用户操作
2.Oozie共享库添加Spark2
1.查看当前Oozie的share-lib共享库HDFS目录
ec2-user@ip-172-31-22-86jars$ oozie admin -ooziehttp://ip-172-31-22-86.ap-southeast-1.compute.internal:11000/oozie-sharelibupdate
ShareLib update status
host =http://ec2-54-169-0-36.ap-southeast-1.compute.amazonaws.com:11000/oozie
status = Successful
sharelibDirOld =hdfs://ip-172-31-21-45.ap-southeast-1.compute.internal:8020/user/oozie/share/lib/lib_20170921070424
sharelibDirNew =hdfs://ip-172-31-21-45.ap-southeast-1.compute.internal:8020/user/oozie/share/lib/lib_20170921070424
ec2-user@ip-172-31-22-86jars$
2.在Oozie的/user/oozie/share/lib/lib_20170921070424创建spark2目录
[ec2-user@ip-172-31-22-86 ~]$ sudo -u hdfs hadoop fs -mkdir /user/oozie/share/lib/lib_20170921070424/spark2
3.向spark2目录添加spark2的jars和oozie-sharelib-spark*.jar
[ec2-user@ip-172-31-22-86 jars]$ pwd /opt/cloudera/parcels/SPARK2/lib/spark2/jars [ec2-user@ip-172-31-22-86 jars]$ sudo -u hdfs hadoop fs -put *.jar /user/oozie/share/lib/lib_20170921070424/spark2
[ec2-user@ip-172-31-22-86 spark]$ pwd /opt/cloudera/parcels/CDH/lib/oozie/oozie-sharelib-yarn/lib/spark [ec2-user@ip-172-31-22-86 spark]$ sudo -u hdfs hadoop fs -put oozie-sharelib-spark*.jar /user/oozie/share/lib/lib_20170921070424/spark2
4.修改目录属主及权限
[ec2-user@ip-172-31-22-86 ~]$ sudo -u hdfs hadoop fs –chown -R oozie:oozie /user/oozie/share/lib/lib_20170921070424/spark2 [ec2-user@ip-172-31-22-86 ~]$ sudo -u hdfs hadoop fs –chmod -R 775 /user/oozie/share/lib/lib_20170921070424/spark2
5.更新Oozie的share-lib
[ec2-user@ip-172-31-22-86 spark]$ oozie admin -oozie http://ip-172-31-22-86.ap-southeast-1.compute.internal:11000/oozie -sharelibupdate [ShareLib update status] host = http://ec2-54-169-0-36.ap-southeast-1.compute.amazonaws.com:11000/oozie status = Successful sharelibDirOld = hdfs://ip-172-31-21-45.ap-southeast-1.compute.internal:8020/user/oozie/share/lib/lib_20170921070424 sharelibDirNew = hdfs://ip-172-31-21-45.ap-southeast-1.compute.internal:8020/user/oozie/share/lib/lib_20170921070424 [ec2-user@ip-172-31-22-86 spark]$
6.确认spark2已经添加到共享库
[ec2-user@ip-172-31-22-86 spark]$ oozie admin -oozie http://ip-172-31-22-86.ap-southeast-1.compute.internal:11000/oozie -shareliblist [Available ShareLib] spark2 oozie hive distcp hcatalog sqoop mapreduce-streaming spark hive2 pig [ec2-user@ip-172-31-22-86 spark]$
3.创建Spark2的Oozie工作流
1.登录Hue,创建Oozie工作流
2.进入WorkSpace
点击lib
在命令行将Spark2自带的example例子上传到/user/hue/oozie/workspaces/hue-oozie-1507832616.28/lib目录
[ec2-user@ip-172-31-22-86 jars]$ pwd /opt/cloudera/parcels/SPARK2/lib/spark2/examples/jars [ec2-user@ip-172-31-22-86 jars]$ sudo -u hdfs hadoop fs -put spark-examples_2.11-2.1.0.cloudera1.jar /user/hue/oozie/workspaces/hue-oozie-1507832616.28/lib [ec2-user@ip-172-31-22-86 jars]$
3.添加Spark2任务
设置使用Spark2,否则默认使用的Spark1
完成配置,点击保存
4.保存完成后,点击运行测试是否正常
运行成功
4.创建Spark1的Oozie工作流
1.创建Oozie工作流
进入WorkSpace
2.将Spark1的example的jar包上传至该WorkSpace的lib目录
[ec2-user@ip-172-31-22-86 lib]$ pwd /opt/cloudera/parcels/CDH/lib/spark/examples/lib [ec2-user@ip-172-31-22-86 lib]$ sudo -u hdfs hadoop fs -put spark-examples-1.6.0-cdh5.11.2-hadoop2.6.0-cdh5.11.2.jar /user/hue/oozie/workspaces/hue-oozie-1507860705.24/lib [ec2-user@ip-172-31-22-86 lib]$
3.添加Spark1的任务到Oozie
4.保存Oozie,然后点击提交
运行成功
5.常见问题
1.在使用Hue创建Spark2的Oozie工作流时运行异常
2017-10-16 23:20:07,086 WARN org.apache.oozie.action.hadoop.SparkActionExecutor: SERVER[ec2-54-179-152-169.ap-southeast-1.compute.amazonaws.com] USER[admin] GROUP[-] TOKEN[] APP[MyFirstSpark2] JOB[0000000-171016230402705-oozie-oozi-W] ACTION[0000000-171016230402705-oozie-oozi-W@spark-1411] Launcher exception: Exception when registering SparkListener org.apache.spark.SparkException: Exception when registering SparkListener at org.apache.spark.SparkContext.setupAndStartListenerBus(SparkContext.scala:2193) at org.apache.spark.SparkContext.<init>(SparkContext.scala:562) at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2313) at org.apache.spark.sql.SparkSession$Builder$$anonfun$6.apply(SparkSession.scala:868) at org.apache.spark.sql.SparkSession$Builder$$anonfun$6.apply(SparkSession.scala:860) at scala.Option.getOrElse(Option.scala:121) at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:860) at org.apache.spark.examples.SparkPi$.main(SparkPi.scala:31) at org.apache.spark.examples.SparkPi.main(SparkPi.scala) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:738) at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:187) at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:212) at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:126) at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala) at org.apache.oozie.action.hadoop.SparkMain.runSpark(SparkMain.java:178) at org.apache.oozie.action.hadoop.SparkMain.run(SparkMain.java:90) at org.apache.oozie.action.hadoop.LauncherMain.run(LauncherMain.java:81) at org.apache.oozie.action.hadoop.SparkMain.main(SparkMain.java:57) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.apache.oozie.action.hadoop.LauncherMapper.map(LauncherMapper.java:235) at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54) at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:459) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343) at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1920) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158) Caused by: java.lang.ClassNotFoundException: com.cloudera.spark.lineage.ClouderaNavigatorListener at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:270) at org.apache.spark.util.Utils$.classForName(Utils.scala:229) at org.apache.spark.SparkContext$$anonfun$setupAndStartListenerBus$1.apply(SparkContext.scala:2159) at org.apache.spark.SparkContext$$anonfun$setupAndStartListenerBus$1.apply(SparkContext.scala:2156) at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33) at scala.collection.mutable.WrappedArray.foreach(WrappedArray.scala:35) at org.apache.spark.SparkContext.setupAndStartListenerBus(SparkContext.scala:2156) ... 34 more
解决方法:
保存配置然后重启相应服务。
6.总结
使用Oozie创建Spark的工作流,如果需要运行Spark2的作业则需要向Oozie的Share-lib库中添加Spark2的支持,并在创建Spark2作业的时候需要指定Share-lib为spark2(Oozie默认的支持Spark1),否则会运行失败报Spark2的类找不到异常。
Oozie Coordinator job 之定时任务
使用 Coordinator job 可以执行定时任务和时间触发执行
需要注意的是 Oozie 默认使用的时区与中国时区不是一致的,需要进行一点修改
1.关于时区
a.修改 core-site.xml 文件(运行需要)需要清除编译文件,重启 tomcat 服务(不能是UTC+0800)
<property>
<name>oozie.processing.timezone</name>
<value>GMT+0800</value>
</property>
b.修改 $OOZIE_HOME/oozie-server/webapps/oozie/oozie-console.js 文件(Web显示需要),无需重启
function getTimeZone() {
Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
return Ext.state.Manager.get("TimezoneId","GMT+0800");
}
2.拷贝 example 文件 cron-schedule
3.编辑 job.properties 文件(注意时间格式)
nameNode=hdfs://cen-ubuntu.cenzhongman.com:8020
jobTracker=localhost:8032
queueName=default
oozieAppsRoot=oozie-apps
oozie.coord.application.path=${nameNode}/user/cen/${oozieAppsRoot}/cron-schedule
start=2017-07-30T14:40+0800
end=2017-07-30T14:59+0800
workflowAppUri=${nameNode}/user/cen/${oozieAppsRoot}/cron-schedule
4.编辑 workflow.xml 文件(内容酌情添加,这里什么也不做)(修改了版本号)
<workflow-app xmlns="uri:oozie:workflow:0.5" name="no-op-wf">
<start to="end"/>
<end name="end"/>
</workflow-app>
5.编辑 coordinator.xml 文件(支持两种定时任务方式,下文详细说明)
<coordinator-app name="cron-coord" frequency="0/1 * * * *" start="${start}" end="${end}" timezone="GMT+0800"
xmlns="uri:oozie:coordinator:0.4">
<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>
注意事项
- 修改时区写法
- 修改版本号
- coordinator.xml 文件在本地文件系统中读取,HDFS 中无需修改不影响
6.上传文件至 HDFS 文件系统
7.执行任务
export OOZIE_URL=http://cen-ubuntu:11000/oozie/
bin/oozie job --config oozie-apps/cron-schedule/job.properties -run
关于定时方式
方式一:官方定义方式
EL Constant | Value | Example |
---|---|---|
${coord:minutes(int n)} | n | ${coord:minutes(45)} --> 45 |
${coord:hours(int n)} | n * 60 | ${coord:hours(3)} --> 180 |
${coord:days(int n)} | variable | ${coord:days(2)} --> minutes in 2 full days from the current date |
${coord:months(int n)} | variable | ${coord:months(1)} --> minutes in a 1 full month from the current date |
${cron syntax} | variable | ${0,10 15 * * 2-6} --> a job that runs every weekday at 3:00pm and 3:10pm UTC time |
方式二:corntab方式
Field name | Allowed Values | Allowed Special Characters |
---|---|---|
Minutes | 0-59 | , - * / |
Hours | 0-23 | , - * / |
Day-of-month | 1-31 | , - * ? / L W |
Month | 1-12 or JAN-DEC | , - * / |
Day-of-Week | 1-7 or SUN-SAT | , - * ? / L # |
Example
Cron Expression | Meaning |
---|---|
10 9 * * * | Runs everyday at 9:10am |
10,30,45 9 * * * | Runs everyday at 9:10am, 9:30am, and 9:45am |
0 * 30 JAN 2-6 | Runs at 0 minute of every hour on weekdays and 30th of January |
0/20 9-17 * * 2-5 | Runs every Mon, Tue, Wed, and Thurs at minutes 0, 20, 40 from 9am to 5pm |
1 2 L-3 * * | Runs every third-to-last day of month at 2:01am |
1 2 6W 3 ? | Runs on the nearest weekday to March, 6th every year at 2:01am |
1 2 * 3 3#2 | Runs every second Tuesday of March at 2:01am every year |
0 10,13 * * MON-FRI | Runs every weekday at 10am and 1pm |
注1:开启了检查频率,导致5分钟以内的频率运行失败
- 错误提示:Error: E1003 : E1003: Invalid coordinator application attributes, Coordinator job with frequency [2] minutes is faster than allowed maximum of 5 minutes (oozie.service.coord.check.maximum.frequency is set to true)
- 错误原因:开启了检查频率,导致5分钟以内的频率运行失败
-
解决:关闭频率检查功能 配置oozie-site.xml文件
<property> <name>oozie.service.coord.check.maximum.frequency</name> <value>false</value> </property>
http://www.cnblogs.com/cenzhongman/
遇到的问题
- oozie的sqoop节点配置过多时启动卡死现象,报错为Heart beat
解决方式:将oozie的action队列和launcher队列分开配置参数如下 oozie.launcher.mapred.job.queue.name mapreduce.job.queuename(mapred.job.queue.name)
原因分析:oozie中job的调度是通过hadoop中的map 来完成的.oozie中每启动一个job action都会启动一个launcher action作为加载加载作业使用,对应的每个action都需要一个AM.launcher 加载完作业后不会立即结束,需要等到 job action完成后才会结束. 在动态资源池配置中,AM占用队列资源比默认是0.5.这样的话,如果同时fork多个节点的话,会出现launcher action 把AM的资源占满,造成job action 的卡死. 通过配置两个资源队列来把launcher action和 job action 分开,这样 launcher AM 和job AM 不会有资源竞争.每个资源队列中会有相应的算法,这样就不会有卡死的现象.
-错误信息:ERROR org.apache.sqoop.tool.ExportTool - Encountered IOException running export job:java.io.IOException:com.google.common.util.concurrent.UncheckedExecutionException: javax.jdo.JDOFatalInternalException: Error creating transactional connection factory
解决方式:应为使用到了hive的元数据,所有需要在workflow.xml中配置
<property>
<name>hive.metastore.uris</name>
<value>${hive_meta_urls}</value>
</property>
提交oozie定时作业
1、进入hue界面,点击workflows工作流,编辑workflows。
2、点击create创建工作流。
3、本文以hive2作业sql任务为例,拖拽hive2到action区域。
4、例子是为车次表每天定时添加指定分区,分区为动态传参传入,和脚本类似,参数取值用${}包围。具体sql如下:
CREATE TABLE if NOT EXISTS dw_serv_checi_query_day ( user_id string, railway_no string, start_station string ) PARTITIONED BY ( dt STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE; ALTER TABLE dw_serv_checi_query_day ADD PARTITION (dt = ${partdt});
保存为addpart.sql,上传hdfs,通过hue上传很方便。选中上传的文件,要给出参数值,不能省略,否自运行时${}讲不会被转义。这里值依然用${}包围,是因为具体值会在Coordinator中传入。保存workflow。
5、创建coordinator,
选择刚才创建的workflows,选择定时时间,可以选择每日,每周,每月等等,选择任务有效期,最后要给出之前参数的值,这里的值是代表前一天的日期,oozie有一些内置的常量。保存提交,OK,定时任务完成了。
这样就会在每天凌晨一点钟给车次表添加一个分区,分区值为前一天的日期,运行状态如下图
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指定模式 |
例如,昨天的日期就可以写为昨天日期 ${coord:formatTime(coord:dateOffset(coord:nominalTime(), -1, 'DAY'), 'yyyyMMdd')}
问题与解决办法
oozie会存在时区问题,默认会与中国时间会相差8个小时,这就需要oozie的时区,我使用的是cdh,所以设置很方便,进入cm的管理界面,进入oozie的设置,添加配置:
保存,重启,问题解决