17 oozie框架使用

976-沈同学

发表文章数:65

热门标签

首页 » 大数据 » 正文

17 oozie框架使用

1.oozie介绍

调度过程:

主要是通过启动一个mr的任务,来执行其他的任务
启动一个mr的任务,相当于是一个程序的入口
定义语言使用的hpdl,也就是xml语言

oozie的架构:

1、client  客户端,提交我们的任务到oozie的服务端
2、oozie-server  服务端,就是运行了一个tomcat的实例,主要是用于接收客户端提交的任务
3、db  数据库,服务端将客户端提交的任务都保存在db里面了,默认使用的db是h2

优势:oozie可以控制我们的任务,如果执行成功了下一步怎么办,如果执行失败了下一步再怎么办
oozie的主要三大组件

1、workFlow 就是定义我们的工作流  从哪一个开始执行,到哪一个最终结束,最后定义完成之后,形成一个有向无环图DAG
	workflow里面由一个个的action组成,一个aciton就是我们一个需要执行的任务
2、Coordinator  协作器 说白了就是一个任务调度的模块,可以设置我们定时执行,说白了就是一个定时器
3、bundle  捆绑器  可以将我们多个Coordinator 捆绑到一起叫做一个bundle

2.oozie安装

第一步:修改core-site.xml

修改core-site.xml添加我们hadoop集群的代理用户

cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop
vim  core-site.xml
<property>
         <name>hadoop.proxyuser.root.hosts</name>
         <value>*</value>
</property>
<property>
         <name>hadoop.proxyuser.root.groups</name>
         <value>*</value>
</property>

注意:hadoop的历史任务的服务必须启动,即19888端口可以查看,具体如何配置19888请查看hadoop课程的环境搭建
修改完成之后,记得重启hadoop的hdfs与yarn集群,还要记得启动jobhistory

第二步:上传oozie的安装包并解压

echo 1 >/proc/sys/vm/drop_caches 释放Linux内存空间
将我们的oozie的安装包上传到/export/softwares

cd /export/softwares/
tar -zxvf oozie-4.1.0-cdh5.14.0.tar.gz -C ../servers/

第三步:解压hadooplibs到与oozie平行的目录

cd /export/servers/oozie-4.1.0-cdh5.14.0
tar -zxvf oozie-hadooplibs-4.1.0-cdh5.14.0.tar.gz -C ../

第四步:创建libext目录

在oozie的安装路径下创建libext目录

cd /export/servers/oozie-4.1.0-cdh5.14.0
mkdir -p libext

第五步:拷贝依赖包到libext

拷贝一些依赖包到libext目录下面去
拷贝所有的依赖包

cd /export/servers/oozie-4.1.0-cdh5.14.0/hadooplibs/hadooplib-2.6.0-cdh5.14.0.oozie-4.1.0-cdh5.14.0
cp ./* /export/servers/oozie-4.1.0-cdh5.14.0/libext/

拷贝mysql的驱动包

cp /export/servers/hive-1.1.0-cdh5.14.0/lib/mysql-connector-java-5.1.38.jar /export/servers/oozie-4.1.0-cdh5.14.0/libext/

第六步:添加ext-2.2.zip压缩包

拷贝ext-2.2.zip这个包到libext目录当中去
将我们准备好的软件ext-2.2.zip拷贝到我们的libext目录当中去

第七步:修改oozie-site.xml

cd /export/servers/oozie-4.1.0-cdh5.14.0/conf
vim oozie-site.xml

如果没有这些属性,直接添加进去即可,oozie默认使用的是UTC的时区,我们需要在我们oozie-site.xml当中记得要配置我们的时区为GMT+0800时区

	<property>
        <name>oozie.service.JPAService.jdbc.driver</name>
        <value>com.mysql.jdbc.Driver</value>
    </property>

    <property>
        <name>oozie.service.JPAService.jdbc.url</name>
        <value>jdbc:mysql://node3.hadoop.com:3306/oozie</value>
    </property>

    <property>
        <name>oozie.service.JPAService.jdbc.username</name>
        <value>root</value>
    </property>

    <property>
        <name>oozie.service.JPAService.jdbc.password</name>
        <value>123456</value>
    </property>

    <property>
        <name>oozie.processing.timezone</name>
        <value>GMT+0800</value>
    </property>

    <property>
        <name>oozie.service.ProxyUserService.proxyuser.hue.hosts</name>
        <value>*</value>
    </property>
    <property>   
		<name>oozie.service.ProxyUserService.proxyuser.hue.groups</name>
        <value>*</value>
    </property>

	<property>
        <name>oozie.service.coord.check.maximum.frequency</name>
		<value>false</value>
    </property>     

    <property>
		<name>oozie.service.HadoopAccessorService.hadoop.configurations</name>
        <value>*=/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop</value>
    </property>

第八步:创建mysql数据库

mysql -uroot -p
create database oozie;

第九步:上传oozie依赖的jar包到hdfs上面去

上传oozie的解压后目录的yarn.tar.gz到hdfs目录去

cd /export/servers/oozie-4.1.0-cdh5.14.0
bin/oozie-setup.sh  sharelib create -fs hdfs://node1:8020 -locallib oozie-sharelib-4.1.0-cdh5.14.0-yarn.tar.gz

实际上就是将这些jar包解压到了hdfs上面的路径下面去了

第十步:创建oozie的数据库表

cd /export/servers/oozie-4.1.0-cdh5.14.0
bin/oozie-setup.sh  db create -run -sqlfile oozie.sql

第十一步:打包项目,生成war包

yum install -y unzip
cd /export/servers/oozie-4.1.0-cdh5.14.0
bin/oozie-setup.sh  prepare-war

第十二步:配置oozie的环境变量

vi /etc/profile
export OOZIE_HOME=/export/servers/oozie-4.1.0-cdh5.14.0
export OOZIE_URL=http://node3.hadoop.com:11000/oozie
export PATH=PATH:OOZIE_HOME/bin

source /etc/profile

第十三步:启动与关闭oozie服务

启动命令

cd /export/servers/oozie-4.1.0-cdh5.14.0
bin/oozied.sh start 

关闭命令

bin/oozied.sh stop

17 oozie框架使用
删除红色框内进程号文件可以解决起不来的问题

第十四步:浏览器页面访问oozie

http://node3:11000/oozie/

解决oozie的页面的时区问题:
我们页面访问的时候,发现我们的oozie使用的还是GMT的时区,与我们现在的时区相差一定的时间,所以我们需要调整一个js的获取时区的方法,将其改成我们现在的时区

修改js当中的时区问题

cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie-server/webapps/oozie
vi oozie-console.js

17 oozie框架使用
重启oozie服务就可以了

3.oozie的使用

3.1 使用oozie调度shell脚本

第一步:解压官方提供的调度案例

cd /export/servers/oozie-4.1.0-cdh5.14.0
tar -zxf oozie-examples.tar.gz

第二步:创建我们的工作目录

cd /export/servers/oozie-4.1.0-cdh5.14.0
mkdir oozie_works

第三步:拷贝我们的任务模板到我们的工作目录当中去

cd /export/servers/oozie-4.1.0-cdh5.14.0
cp -r examples/apps/shell/ oozie_works/

第四步:随意准备一个shell脚本

cd /export/servers/oozie-4.1.0-cdh5.14.0
vi oozie_works/shell/hello.sh

注意:这个脚本一定要是在我们oozie工作路径下的shell路径下的位置

#!/bin/bash
echo "hello world" >> /export/servers/hello_oozie.txt

oozie的配置文件

第一个配置文件job.properties:定义一些变量,例如我们的集群的hdfs的访问地址,mapreduce任务的提交地址
job.proerties这个文件,保存在本地磁盘

第二个配置文件workflow.xml:定义我们的工作流,里面有一个个的aciton,一个action就是一个我们要执行的任务,需要读取job.properties里面的配置
这个配置文件需要上传到hdfs

hello.sh :我们需要执行的脚本文件

第五步:修改模板下的配置文件
修改job.properties

cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/shell
vim job.properties

nameNode=hdfs://node1:8020
jobTracker=node1:8032
queueName=default
examplesRoot=oozie_works

#注意这个参数,定义了我们workflow.xml所在的hdfs上的路径
#                         hdfs://node1:8020/user/root/oozie_works/shell
oozie.wf.application.path={nameNode}/user/{user.name}/${examplesRoot}/shell
EXEC=hello.sh

修改workflow.xml

vim workflow.xml
<workflow-app xmlns="uri:oozie:workflow:0.4" name="shell-wf">
    <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>
            <exec>${EXEC}</exec>  <!--修改点-->
       <!--
            <argument>my_output=Hello Oozie</argument> <!--修改点-->
       -->
       <!--添加一行,定义我们要执行的文件放在了hdfs的哪个路径下面 -->
            <file>/user/root/oozie_works/shell/${EXEC}#${EXEC}</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>

第六步:上传我们的调度任务到hdfs上面去
注意:上传的hdfs目录为/user/root,因为我们hadoop启动的时候使用的是root用户,如果hadoop启动的是其他用户,那么就上传到
/user/其他用户

cd /export/servers/oozie-4.1.0-cdh5.14.0
hdfs dfs -put oozie_works/ (/user/root)  可省略

第七步:执行调度任务

通过oozie的命令来执行我们的调度任务
cd /export/servers/oozie-4.1.0-cdh5.14.0
bin/oozie job -oozie http://node3:11000/oozie -config oozie_works/shell/job.properties -run

oozie是一个真正的分布式的调度框架
如果写一个hive的脚本,没法确定这个hive的脚本究竟会在哪一台机器上面执行
如果只有第三台安装了hive,那么hive的脚本可能没法执行
三台都安装hive可以
shell脚本里面通过ssh 到我们第三台机器来执行

3.2 使用oozie调度我们的hive

第一步:拷贝hive的案例模板

cd /export/servers/oozie-4.1.0-cdh5.14.0
cp -r examples/apps/hive2/ oozie_works/

第二步:编辑hive模板
这里使用的是hiveserver2来进行提交任务,需要注意我们要将hiveserver2的服务给启动起来
修改job.properties

cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/hive2
vim job.properties
nameNode=hdfs://node1:8020
jobTracker=node1:8032
queueName=default
jdbcURL=jdbc:hive2://node3:10000/default
examplesRoot=oozie_works

oozie.use.system.libpath=true
# 定义我们workflow所在的hdfs的路径 hdfs://node1:8020/user/root/oozie_works/hive2
oozie.wf.application.path={nameNode}/user/{user.name}/${examplesRoot}/hive2

修改workflow.xml

<?xml version="1.0" encoding="UTF-8"?>
<workflow-app xmlns="uri:oozie:workflow:0.5" name="hive2-wf">
    <start to="hive2-node"/>

    <action name="hive2-node">
        <hive2 xmlns="uri:oozie:hive2-action:0.1">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <prepare>
                <delete path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data/hive2"/>
                <mkdir path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data"/>
            </prepare>
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>
            </configuration>
            <jdbc-url>${jdbcURL}</jdbc-url>
            <script>script.q</script>
            <param>INPUT=/user/${wf:user()}/${examplesRoot}/input-data/table</param>
            <param>OUTPUT=/user/${wf:user()}/${examplesRoot}/output-data/hive2</param>
        </hive2>
        <ok to="end"/>
        <error to="fail"/>
    </action>

    <kill name="fail">
        <message>Hive2 (Beeline) action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <end name="end"/>
</workflow-app>

编辑hivesql文件

vim script.q
DROP TABLE IF EXISTS test;
CREATE EXTERNAL TABLE test (a INT) STORED AS TEXTFILE LOCATION '${INPUT}';
insert into test values(10);
insert into test values(20);
insert into test values(30);

第三步:上传工作文件到hdfs

cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works
hdfs dfs -put hive2/ /user/root/oozie_works/

第四步:执行oozie的调度

cd /export/servers/oozie-4.1.0-cdh5.14.0
bin/oozie job -oozie http://node3:11000/oozie -config oozie_works/hive2/job.properties  -run

17 oozie框架使用
17 oozie框架使用

3.3 使用oozie调度MR任务

第一步:准备MR执行的数据

准备以下数据上传到HDFS的/oozie/input路径下去
hdfs dfs -mkdir -p /oozie/input
vim wordcount.txt
hello   world   hadoop
spark   hive    hadoop

将我们的数据上传到hdfs对应目录
hdfs dfs -put wordcount.txt /oozie/input

第二步:执行官方测试案例

yarn jar /export/servers/hadoop-2.6.0-cdh5.14.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.14.0.jar wordcount /oozie/input /oozie/output

第三步:准备我们调度的资源

拷贝MR的任务模板

cd /export/servers/oozie-4.1.0-cdh5.14.0
cp -ra examples/apps/map-reduce/ oozie_works/

删掉MR任务模板lib目录下自带的jar包

cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/map-reduce/lib
rm -rf oozie-examples-4.1.0-cdh5.14.0.jar

第四步:拷贝我们自己的jar包到对应目录
把我们需要调度的jar包也放到这个路径下

cp /export/servers/hadoop-2.6.0-cdh5.14.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.14.0.jar /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/map-reduce/lib/

第五步:修改配置文件
修改job.properties

cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/map-reduce
vim job.properties

nameNode=hdfs://node1:8020
jobTracker=node01:8032
queueName=default
examplesRoot=oozie_works

oozie.wf.application.path={nameNode}/user/{user.name}/${examplesRoot}/map-reduce/workflow.xml
outputDir=/oozie/output
inputdir=/oozie/input

修改workflow.xml

cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/map-reduce
vim workflow.xml
将以下老版本的mapred注释掉
<!--               
                <property>
                    <name>mapred.mapper.class</name>
                    <value>org.apache.oozie.example.SampleMapper</value>
                </property>
                <property>
                    <name>mapred.reducer.class</name>
                    <value>org.apache.oozie.example.SampleReducer</value>
                </property>
                <property>
                    <name>mapred.map.tasks</name>
                    <value>1</value>
                </property>
                <property>
                    <name>mapred.input.dir</name>
                    <value>/user/${wf:user()}/${examplesRoot}/input-data/text</value>
                </property>
                <property>
                    <name>mapred.output.dir</name>
                    <value>/user/${wf:user()}/${examplesRoot}/output-data/${outputDir}</value>
                </property>
-->
<!-- 开启使用新的API来进行配置 -->
                <property>
                    <name>mapred.mapper.new-api</name>
                    <value>true</value>
                </property>

                <property>
                    <name>mapred.reducer.new-api</name>
                    <value>true</value>
                </property>

                <!-- 指定MR的输出key的类型 -->
                <property>
                    <name>mapreduce.job.output.key.class</name>
                    <value>org.apache.hadoop.io.Text</value>
                </property>

                <!-- 指定MR的输出的value的类型-->
                <property>
                    <name>mapreduce.job.output.value.class</name>
                    <value>org.apache.hadoop.io.IntWritable</value>
                </property>

                <!-- 指定输入路径 -->
                <property>
                    <name>mapred.input.dir</name>
                    <value>${nameNode}/${inputdir}</value>
                </property>

                <!-- 指定输出路径 -->
                <property>
                    <name>mapred.output.dir</name>
                    <value>${nameNode}/${outputDir}</value>
                </property>

                <!-- 指定执行的map类 -->
                <property>
                    <name>mapreduce.job.map.class</name>
                    <value>org.apache.hadoop.examples.WordCount$TokenizerMapper</value>
                </property>

                <!-- 指定执行的reduce类 -->
                <property>
                    <name>mapreduce.job.reduce.class</name>
                    <value>org.apache.hadoop.examples.WordCount$IntSumReducer</value>
                </property>
				<!--  配置map task的个数 -->
                <property>
                    <name>mapred.map.tasks</name>
                    <value>1</value>
                </property>
如果存在输出目录将其删除
            <prepare>
                <delete path="${nameNode}/${outputDir}"/>
            </prepare>

第五步:上传调度任务到hdfs对应目录

cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works
hdfs dfs -put map-reduce/ /user/root/oozie_works/

第六步:执行调度任务
执行我们的调度任务,然后通过oozie的11000端口进行查看任务结果

cd /export/servers/oozie-4.1.0-cdh5.14.0
bin/oozie job -oozie http://node03:11000/oozie -config oozie_works/map-reduce/job.properties -run

3.4 oozie的任务串联

第一步:准备我们的工作目录

cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works
mkdir -p sereval-actions

第二步:准备我们的调度文件

将我们之前的hive,shell,以及MR的执行,进行串联成到一个workflow当中去,准备我们的资源文件
cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works
cp hive2/script.q sereval-actions/
cp shell/hello.sh sereval-actions/
cp -ra map-reduce/lib sereval-actions/

第三步:开发调度的配置文件

cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/sereval-actions
创建配置文件workflow.xml并编辑
vim workflow.xml
<workflow-app xmlns="uri:oozie:workflow:0.4" name="shell-wf">
<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>
        <exec>${EXEC}</exec>
        <!-- <argument>my_output=Hello Oozie</argument> -->
        <file>/user/root/oozie_works/sereval-actions/${EXEC}#${EXEC}</file>

        <capture-output/>
    </shell>
    <ok to="mr-node"/>
    <error to="mr-node"/>
</action>




<action name="mr-node">
        <map-reduce>
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <prepare>
                <delete path="${nameNode}/${outputDir}"/>
            </prepare>
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>
				<!--  
                <property>
                    <name>mapred.mapper.class</name>
                    <value>org.apache.oozie.example.SampleMapper</value>
                </property>
                <property>
                    <name>mapred.reducer.class</name>
                    <value>org.apache.oozie.example.SampleReducer</value>
                </property>
                <property>
                    <name>mapred.map.tasks</name>
                    <value>1</value>
                </property>
                <property>
                    <name>mapred.input.dir</name>
                    <value>/user/${wf:user()}/${examplesRoot}/input-data/text</value>
                </property>
                <property>
                    <name>mapred.output.dir</name>
                    <value>/user/${wf:user()}/${examplesRoot}/output-data/${outputDir}</value>
                </property>
				-->
				
				   <!-- 开启使用新的API来进行配置 -->
                <property>
                    <name>mapred.mapper.new-api</name>
                    <value>true</value>
                </property>

                <property>
                    <name>mapred.reducer.new-api</name>
                    <value>true</value>
                </property>

                <!-- 指定MR的输出key的类型 -->
                <property>
                    <name>mapreduce.job.output.key.class</name>
                    <value>org.apache.hadoop.io.Text</value>
                </property>

                <!-- 指定MR的输出的value的类型-->
                <property>
                    <name>mapreduce.job.output.value.class</name>
                    <value>org.apache.hadoop.io.IntWritable</value>
                </property>

                <!-- 指定输入路径 -->
                <property>
                    <name>mapred.input.dir</name>
                    <value>${nameNode}/${inputdir}</value>
                </property>

                <!-- 指定输出路径 -->
                <property>
                    <name>mapred.output.dir</name>
                    <value>${nameNode}/${outputDir}</value>
                </property>

                <!-- 指定执行的map类 -->
                <property>
                    <name>mapreduce.job.map.class</name>
                    <value>org.apache.hadoop.examples.WordCount$TokenizerMapper</value>
                </property>

                <!-- 指定执行的reduce类 -->
                <property>
                    <name>mapreduce.job.reduce.class</name>
                    <value>org.apache.hadoop.examples.WordCount$IntSumReducer</value>
                </property>
				<!--  配置map task的个数 -->
                <property>
                    <name>mapred.map.tasks</name>
                    <value>1</value>
                </property>

            </configuration>
        </map-reduce>
        <ok to="hive2-node"/>
        <error to="fail"/>
    </action>






 <action name="hive2-node">
        <hive2 xmlns="uri:oozie:hive2-action:0.1">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <prepare>
                <delete path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data/hive2"/>
                <mkdir path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data"/>
            </prepare>
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>
            </configuration>
            <jdbc-url>${jdbcURL}</jdbc-url>
            <script>script.q</script>
            <param>INPUT=/user/${wf:user()}/${examplesRoot}/input-data/table</param>
            <param>OUTPUT=/user/${wf:user()}/${examplesRoot}/output-data/hive2</param>
        </hive2>
        <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>

开发我们的job.properties配置文件

cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/sereval-actions
vim  job.properties

nameNode=hdfs://node1:8020
jobTracker=node1:8032
queueName=default
examplesRoot=oozie_works
EXEC=hello.sh
outputDir=/oozie/output
inputdir=/oozie/input
jdbcURL=jdbc:hive2://node3:10000/default
oozie.use.system.libpath=true
# 配置我们文件上传到hdfs的保存路径 实际上就是在hdfs 的/user/root/oozie_works/sereval-actions这个路径下
oozie.wf.application.path={nameNode}/user/{user.name}/${examplesRoot}/sereval-actions/workflow.xml

第四步:上传我们的资源文件夹到hdfs对应路径

cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/
hdfs dfs -put sereval-actions/ /user/root/oozie_works/

第五步:执行调度任务

cd /export/servers/oozie-4.1.0-cdh5.14.0/
bin/oozie job -oozie http://node3:11000/oozie -config oozie_works/serveral-actions/job.properties -run

17 oozie框架使用

3.5 oozie的任务调度,定时任务执行

oozie当中的定时任务
Coordinator :oozie当中的协作器,主要适用于我们的定时任务的执行,通过配置Coordinator可以实现我们的任务的定时的执行
定时的任务调度: 两种调度方式

第一种:基于数据的调度,有了数据就开始运行
第二种:基于时间的调度,定时的执行(常用)

oozie当中定时任务的设置
第一步:拷贝定时任务的调度模板

cd /export/servers/oozie-4.1.0-cdh5.14.0
cp -r examples/apps/cron oozie_works/cron-job

第二步:拷贝我们的hello.sh脚本

cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works
cp shell/hello.sh  cron-job/

第三步:修改配置文件
主要涉及到三个配置文件
第一个:workflow.xml 工作流的定义
第二个:coordinator.xml 定义我们的定时任务,定时执行我们的workflow.xml
第三个配置文件:job.properties 定义我们的一些变量

修改job.properties

cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/cron-job
vim job.properties
nameNode=hdfs://node1:8020
jobTracker=node1:8032
queueName=default
examplesRoot=oozie_works
# 这里定义的是coordinator.xml 所在的hdfs路径
oozie.coord.application.path=${nameNode}/user/${user.name}/${examplesRoot}/cron-job/coordinator.xml
start=2020-06-19T19:20+0800
end=2020-07-19T19:20+0800
EXEC=hello.sh
# 这里定义的是workflow.xml所在的hdfs路径
workflowAppUri=${nameNode}/user/${user.name}/${examplesRoot}/cron-job/workflow.xml

修改coordinator.xml

vim coordinator.xml
<!--
	oozie的frequency 可以支持很多表达式,其中可以通过定时每分,或者每小时,或者每天,或者每月进行执行,也支持可以通过与linux的crontab表达式类似的写法来进行定时任务的执行
	例如frequency 也可以写成以下方式
	frequency="10 9 * * *"  每天上午的09:10:00开始执行任务
	frequency="0 1 * * *"  每天凌晨的01:00开始执行任务
 -->
<coordinator-app name="cron-job" frequency="${coord:minutes(1)}" start="${start}" end="${end}" timezone="GMT+0800"
                 xmlns="uri:oozie:coordinator:0.4">
        <action>
        <workflow>
            <app-path>${workflowAppUri}</app-path>
            <configuration>
                <property>
                    <name>jobTracker</name>
                    <value>${jobTracker}</value>
                </property>
                <property>
                    <name>nameNode</name>
                    <value>${nameNode}</value>
                </property>
                <property>
                    <name>queueName</name>
                    <value>${queueName}</value>
                </property>
            </configuration>
        </workflow>
    </action>
</coordinator-app>

修改workflow.xml

vim workflow.xml
<workflow-app xmlns="uri:oozie:workflow:0.5" name="one-op-wf">
    <start to="action1"/>
    <action name="action1">
    <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>
        <exec>${EXEC}</exec>
        <!-- <argument>my_output=Hello Oozie</argument> -->
        <file>/user/root/oozie_works/cron-job/${EXEC}#${EXEC}</file>

        <capture-output/>
    </shell>
    <ok to="end"/>
    <error to="end"/>
    </action>
    <end name="end"/>
</workflow-app>

第四步:上传到hdfs对应路径

cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works
hdfs dfs -put cron-job/ /user/root/oozie_works/

第五步:运行定时任务

cd /export/servers/oozie-4.1.0-cdh5.14.0
bin/oozie job -oozie http://node03:11000/oozie -config oozie_works/cron-job/job.properties -run

17 oozie框架使用
oozie当中任务的查看以及杀死
查看所有普通任务

oozie  jobs

查看定时任务

oozie jobs -jobtype coordinator

杀死某个任务

oozie可以通过jobid来杀死某个定时任务
oozie job -kill [id]
例如我们可以使用命令
oozie job -kill 0000004-200618160012297-oozie-root-C
来杀死我们定时任务

4.hue与oozie整合

第一步:停止oozie与hue的进程

通过命令停止oozie与hue的进程,准备修改oozie与hue的配置文件

bin/oozied.sh stop

第二步:修改oozie的配置文件(老版本的bug,新版本已经不需要了)这一步我们都不需要做了

修改oozie的配置文件oozie-site.xml

   <property>    
        <name>oozie.service.WorkflowAppService.system.libpath</name>
        <value>/user/oozie/share/lib</value>
    </property>
	 <property>
        <name>oozie.use.system.libpath</name>
        <value>true</value>
    </property>

第三步:修改hue的配置文件

修改hue的配置文件hue.ini

[liboozie]
  # The URL where the Oozie service runs on. This is required in order for
  # users to submit jobs. Empty value disables the config check.
  oozie_url=http://node3.hadoop.com:11000/oozie

  # Requires FQDN in oozie_url if enabled
  ## security_enabled=false

  # Location on HDFS where the workflows/coordinator are deployed when submitted.
  remote_deployement_dir=/user/root/oozie_works

修改oozie的配置文件大概在1151行左右的样子

[oozie]
  # Location on local FS where the examples are stored.
  # local_data_dir=/export/servers/oozie-4.1.0-cdh5.14.0/examples/apps

  # Location on local FS where the data for the examples is stored.
  # sample_data_dir=/export/servers/oozie-4.1.0-cdh5.14.0/examples/input-data

  # Location on HDFS where the oozie examples and workflows are stored.
  # Parameters are TIME andUSER, e.g. /user/USER/hue/workspaces/workflow-TIME
  # remote_data_dir=/user/root/oozie_works/examples/apps

  # Maximum of Oozie workflows or coodinators to retrieve in one API call.
  oozie_jobs_count=100

  # Use Cron format for defining the frequency of a Coordinator instead of the old frequency number/unit.
  enable_cron_scheduling=true

  # Flag to enable the saved Editor queries to be dragged and dropped into a workflow.
  enable_document_action=true

  # Flag to enable Oozie backend filtering instead of doing it at the page level in Javascript. Requires Oozie 4.3+.
  enable_oozie_backend_filtering=true

  # Flag to enable the Impala action.
  enable_impala_action=true
  
[filebrowser]
  # Location on local filesystem where the uploaded archives are temporary stored.
  archive_upload_tempdir=/tmp

  # Show Download Button for HDFS file browser.
  show_download_button=true

  # Show Upload Button for HDFS file browser.
  show_upload_button=true

  # Flag to enable the extraction of a uploaded archive in HDFS.
  enable_extract_uploaded_archive=true

第四步:启动hue与oozie的进程

启动hue进程
cd /export/servers/hue-3.9.0-cdh5.14.0
build/env/bin/supervisor
启动oozie进程
cd /export/servers/oozie-4.1.0-cdh5.14.0
bin/oozied.sh start

17 oozie框架使用
17 oozie框架使用

5.oozie使用过程当中可能遇到的问题

1)Mysql权限配置

授权所有主机可以使用root用户操作所有数据库和数据表
mysql> grant all on *.* to root@'%' identified by '123456' with grant option;
mysql> flush privileges;
mysql> exit;

2)workflow.xml配置的时候不要忽略file属性
3) jps查看进程时,注意有没有bootstrap
4) 关闭oozie

如果bin/oozied.sh stop无法关闭,则可以使用kill -9 [pid],
之后oozie根目录下的oozie-server/temp/xxx.pid文件一定要删除。

5)Oozie重新打包时,一定要注意先关闭进程,删除对应文件夹下面的pid文件。(可以参考第4条目)
6)配置文件一定要生效
起始标签和结束标签无对应则不生效,配置文件的属性写错了,那么则执行默认的属性。
7)libext下边的jar存放于某个文件夹中,导致share/lib创建不成功。
9)修改Hadoop配置文件,需要重启集群。一定要记得scp到其他节点。
10)JobHistoryServer必须开启,集群要重启的。
11)Mysql配置如果没有生效的话,默认使用derby数据库。
12)在本地修改完成的job配置,必须重新上传到HDFS。
13)将HDFS中上传的oozie配置文件下载下来查看是否有错误。
14)Linux用户名和Hadoop的用户名不一致。
15)sharelib找不到,包括重新初始化oozie

如果部署oozie出错,修复执行,初始化oozie:
1、停止oozie(要通过jps检查bootstrap进程是否已经不存在)
2、删除oozie-server/temp/*
3、删除HDFS上的sharelib文件夹
4、删除oozie.sql文件,删除Mysql中删除oozie库,重新创建
5、重新按照顺序执行文档中oozie的安装重新再来一遍
标签:

拜师教育学员文章:作者:976-沈同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《17 oozie框架使用》 发布于2020-06-19

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录