简介Oozie已经安装完成了我们使用Oozie调度Shell脚本。调度Shell脚本解压一下官方案例模板rootmaster:/opt/module/oozie-4.0.0-cdh5.3.6# tar -zxvf oozie-examples.tar.gz在examples目录下的apps中都是oozie的官方示例平时多看看也是不错的。现在我们拿出来shell的示例/opt/module/oozie-4.0.0-cdh5.3.6/oozie-apps/shelloozie-apps是我们自己创建的目录shell是复制的oozie的示例。我们看看里面有什么只有两个文件我们打开一下job.properties#nameNode 是HDFS的地址 nameNodehdfs://localhost:8020 # jobTracker 是yarn的地址 也就是resoucemanage的地址 jobTrackerlocalhost:8021 #提交的队列名称 queueNamedefault #这个参数是任务地址 examplesRootexamples #你仔细观看就可以看到 上面的参数在path里都用到了都是使用${XX} #oozie.wf.application.path 表示的是任务在HDFS上的地址 oozie.wf.application.path${nameNode}/user/${user.name}/${examplesRoot}/apps/shellworkflow.xml工作流配置文件oozie是使用xml配置任务流程!--workflow-app 的参数name任务名称--workflow-appxmlnsuri:oozie:workflow:0.4nameshell-wf!-- start:控制流节点表示开始 to指向动作节点名称 --starttoshell-node/!--action动作节点 name动作节点名称--actionnameshell-node!--shell:shell任务--shellxmlnsuri:oozie:shell-action:0.2!--job-tracker指定yarn地址--job-tracker${jobTracker}/job-tracker!--name-node指定HDFS地址--name-node${nameNode}/name-node!--配置项--configuration!--指定MR的队列--propertynamemapred.job.queue.name/namevalue${queueName}/value/property/configuration!--exec:执行的意思执行shell 必须有exec--exececho/exec!--参数--argumentmy_outputHello Oozie/argument!--如果想要捕获输出需要设置capture-output--capture-output//shell!--运行成功to指向某个控制流节点--oktocheck-output/!--运行失败to指向某个控制流节点--errortofail//action!--decision:决策控制节点 就和java的switch的意思一样--decisionnamecheck-outputswitchcasetoend${wf:actionData(shell-node)[my_output] eq Hello Oozie}/casedefaulttofail-output//switch/decision!--kill终止控制节点--killnamefailmessageShell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]/message/kill!--kill终止控制节点--killnamefail-outputmessageIncorrect output, expected [Hello Oozie] but was [${wf:actionData(shell-node)[my_output]}]/message/kill!--结束控制节点--endnameend//workflow-app这些都是官网的示例呢么我们改造一下让他运行我们自己的shell脚本改动job.propertiesnameNodehdfs://master:8020 #yarn默认的端口是8032 jobTrackermaster:8032 queueNamedefault #修改为自己想放的路径名 myRootoozie-apps # 添加自己的脚本文件名称 execFilemy.sh oozie.wf.application.path${nameNode}/user/${user.name}/${myRoot}/shell改动workflow.xmlworkflow-appxmlnsuri:oozie:workflow:0.4nameshell-wf-mystarttoshell-node/actionnameshell-nodeshellxmlnsuri:oozie:shell-action:0.2job-tracker${jobTracker}/job-trackername-node${nameNode}/name-nodeconfigurationpropertynamemapred.job.queue.name/namevalue${queueName}/value/property/configuration!--这里填写我们在job.properties写的文件名参数即可--exec${execFile}/exec!-- argumentmy_outputHello Oozie/argument --!--这里必须有file不然oozie不知道执行的脚本在哪,而且写完脚本路径必须添加#${execFile} execFile只是一个参数名随便定义--file/user/root/oozie-apps/shell/${execFile}#${execFile}/filecapture-output//shelloktoend/errortofail//action!-- decision namecheck-output switch case toend ${wf:actionData(shell-node)[my_output] eq Hello Oozie} /case default tofail-output/ /switch /decision --killnamefailmessageShell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]/message/kill!-- kill namefail-output messageIncorrect output, expected [Hello Oozie] but was [${wf:actionData(shell-node)[my_output]}]/message /kill --endnameend//workflow-app创建my.sh shell脚本#!/bin/bashdate/opt/module/my.log这个时候我们就已经把文件都修改好了然后上传到HDFS。hadoop fs -put oozie-apps/ /user/root上传的时候一定要上传到规定的文件目录下HDFS的检查呢么我们就运行一下试试执行rootmaster:/opt/module/oozie-4.0.0-cdh5.3.6# bin/oozie job -oozie http://master:11000/oozie -config oozie-apps/shell/job.properties -run已经有任务ID了呢么去oozie的web界面看看我这个页面是已经运行完的点击任务回跳出来一些窗口因为我是伪分布式就一台机器所以yarn只能把任务分配给我这台机器呢么我们去看看结果可以看到日志已经出来了任务是成功的。但是如果是集群模式呢么这个日志文件就是分配到哪个节点就在哪个节点的机器上。如果想看日志还是需要去Yarn界面查看使用History就可以看日志了。日志很长自己慢慢看吧。这是一个成功的案呢么如果不成功呢我们修改my.sh脚本#!/bin/bashdata/opt/module/my.log把date换成data并且把my.sh替换HDFS上的脚本运行oozie任务命令可以看到被杀掉了失败了。但是oozie是看不到详细日志的。需要到yarn上看可以看到是命令找不到符合我们的预期。关于oozie可以看到oozie这个命令有很多选项不只是一个run还有kill等其他选项。