• 通过hue提交oozie定时任务


    通过hue提交oozie定时任务

     

    Oozie是什么?

    Oozie是一种Java Web应用程序,它运行在Java servlet容器——即Tomcat——中,并使用数据库来存储以下内容:

    • 工作流定义
    • 当前运行的工作流实例,包括实例的状态和变量

    Hue是什么? 

    Hue是一个可快速开发和调试Hadoop生态系统各种应用的一个基于浏览器的图形化用户接口。

     Hue能干什么? 

    1,访问HDFS和文件浏览 
    2,通过web调试和开发hive以及数据结果展示 
    3,查询solr和结果展示,报表生成 
    4,通过web调试和开发impala交互式SQL Query 
    5,spark调试和开发 
    6,Pig开发和调试 
    7,oozie任务的开发,监控,和工作流协调调度 
    8,Hbase数据查询和修改,数据展示 
    9,Hive的元数据(metastore)查询 
    10,MapReduce任务进度查看,日志追踪 
    11,创建和提交MapReduce,Streaming,Java job任务 
    12,Sqoop2的开发和调试 
    13,Zookeeper的浏览和编辑 
    14,数据库(MySQL,PostGres,SQlite,Oracle)的查询和展示

    提交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 '	' 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的设置,添加配置:

    保存,重启,问题解决

  • 相关阅读:
    nginx (待更新)
    根据 thread id 停止一个线程
    Redis 消息订阅
    faker smtp server
    DRF lazy Serializer
    python super
    django patch
    django patch 解决 ["'15428560000' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] format."]
    自己的随笔
    CSS中文乱码解决方法
  • 原文地址:https://www.cnblogs.com/wangsongbai/p/9165419.html
Copyright © 2020-2023  润新知