OOZIE系统成功【2】跑通定时调度的…

【要点】OOZIE跑spark程序会遇到这么一个奇葩的现象:在oozie查job的info,显示SUCCEEDED。去8088端口的yarn那儿查,也显示SUCCEEDED。然后进hdfs看看生成的结果——啥文件都没有。这是什么情况!
【原因】编写workflow.xml文件的时候,生成目的地的地址,一定要在最后加斜杠。
如果输出结果要放到 /usr/oozie/output中的spark文件夹里面,那么一定要这么写:
/usr/oozie/output/spark/
而不能这么写( 不加斜杠无法输出结果):
/usr/oozie/output/spark

好了,言归正传:

OOZIE调度spark的时候,其给的样例用的是 命令行+ 参数 的调度方式。
自然而然,我们编写spark的java程序,也可以这样编写,根据main输入进来的参数,进行一定的行为:
public static void main(String[] args) throws Exception {
        if (args.length < 3) {
            System.err.println("Usage: SparkFileCopy ");
            System.exit(1);
        }

  在netbeans里面编译运行建立工程项目,编写spark程序后,有时候会出现无法“清理并构建”的现象。这是因为项目还没有进行编译,没有class文件,它无法打包。
  使用windows比较苦恼的问题,一个是用户名与权限,二个是环境配置。有ubuntu并装了netbeans自然最好。在windows下咋整?总不能非得运行成功才能打包jar吧?答案很简单,看上面的程序,if (args.length < 3) {System.exit(1);}  ——没有输入参数自然不需要运行啦。于是就这么编译运行就好,打印完一阵println结束程序后,各种class也生成好了。右键点击项目,“清理并构建”,到工程目录下找到dist里面的jar,仍到装有oozie的机子里面。

一个定时任务调度目录里面,会有这么几个文件:
coordinator.xml
job.properties
lib/OozieHelowod.jar
workflow.xml

其中job.propreties与非定时的任务调度不同,非定时调度的job如下:
nameNode=hdfs://localhost:8020
jobTracker=localhost:8021
master=local[*]
queueName=default
examplesRoot=examples
user.name=hadoop

oozie.use.system.libpath=true
oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/apps/spark
===========================华丽的分割线==============================
定时调度的如下:
nameNode=hdfs://localhost:8020
jobTracker=localhost:8021
master=local[*]
queueName=default
examplesRoot=examples
user.name=hadoop

oozie.use.system.libpath=true
oozie.coord.application.path=${nameNode}/user/oozie/${examplesRoot}/apps/cronSpark
start=2017-02-13T09:10Z
end=2017-02-13T10:00Z
workflowAppUri=${nameNode}/user/oozie/${examplesRoot}/apps/cronSpark
=========================华丽的分割线==============================

从粗体我们可以看到,定时调度的时候,要分别设置两个app:
1、定时任务的schedule app
2、schedule每次定时所要执行的实际任务workflowApp

  按照这个原理,两个任务其实可以分离成不同文件夹的。需要定时调度的时候估计单独写一个job就好。
  我们还注意到,job.properties里面设置了任务的开始时间start和结束时间end。由于oozie默认使用UTC时区,意味着当用中国时间计算的时候,每次我们要减去8个小时。关于更改oozie默认时区的设置,详见 这里。更改过后,我们在设置定时的时候,也要加上相应的时区后缀:

For example, a datetime in UTC is 2012-08-12T00:00Z , the same datetime in GMT+5:30 is 2012-08-12T05:30+0530 .
—— 参考资料

  关于日期的配置与零点的定义,详见本文末。
  你也许会问,设置的时间 早于这个任务调度程序开始的时间,Oozie会怎么办?比如我设置今早8点运行,每小时运行一次,结果我忘记了,现在下午4点我才开始用run启动这个定时的job。答案是,oozie会把过期未执行的任务挨个执行一遍,现在是下午4点,距离早上八点一共间隔了9次(8点执行一次、9点执行一次……16点执行一次),这9次job会依次执行,8点的跑完立马跑9点那次,直到现在的时间。比如跑完这9次job花了半小时,也就是现在4点半它跑完了,它会等待5点的到来,再去跑5点的job。

接着让我们来看看关键的coordinator-app.xml文件
                 xmlns="uri:oozie:coordinator:0.2">
       
       
            ${workflowAppUri}
           
               
                    jobTracker
                    ${jobTracker}
               
               
                    nameNode
                    ${nameNode}
               
               
                    queueName
                    ${queueName}
               
           
       
   
几乎没有关键性的东西,唯一的关键设置就是时间间隔 coord:minutes(10)





Oozie日期的配置:

4.1. Datetime

If the Oozie processing timezone is UTC , all datetime values are always in UTC down to a minute precision, 'YYYY-MM-DDTHH:mmZ'.

For example 2009-08-10T13:10Z is August 10th 2009 at 13:10 UTC.

If the Oozie processing timezone is a GMT offset GMT(+/-)#### , all datetime values are always in ISO 8601 in the corresponding GMT offset down to a minute precision, 'YYYY-MM-DDTHH:mmGMT(+/-)####'.

For example 2009-08-10T13:10+0530 is August 10th 2009 at 13:10 GMT+0530, India timezone.




Oozie关于零点的定义:

4.1.1 End of the day in Datetime Values

It is valid to express the end of day as a '24:00' hour (i.e. 2009-08-10T24:00Z ).

However, for all calculations and display, Oozie resolves such dates as the zero hour of the following day (i.e. 2009-08-11T00:00Z ).



Oozie关于时间间隔的介绍:

Examples:

 

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



参考资料Oozie 4.3.0官网





你可能感兴趣的:(【C,Java与网络编程】)