oozie简单使用

来自

http://shiyanjun.cn/archives/684.html
https://www.cnblogs.com/cenzhongman/p/7229387.html?yyue=a21bo.50862.201879
https://www.cnblogs.com/xing901022/p/6216456.html

简要说明:

使用oozie需要coordinator.xml,job.properties, workflow.xml和jar包
需要将coordinator.xml, workflow.xml,lib/*.jar上传到hdfs上
job.properties:各种参数,像namenode,jobTracker,以及在程序中需要使用到的各种不变参数
coordinator.xml:类似与crontab,主要用来启动job,包括任务启动时间,频次,相关目录,job输入输出,以及job中需要的变动的参数
workflow.xml:job执行流程,各种动作的转换
web端:用于查看任务情况,查看错误原因等

配置参数

coordinator.xml
<!--
#######################################################################
# 说明
#######################################################################
-->
<coordinator-app name="${sys_name}-Coord" frequency="${coord:hours(1)}"
                 start="${start_date}T01:00+0800" end="${end_date}T04:00+0800" timezone="Asia/Shanghai" xmlns="uri:oozie:coordinator:0.4">
    <controls> <!--一些控制参数-->
        <timeout>-1</timeout><!--超时时间-->
        <concurrency>6</concurrency><!--并发数-->
        <throttle>12</throttle><!--允许Coordinator动作处于WAITING状态的最大数量-->
    </controls>

    <datasets><!--job中用到的数据集,多的话可以放在另一个xml中include进来<include>${wf_datasets}</include>-->
        <dataset name="input" frequency="${coord:hours(1)}" initial-instance="${start_date}T00:00+0800" timezone="Asia/Shanghai">
            <uri-template>${input}/${YEAR}${MONTH}${DAY}/${YEAR}${MONTH}${DAY}${HOUR}</uri-template>
        </dataset>
        <dataset name="config" frequency="${coord:hours(1)}" initial-instance="${start_date}T01:00+0800" timezone="Asia/Shanghai">
            <uri-template>${config}/opConf_${YEAR}${MONTH}${DAY}${HOUR}.csv</uri-template>
        </dataset>
        <dataset name="outpath" frequency="${coord:hours(1)}" initial-instance="${start_date}T01:00+0800" timezone="Asia/Shanghai">
            <uri-template>${outpath}/${YEAR}${MONTH}${DAY}/${YEAR}${MONTH}${DAY}${HOUR}</uri-template>
        </dataset>
    </datasets>

    <input-events><!--输入-->
        <data-in name="input" dataset="input">
            <instance>${coord:current(-1)}</instance>
        </data-in>
    </input-events>

    <output-events><!--输出-->
        <data-out name="outpath" dataset="outpath">
            <instance>${coord:current(-1)}</instance>
        </data-out>
    </output-events>

    <action><!--传给workflow的一些随时间变化的参数-->
        <workflow>
            <app-path>${wf_path}</app-path> <!--hdfs上job的存放路径-->
            <configuration>
                <property>
                    <name>input</name>
                    <value>${input}/${coord:formatTime(coord:dateOffset(coord:nominalTime(), -1, 'HOUR'),'yyyyMMdd')}/${coord:formatTime(coord:dateOffset(coord:nominalTime(), -1, 'HOUR'),'yyyyMMddHH')}</value>
                </property>
                <property>
                    <name>config</name>
                    <value>${config}/opConf_${coord:formatTime(coord:dateOffset(coord:nominalTime(), -1, 'HOUR'),'yyyyMMddHH')}.csv</value>
                </property>
                <property>
                    <name>outpath</name>
                    <value>${coord:dataOut('outpath')}</value>
                </property>
                <property>
                    <name>date</name>
                    <value>${coord:formatTime(coord:dateOffset(coord:nominalTime(), -1, 'HOUR'),'yyyyMMdd')}</value>
                </property>
                <property>
                    <name>hour</name>
                    <value>${coord:formatTime(coord:dateOffset(coord:nominalTime(), -1, 'HOUR'),'HH')}</value>
                </property>
            </configuration>
        </workflow>
    </action>
</coordinator-app>
元素名称 含义说明
timeout 超时时间,单位为分钟。当一个Coordinator Job启动的时候,会初始化多个Coordinator动作,timeout用来限制这个初始化过程。默认值为-1,表示永远不超时,如果为0 则总是超时。
concurrency 并发数,指多个Coordinator Job并发执行,默认值为1。
execution 配置多个Coordinator Job并发执行的策略:默认是FIFO。另外还有两种:LIFO(最新的先执行)、LAST_ONLY(只执行最新的Coordinator Job,其它的全部丢弃)。
throttle 一个Coordinator Job初始化时,允许Coordinator动作处于WAITING状态的最大数量。
常量表示形式 含义说明
${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()} dataset对应的时区与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=” c o o r d : d a y s ( 1 ) f r e q u e n c y = {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指定模式
workflow.xml
 <!--
#######################################################################
# 说明
#######################################################################
-->

<workflow-app xmlns="uri:oozie:workflow:0.4" name="${sys_name}-WF${date}">
    <start to="preBegin"/>
    <decision name="preBegin">
        <switch>
            <case to="scp_stat">${fs:exists(concat(outpath,"/_SUCCESS"))}</case>
            <default to="upload-config"/>
        </switch>
    </decision>

    <action name="upload-config" retry-max="3" retry-interval="3">
        <ssh xmlns="uri:oozie:ssh-action:0.1">
             <host>${sshUser}@${sshHost}</host>
            <command>sh /path/genConfig.sh</command>
            <args>${date}</args>
            <args>${hour}</args>
        </ssh>
        <ok to="do-job"/>
        <error to="error-mail"/>
    </action>

    <action name="do-job" retry-max="1" retry-interval="10">
        <java>
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${namenode}</name-node>
            <main-class>job.JobName</main-class>
            <arg>-Dmapreduce.job.queuename=${queueName}</arg>
            <arg>-Ddfs.client.socket-timeout=30000</arg>
            <arg>-Dmapreduce.map.speculative=true</arg>
            <arg>...</arg>
        </java>
        <ok to="check-answer"/>
        <error to="error-mail"/>
    </action>
    <decision name="check-answer">
        <switch>
            <case to="scp_stat">${fs:exists(concat(outpath,"/_SUCCESS"))}</case>
            <default to="error-mail"/>
        </switch>
    </decision>

    <action name="scp_stat" retry-max="3" retry-interval="10">
        <ssh xmlns="uri:oozie:ssh-action:0.1">
            <host>${sshUser}@${sshHost}</host>
            <!-- todo: portability -->
            <command>sh /path/getOut.sh</command>
            <args>${date}</args>
            <args>${hour}</args>
        </ssh>
        <ok to="end"/>
        <error to="error-mail"/>
    </action>

    <action name="error-mail" retry-max="3" retry-interval="10">
        <email xmlns="uri:oozie:email-action:0.1">
            <to>${develop_email_list}</to>
            <subject>[Error] ${sys_name}-WF${date} ${wf:lastErrorNode()}</subject>
            <body>
Workflow: ${sys_name}-WF${date}${hour}
Wid: ${wf:id()}
Action: ${wf:lastErrorNode()}
Error message: ${wf:errorMessage(wf:lastErrorNode())}
            </body>
        </email>
        <ok to="fail"/>
        <error to="fail"/>
    </action>

    <kill name="fail">
        <message>============ ERROR: ${wf:lastErrorNode()}, [${wf:errorMessage(wf:lastErrorNode())}] ============</message>
    </kill>
    <end name="end"/>
</workflow-app>
job.properties
#####################################################################
# job.properties
#######################################################################
[sys]
sys_name=
#######################################################################
[oozie]
oozie_url=
sshHost=
sshUser=
oozie.wf.validate.ForkJoin=
#######################################################################
[hadoop]
namenode=
jobTracker=
ws_url=
queueName=
#######################################################################
[date]
start_date=2018-04-19
end_date=2018-04-19
#######################################################################
[hdfs]
input=
outpath=
config=
# workflow
wf_job=
#####################################################################
[local]
wf_local=
#######################################################################
[notifier]
develop_email_list=
scv_email_list=
phone_number=
message_sender=
#######################################################################
[log]
log_dir=

其他
1. 存在jar包冲突,lib中的jar包如果有相同类,会随机挑选进行执行,导致结果出错,需要人工防范出现jar包中存在相同类的情况
2. web端只是负责显示,并没有相应执行操作

以上仅是自己观点,如有问题,欢迎指正!

猜你喜欢

转载自blog.csdn.net/d2457638978/article/details/80003820
今日推荐