【Oozie笔记】3. Oozie调度shell脚本

简介

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脚本

  1. 改动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
    
  2. 改动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>
    
  3. 创建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等其他选项。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值