oozie coordinator 定时调度

  coordinator application:

   coordinator application是在满足一组条件时触发动作(通常是工作流作业)的程序。条件可以是时间频率、新数据集实例或其他外部事件。

   coordinator application的类型:同步:它的协调器动作是在指定的时间间隔创建的,通常是参数化的。

 coordinator job:

  要创建一个coordinator job,必须向协调器引擎提供解决所有coordinator application参数的作业配置.

  coordinator  job是从开始时间到结束时间运行的coordinator application的运行实例,开始时间必须比结束时间早。

  通常情况下,一个coordinator 作业是下列状态之一:PREP, RUNNING, RUNNINGWITHERROR, PREPSUSPENDED, SUSPENDED, SUSPENDEDWITHERROR, PREPPAUSED, PAUSED, PAUSEDWITHERROR, SUCCEEDED, DONEWITHERROR, KILLED, FAILED .

  有效的coordinator job状态转换是:

    PREP --> PREPSUSPENDED | PREPPAUSED | RUNNING | KILLED
    RUNNING --> RUNNINGWITHERROR | SUSPENDED | PAUSED | SUCCEEDED | KILLED
    RUNNINGWITHERROR --> RUNNING | SUSPENDEDWITHERROR | PAUSEDWITHERROR | DONEWITHERROR | KILLED | FAILED
    PREPSUSPENDED --> PREP | KILLED
    SUSPENDED --> RUNNING | KILLED
    SUSPENDEDWITHERROR --> RUNNINGWITHERROR | KILLED
    PREPPAUSED --> PREP | KILLED
    PAUSED --> SUSPENDED | RUNNING | KILLED
    PAUSEDWITHERROR --> SUSPENDEDWITHERROR | RUNNINGWITHERROR | KILLED
    FAILED | KILLED --> IGNORED
    IGNORED --> RUNNING

  当一个coordinator 提交作业,Oozie解析 coordinator job XML。Oozie然后创建与状态准备coordinator 记录并返回一个唯一的ID,如果没有设置暂停时间coordinator 也立即开始.

Coordinator Action:

  coordinator job 创建并执行 coordinator actions.

  coordinator action通常是一个workflow job ,它消耗并生成数据集实例。

 一旦创建了coordinator action(这也被称为正在实现的action), coordinator action 将一直等待,直到满足执行所需的所有输入,或者直到等待超时为止。

  

Synchronous Coordinator Application定义:

   synchronous coordinator 是由 name, start time ,end time, the frequency of creation of its coordinator actions, the input events, the output events , action control information来定义的.

语法:  

<coordinator-app name="[NAME]" frequency="[FREQUENCY]"
                    start="[DATETIME]" end="[DATETIME]" timezone="[TIMEZONE]"
                    xmlns="uri:oozie:coordinator:0.1">
      <controls>
        <timeout>[TIME_PERIOD]</timeout>
        <concurrency>[CONCURRENCY]</concurrency>
        <execution>[EXECUTION_STRATEGY]</execution>
      </controls>
.
      <datasets>
        <include>[SHARED_DATASETS]</include>
        ...
.
        <!-- Synchronous datasets -->
        <dataset name="[NAME]" frequency="[FREQUENCY]"
                 initial-instance="[DATETIME]" timezone="[TIMEZONE]">
          <uri-template>[URI_TEMPLATE]</uri-template>
        </dataset>
        ...
.
      </datasets>
.
      <input-events>
        <data-in name="[NAME]" dataset="[DATASET]">
          <instance>[INSTANCE]</instance>
          ...
        </data-in>
        ...
        <data-in name="[NAME]" dataset="[DATASET]">
          <start-instance>[INSTANCE]</start-instance>
          <end-instance>[INSTANCE]</end-instance>
        </data-in>
        ...
      </input-events>
      <output-events>
         <data-out name="[NAME]" dataset="[DATASET]">
           <instance>[INSTANCE]</instance>
         </data-out>
         ...
      </output-events>
      <action>
        <workflow>
          <app-path>[WF-APPLICATION-PATH]</app-path>
          <configuration>
            <property>
              <name>[PROPERTY-NAME]</name>
              <value>[PROPERTY-VALUE]</value>
            </property>
            ...
         </configuration>
       </workflow>
      </action>
   </coordinator-app>

官网给出的例子:

<coordinator-app name="hello-coord" frequency="${coord:days(1)}"
                    start="2009-01-02T08:00Z" end="2009-01-02T08:00Z"
                    timezone="America/Los_Angeles"
                    xmlns="uri:oozie:coordinator:0.1">
      <datasets>
        <dataset name="logs" frequency="${coord:days(1)}"
                 initial-instance="2009-01-02T08:00Z" timezone="America/Los_Angeles">
          <uri-template>hdfs://bar:8020/app/logs/${YEAR}${MONTH}/${DAY}/data</uri-template>
        </dataset>
        <dataset name="siteAccessStats" frequency="${coord:days(1)}"
                 initial-instance="2009-01-02T08:00Z" timezone="America/Los_Angeles">
          <uri-template>hdfs://bar:8020/app/stats/${YEAR}/${MONTH}/${DAY}/data</uri-template>
        </dataset>
      </datasets>
      <input-events>
        <data-in name="input" dataset="logs">
          <instance>2009-01-02T08:00Z</instance>
        </data-in>
      </input-events>
      <output-events>
         <data-out name="output" dataset="siteAccessStats">
           <instance>2009-01-02T08:00Z</instance>
         </data-out>
      </output-events>
      <action>
        <workflow>
          <app-path>hdfs://bar:8020/usr/joe/logsprocessor-wf</app-path>
          <configuration>
            <property>
              <name>wfInput</name>
              <value>${coord:dataIn(‘input‘)}</value>
            </property>
            <property>
              <name>wfOutput</name>
              <value>${coord:dataOut(‘output‘)}</value>
            </property>
         </configuration>
       </workflow>
      </action>
   </coordinator-app>

我们工作时写的:

coordinator.xml
<coordinator-app name="cron-coord" frequency="${coord:minutes(6)}" start="${start}" end="${end}" timezone="UTC" xmlns="uri:oozie:coordinator:0.2">
    <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>
                <property>
                    <name>mainClass</name>
                    <value>com.ocn.itv.rinse.ErrorCollectRinse</value>
                </property>
            </configuration>
        </workflow>
    </action>
</coordinator-app>
workflow.xml
<workflow-app  name="Spark-example1" xmlns="uri:oozie:workflow:0.5">
    <start to="spark-SparkOozieAction"/>
    <action name="spark-SparkOozieAction">
       <spark xmlns="uri:oozie:spark-action:0.1">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>
            </configuration>
            <master>yarn-cluster</master>
            <mode>cluster</mode>
            <name>Spark Example</name>
            <class>${mainClass}</class>
            <jar>ocn-itv-spark-3.0.3-rc1.jar</jar>
            <spark-opts>${sparkopts}</spark-opts>
            <arg>${input}</arg>
        </spark >
        <ok to="end"/>
        <error to="fail"/>
    </action>
  <kill name="fail">
       <message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
   <end name="end"/>
</workflow-app> 
job.properties

nameNode=hdfs://hgdp-001:8020
jobTracker=hgdp-001:8032
queueName=default
input=2017-05-09
start=2017-08-28T17:50+0800
end=2017-08-28T18:50+0800
sparkopts=--executor-memory 1G
oozie.use.system.libpath=True
hdfspath=user/root
examplesRoot=ocn-itv-oozie
oozie.libpath=${nameNode}/${hdfspath}/${examplesRoot}/lib/
workflowAppUri=${nameNode}/${hdfspath}/${examplesRoot}/wf/wf1/
oozie.coord.application.path=${nameNode}/${hdfspath}/${examplesRoot}/cd/cd1/

最后运行:

  启动任务:oozie job -config job.properties -run -oozie http://xxxx(地址):11000/oozie

运行结果:

时间: 2024-10-22 13:19:09

oozie coordinator 定时调度的相关文章

Apache Oozie Coordinator 作业自定义配置定时任务

一,介绍 Oozie是Hadoop的工作流系统,如果使用Oozie来提交MapReduce作业(Oozie 不仅仅支持MapReduce作业,还支持其他类型的作业),可以借助Oozie Coordinator 作业来实现定时运行. 对于Oozie的作业而言,在它提交给Hadoop之前首先需要部署好.即,将配置文件(定时作业是coordinator.xml,workflow作业则是workflow.xml).可执行的jar文件.还有待处理的输入数据上传到HDFS上. 一个典型的workflow作业

Oozie coordinator 作业自定义的配置的一些方法

Oozie的coordinator有啥用? The Oozie Coordinator system allows the user to define and execute recurrent and interdependent workflow jobs (data application pipelines). 说白了就是可以把各个 workflow作业组织起来.比如,A作业执行完成之后,会有输出,该输出触发B作业的执行.那么 A B 这两个workflow作业就可以通过一个coord

SpringMVC + Mybatis + SpringSecurity(权限控制到方法按钮) + Rest(服务) + Webservice(服务) + Quartz(定时调度)+ Lucene(搜索引擎) + HTML5 bootstrap + Maven项目构建绝对开源平台

框架整合: Springmvc + Mybatis + Shiro(权限) + REST(服务) + WebService(服务) + JMS(消息) + Lucene(搜搜引擎) + Quartz(定时调度) + Bootstrap Html5(支持PC.IOS.Android) 需要源码请加Q:3121026417   此处[源码获取地址] 框架简介: 项目Maven构建,真实大型互联网架构,做到高并发,大数据处理,整个项目使用定制化服务思想,提供模块化.服务化.原子化的方案,将功能模块进行

Spring整合quartz框架实现任务定时调度

1.  首先需要引入需要的jar包,如上图所示. 2. 编写需要定时调度的测试类: package com.jp.task; import java.util.Date; public class TestTask{ private static int counter = 0; protected void execute() { long ms = System.currentTimeMillis(); System.out.println("\t\t" + "=====

定时调度

JS中的定时调度 $(function(){ //一定要有这个 $("#clickButton").click(function(){ myfunction(); window.setInterval("myfunction()",3000);//注意:方法名要有双引号 }); }); function myfunction(){ alert("my firdt function !"); } 注意 : 方法名要有引号,双引号

springmvc+quartz简单实现定时调度

一.简介:Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序.Jobs可以做成标准的Java组件或 EJBs.Quartz的最新版本为Quartz 2.3.0. 二.因为定时调度,在很多业务上面都会涉及,想要根据自己的规则来生成自己想要的达到的目的.所以利用quartz来时间定时任务的触发.是非常有必要的. 三.

java 多线程——quartz 定时调度的例子

java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 java 多线程—— 线程等待与唤醒 概述 第1部分 配置 第2部分 代码示例 第1部分 配置 有关quartz的api文档地址:Quartz Enterprise Job Scheduler 1.8.6 API 主要接口目录: 重点看下Job,Scheduler,Trigger,JobDetai

Timer类实现定时调度

使用timer类定时调度,生成文件 timer类需要通过监听器来初始化定时器,web容器在运行时自动加载 先写个定时任务类CreateFileTask,继承至TimerTask,需要重写run()方法 import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; i

定时调度(定时器)的使用

class Task extends TimerTask{ @Override public void run() { //UUID可以随机生成一个不会重复的字符串 System.out.println(UUID.randomUUID()); } } public class Test { public static void main(String[] args) { //定时调度(定时器) new Timer().schedule(new Task(), 1000, 2000);//1秒后开