简介
Oozie已经安装完成了,我们使用Oozie调度Shell脚本。
调度Shell脚本
解压一下官方案例模板
root@master:/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/shell
oozie-apps是我们自己创建的目录,shell是复制的oozie的示例。我们看看里面有什么?
只有两个文件,我们打开一下
job.properties
#nameNode 是HDFS的地址
nameNode=hdfs://localhost:8020
# jobTracker 是yarn的地址 也就是resoucemanage的地址
jobTracker=localhost:8021
#提交的队列名称
queueName=default
#这个参数是任务地址
examplesRoot=examples
#你仔细观看就可以看到 上面的参数在path里都用到了,都是使用${XX}
#oozie.wf.application.path 表示的是任务在HDFS上的地址
oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/apps/shell
workflow.xml
工作流配置文件,oozie是使用xml配置任务流程
<!--workflow-app 的参数name:任务名称-->
<workflow-app xmlns="uri:oozie:workflow:0.4" name="shell-wf">
<!-- start:控制流节点表示开始 to:指向动作节点名称 -->
<start to="shell-node"/>
<!--action:动作节点 name:动作节点名称-->
<action name="shell-node">
<!--shell:shell任务-->
<shell xmlns="uri:oozie:shell-action:0.2">
<!--job-tracker:指定yarn地址-->
<job-tracker>${jobTracker}</job-tracker>
<!--name-node:指定HDFS地址-->
<name-node>${nameNode}</name-node>
<!--配置项-->
<configuration>
<!--指定MR的队列-->
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<!--exec:执行的意思,执行shell 必须有exec-->
<exec>echo</exec>
<!--参数-->
<argument>my_output=Hello Oozie</argument>
<!--如果想要捕获输出,需要设置<capture-output>-->
<capture-output/>
</shell>
<!--运行成功to指向某个控制流节点-->
<ok to="check-output"/>
<!--运行失败to指向某个控制流节点-->
<error to="fail"/>
</action>
<!--decision:决策控制节点 就和java的switch的意思一样-->
<decision name="check-output">
<switch>
<case to="end">
${wf:actionData('shell-node')['my_output'] eq 'Hello Oozie'}
</case>
<default to="fail-output"/>
</switch>
</decision>
<!--kill:终止控制节点-->
<kill name="fail">
<message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<!--kill:终止控制节点-->
<kill name="fail-output">
<message>Incorrect output, expected [Hello Oozie] but was [${wf:actionData('shell-node')['my_output']}]</message>
</kill>
<!--结束控制节点-->
<end name="end"/>
</workflow-app>
这些都是官网的示例,呢么我们改造一下,让他运行我们自己的shell脚本
- 改动job.properties
nameNode=hdfs://master:8020 #yarn默认的端口是8032 jobTracker=master:8032 queueName=default #修改为自己想放的路径名 myRoot=oozie-apps # 添加自己的脚本文件名称 execFile=my.sh oozie.wf.application.path=${nameNode}/user/${user.name}/${myRoot}/shell
- 改动workflow.xml
<workflow-app xmlns="uri:oozie:workflow:0.4" name="shell-wf-my"> <start to="shell-node"/> <action name="shell-node"> <shell xmlns="uri:oozie:shell-action:0.2"> <job-tracker>${jobTracker}</job-tracker> <name-node>${nameNode}</name-node> <configuration> <property> <name>mapred.job.queue.name</name> <value>${queueName}</value> </property> </configuration> <!--这里填写我们在job.properties写的文件名参数即可--> <exec>${execFile}</exec> <!-- <argument>my_output=Hello Oozie</argument> --> <!--这里必须有file,不然oozie不知道执行的脚本在哪,而且写完脚本路径必须添加#${execFile} execFile只是一个参数名随便定义--> <file>/user/root/oozie-apps/shell/${execFile}#${execFile}</file> <capture-output/> </shell> <ok to="end"/> <error to="fail"/> </action> <!-- <decision name="check-output"> <switch> <case to="end"> ${wf:actionData('shell-node')['my_output'] eq 'Hello Oozie'} </case> <default to="fail-output"/> </switch> </decision> --> <kill name="fail"> <message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message> </kill> <!-- <kill name="fail-output"> <message>Incorrect output, expected [Hello Oozie] but was [${wf:actionData('shell-node')['my_output']}]</message> </kill> --> <end name="end"/> </workflow-app>
- 创建my.sh shell脚本
#!/bin/bash date > /opt/module/my.log
这个时候我们就已经把文件都修改好了,然后上传到HDFS。
hadoop fs -put oozie-apps/ /user/root
上传的时候一定要上传到规定的文件目录下
HDFS的检查:
呢么我们就运行一下试试执行
root@master:/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/bash
data > /opt/module/my.log
把date换成data,并且把my.sh替换HDFS上的脚本
运行oozie任务命令:
可以看到被杀掉了,失败了。但是oozie是看不到详细日志的。需要到yarn上看:
可以看到是命令找不到,符合我们的预期。
关于oozie
可以看到oozie这个命令有很多选项,不只是一个run还有kill等其他选项。