oozie hive spark2 action 自定义参数设置

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)

Oozie 安装及 examples app 的使用

<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 ConstantValueExample
${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方式

Crontab使用参考

Field nameAllowed ValuesAllowed Special Characters
Minutes0-59, - * /
Hours0-23, - * /
Day-of-month1-31, - * ? / L W
Month1-12 or JAN-DEC, - * /
Day-of-Week1-7 or SUN-SAT, - * ? / L #

Example

Cron ExpressionMeaning
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-6Runs at 0 minute of every hour on weekdays and 30th of January
0/20 9-17 * * 2-5Runs 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#2Runs every second Tuesday of March at 2:01am every year
0 10,13 * * MON-FRIRuns 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的设置,添加配置:

 

保存,重启,问题解决

转载于:https://my.oschina.net/hblt147/blog/3002378

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Apache DolphinScheduler是一个新一代分布式大数据工作流任务调度系统,致力于“解决大数据任务之间错综复杂的依赖关系,整个数据处理开箱即用”。它以 DAG(有向无环图) 的方式将任务连接起来,可实时监控任务的运行状态,同时支持重试、从指定节点恢复失败、暂停及 Kill任务等操作。目前已经有像IBM、腾讯、美团、360等400多家公司生产上使用。 调度系统现在市面上的调度系统那么多,比如老牌的Airflow, Oozie,Kettle,xxl-job ,Spring Batch等等, 为什么要选DolphinScheduler ? DolphinScheduler 的定位是大数据工作流调度。通过把大数据和工作流做了重点标注. 从而可以知道DolphinScheduler的定位是针对于大数据体系。 DolphinScheduler是非常强大的大数据调度工具,有以下一些特点:1、通过拖拽以DAG 图的方式将 Task 按照任务的依赖关系关联起来,可实时可视化监控任务的运行状态;2、支持丰富的任务类型;3、支持工作流定时调度、依赖调度、手动调度、手动暂停/停止/恢复,同时支持失败重试/告警、从指定节点恢复失败、Kill 任务等操作;4、支持工作流全局参数及节点自定义参数设置;5、支持集群HA,通过 Zookeeper实现 Master 集群和 Worker 集群去中心化;6、支持工作流运行历史树形/甘特图展示、支持任务状态统计、流程状态统计;7、支持补数,并行或串行回填数据。课程会带大家构建DolphinScheduler大数据调度平台,实战讲解多种任务调度配置,会基于案例讲解DolphinScheduler使用,让大家在实战中掌握DolphinScheduler。 DolphinScheduler 发展很快 很多公司调度都切换到了DolphinScheduler,掌握DolphinScheduler调度使用势在必行,抓住新技术机遇,为跳巢涨薪做好准备。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值