一、 基础命令

#提交任务。-config是指定oozie任务的job.properties文件位置,submit是提交任务,每次提交任务后会把任务放到服务器并生产一个jobId,但是并不会运行这个任务
oozie job -oozie http://namenode.com:11000/oozie -config /root/test1/job.properties -submit

#执行该任务,0000000-180927111227906-oozie-oozi-W这个是jobId,每个任务的id是唯一的,这个是由提交任务之后产生的
oozie job -oozie http://namenode.com:11000/oozie -start 0000002-211008094443862-oozie-oozi-W

#运行该任务,运行=提交+执行
oozie job -oozie http://namenode.com:11000/oozie -config /root/test1/job.properties -run

# 后边加上 -D 可以代替job.properties中参数
oozie job -oozie http://namenode.com:11000/oozie  -run -D oozie.use.system.libpath=true

#查看任务的信息,可以查看到每个执行项状态
oozie job -oozie http://nn.com:11000/oozie -info 0000017-211008094443862-oozie-oozi-W

#查看任务的日志,可以查看每个任务的输出内容及日志内容
oozie job -oozie http://namenode.com:11000/oozie -log 0000008-211008094443862-oozie-oozi-W

#可以查看任务的指定项的状态,比如查看action的name为process-select的执行状态
oozie job -oozie http://namenode.com:11000/oozie -info 0000023-211008094443862-oozie-oozi-C@1

#杀死任务
oozie job -oozie http://namenode.com:11000/oozie -kill 0000008-211008094443862-oozie-oozi-W

二、配置文件

配置文件只是用来讲解方便,不能直接拿来使用,官网上有打包好的任务

1.job.properties
#hsfs端口地址
nameNode=hdfs://hgdp-001:8020     

#resourceManager的端口
jobTracker=hgdp-001:8032 
       
#oozie队列
queueName=default            

#输入参数
input=2017-05-09             

#自定义目录
hdfspath=user/root           

#自定义全局目录
examplesRoot=ocn-itv-oozie      

#是否启动系统lib库
oozie.use.system.libpath=True    

#参数设置
sparkopts=--executor-memory 1G    

#coordinator任务开始时间
start=2017-09-04T00:05+0800    

#coordinator任务结束时间
end=2017-09-04T00:36+0800     

start2=2017-09-01T00:06+0800

end2=2017-09-04T00:36+0800

#用户自定义lib库(存放jar包)
oozie.libpath=${nameNode}/${hdfspath}/${examplesRoot}/lib/         

workflowAppUri=${nameNode}/${hdfspath}/${examplesRoot}/wf/spark/fork/

#coordinator定时调度对应的workflow.xml所在目录
workflowAppUri2=${nameNode}/${hdfspath}/${examplesRoot}/wf/spark/single/  

appPath=${nameNode}/${hdfspath}/${examplesRoot}/cd/single/

#bundle调用对应的coordinator.xml所在目录
appPath2=${nameNode}/${hdfspath}/${examplesRoot}/cd/single1/  
      
#bundle.xml所在目录
oozie.bundle.application.path=${nameNode}/${hdfspath}/${examplesRoot}/bd/bd1/    

2.coordinator.xml

<coordinator-app name="spark_hour_coordinator"
                 frequency="05 * * * *" <!-- 定时器,分时月日年-->
                 start="2022-01-07T00:00+0800" end="2022-01-08T00:00+0800" <!-- 起始时间,终止时间-->
				 timezone="GMT+08:00"<!-- 时差-->
                 xmlns="uri:oozie:coordinator:0.2">
    <controls>
        <timeout>60</timeout><!-- 超时时间-->
        <concurrency>1</concurrency><!-- 并发任务数-->
    </controls>
    <datasets><!-- 主要用来配置HDFS上的数据目录和文件-->
        <dataset name="InputPrefix" frequency="${coord:hours(1)}"
                 initial-instance="${log_start_time}" timezone="GMT+08:00">
            <uri-template>${input_prefix}/${YEAR}${MONTH}${DAY}</uri-template><!-- 传参形式表示,可以写绝对路径-->
            <done-flag></done-flag>
        </dataset>
        <dataset name="OutputPrefix" frequency="${coord:hours(1)}"
                 initial-instance="${log_start_time}" timezone="GMT+08:00">
            <uri-template>${output_prefix}</uri-template>
            <done-flag></done-flag>
        </dataset>
    </datasets>
    <input-events><!-- 满足条件才会触发执行,需使用dataset实例-->
        <data-in name="INPUT_PREFIX" dataset="InputPrefix">
            <instance>${coord:current(-2)}</instance><!-- 定时任务时间-2小时-->
        </data-in>
    </input-events>
    <output-events><!-- 满足条件才会触发执行,需使用dataset实例-->
        <data-out name="OUTPUT_PREFIX" dataset="OutputPrefix">
            <instance>${coord:current(+5)}</instance><!-- 定时任务时间+5小时-->
        </data-out>
    </output-events>
    <action>
        <workflow><!-- -->
            <app-path>${wf_application_path}</app-path><!-- hdfs上jar路径-->
            <configuration>
                <property>
                    <name>WF_INPUT</name><!-- 定义输入路径-->
                    <value>
                        ${coord:dataIn('INPUT_PREFIX')}/${coord:formatTime(coord:dateOffset(coord:nominalTime(), -2, 'HOUR'), 'HH')}*
                    </value>
                </property>
                <property>
                    <name>WF_OUTPUT</name>
                    <value>
                        ${coord:dataOut('OUTPUT_PREFIX')}/stat-data/hour/${coord:formatTime(coord:dateOffset(coord:nominalTime(), -2, 'HOUR'), 'yyyyMMdd')}/${coord:formatTime(coord:dateOffset(coord:nominalTime(), -2, 'HOUR'), 'HH')}
                    </value>
                    <property>
                    <name>CURRENT_DATE</name>
                    <value>${coord:formatTime(coord:dateOffset(coord:nominalTime(), -2, 'HOUR'), 'yyyyMMdd')}</value>
                </property>
                <property>
                    <name>CURRENT_HOUR</name>
                    <value>${coord:formatTime(coord:dateOffset(coord:nominalTime(), -2, 'HOUR'), 'HH')}</value>
                </property>
                </property>
                    <name>oozie.use.system.libpath</name>
                    <value>true</value>
                </property>
            </configuration>
        </workflow>
    </action>
</coordinator-app>
3.workflow.xml
<workflow-app name="wf_hour_${CURRENT_DATE}${CURRENT_HOUR}" xmlns="uri:oozie:workflow:0.5">
    <global><!-- 指定yarn队列名,可省略-->
    <configuration>
        <property>
            <name>mapred.job.queue.name</name>
            <value>root</value>
        </property>
    </configuration>
    </global>
    <start to="wf1"/><!-- 从那个action开始-->
    <action name="update_resfile"><!-- ssh action-->
        <ssh xmlns="uri:oozie:ssh-action:0.1">
            <host>${ssh_user}@${ssh_ip}</host>
            <command>sh ${shell_dir}/upload.sh</command>
            <capture-output/>
        </ssh>
        <ok to="join-wf"/><!--成功了执行哪个action-->
        <error to="join-wf"/><!--失败了执行哪个action-->
    </action>
    <join name="join-wf" to="fork-wf"/>
    <fork name="fork-wf"><!--同步执行action-->
        <path start="wf2" />
        <path start="decision-wf" />
    </fork>
    <action name="wf2"><!-- spark action-->
        <spark xmlns="uri:oozie:spark-action:0.1"><!-- -->
            <job-tracker>${job_tracker}</job-tracker><!-- yarn地址-->
            <name-node>${name_node}</name-node><!-- hdfs地址-->
            <prepare><!-- 执行任务前删除原有路径文件-->
                <delete path="${name_node}${OUTPUT}/"/>
            </prepare>
            <master>yarn-cluster</master><!-- spark任务配置-->
            <mode>cluster</mode>
            <name>HttpTraceBase_${CURRENT_DATE}${CURRENT_HOUR}</name>
            <class>Test</class>
            <jar>${jar_path}</jar>
            <spark-opts>--driver-memory 2g  num-executors 100 --executor-memory 2g --executor-cores 2 --conf spark.network.timeout=1000</spark-opts>
            <arg>${WF_INPUT}/*</arg><!-- 作业参数-->
            <arg>${WF_OUTPUT}/</arg>
        </spark>
        <ok to="end"/>
        <error to="kill"/>
    </action>
	<decision name="decision-wf">
        <switch>
            <case to="wf3">${wf:conf('IF_EXSIT') eq "true"}</case><!-- 当参数为true时执行wf3-->
            <default to="end"/>
        </switch>
    </decision>
    <action name="wf3">
        <ssh xmlns="uri:oozie:ssh-action:0.1">
            <host>${ssh_user}@${ssh_ip}</host>
            <command>sh ${shell_dir}/day.sh</command>
        </ssh>
        <ok to="end"/>
        <error to="end"/>
    </action>
    <kill name="kill">
        <message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <end name="end"/>
</workflow-app>

参考博客:
oozie详解:里边部分配置讲解更详细

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐