Oozie的安装与使用
文章目录
-
1、Oozie的介绍
-
2、oozie的架构
-
3、oozie的安装
-
- 第一步:修改core-site.xml
- 第二步:上传oozie的安装包并解压
- 第三步:解压hadooplibs到与oozie平行的目录
- 第四步:创建libext目录
- 第五步:拷贝依赖包到libext
- 第六步:添加ext-2.2.zip压缩包
- 第七步:修改oozie-site.xml
- 第八步:创建mysql数据库
- 第九步:上传oozie依赖的jar包到hdfs上面去
- 第十步:创建oozie的数据库表
- 第十一步:打包项目,生成war包
- 第十二步:配置oozie的环境变量
- 第十三步:启动与关闭oozie服务
- 第十四步:浏览器页面访问oozie
-
4、oozie的使用
- 4.1、运行oozie调度Shell脚本
- 首先按照标准流程对oozie的调度案例进行解压缩,并将其展开为可执行的工作流文件。
- 创建一个新的工作目录用于存放所有与该作业相关的中间文件和日志。
- 将任务模板复制至当前的工作目录中。
- 选择一个空白的Shell脚本文件作为作业的主要执行入口。
- 编辑配置参数设置为指定值完成必要的初始设置。
- 将作业提交至HDFS存储位置并启动oozie的调度服务。
- 4.1、运行oozie调度Shell脚本
-
4.2、采用Oozie进行Hive集群调度
-
- 第一步是复制Hive的案例模板文件
- 第二步是对Hive配置文件进行编辑
- 第三步是将工作文件上传至HDFS服务器
- 第四步则是运行Oozie来进行任务调度
- 最后一步是检查调度的结果状态
-
4.3、通过oozie实现MR任务调度
-
- 第一步:获取MR运行所需资源
- 第二步:验证系统的稳定性
- 第三步:准备好调度所需的资源,并将相关的jar包复制到相应的存储位置
- 第四步:优化配置参数设置
- 第五步:部署调度作业至HDFS指定位置
- 第六步:通过启动调度作业来执行
-
-
4.4 Oozie的任务串行部署
-
第一阶段:初步准备工作阶段
- 第一步:创建Oozie集群环境
- 配置Oozie集群所需的硬件和网络环境条件。
- 确保HDFS和Yarn分布式文件系统已正确配置。
- 第二步:安装和配置Oozie组件
- 按照官方文档指导完成Oozie核心组件的安装。
- 配置Oozie与Hadoop生态系统之间的通信机制。
- 第三步:构建调度框架
- 设计并实现高效的作业调度逻辑框架。
- 确保调度算法能够支持复杂的作业依赖关系。
- 第四步:部署资源管理模块
- 将应用所需的资源管理功能模块集成到系统中。
- 配置资源分配策略以优化系统性能。
- 第五步:启动并运行相应的调度程序
- 执行所有配置和部署步骤后,
- 启动并运行相应的Oozie集群管理服务程序,
- 第一步:创建Oozie集群环境
- 运行监控工具以验证集群状态及功能是否正常运转。
- 4.5节详细阐述了Oozie系统的任务调度机制及其定时任务执行流程。
- 该系统详细说明了如何在Oozie中配置定时任务的相关参数。
- 通过Oozie管理平台可以实现对现有任务状态的有效监控,并指导用户如何终止异常运行的任务。
1、Oozie的介绍
Oozie是一种基于hadoop平台的工作流调度引擎。它能够用于调度和管理多种Hadoop任务类型,包括MapReduce和Pig等。

oozie组件介绍

2、oozie的架构

3、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>
注意:旧服务已上线,请通过浏览器访问19888端口以便查看相关信息。修改完成后,请必须重新启动hadoop的hdfs与yarn集群并确保其运行正常;同时需确保所有作业历史都能正确记录下来。
重启hdfs与yarn集群
cd /export/servers/hadoop-2.6.0-cdh5.14.0
sbin/stop-dfs.sh
sbin/start-dfs.sh
sbin/stop-yarn.sh
sbin/start-yarn.sh
第二步:上传oozie的安装包并解压
将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
cp -ra hadooplibs/hadooplib-2.6.0-cdh5.14.0.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压缩包
请将该文件包...复制到libext目录中。请将已准备好的软件...放置于libext目录中。
第七步:修改oozie-site.xml
cd /export/servers/oozie-4.1.0-cdh5.14.0/conf
vim oozie-site.xml
如果缺少这些属性的话,请直接将其添加到配置中即可;系统默认采用UTC时间,在我们的配置文件oozie-site.xml中应确保将时间设置为GMT+08:00格式
<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://node03.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目录去
bin/oozie-setup.sh sharelib create -fs hdfs://node01: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包
cd /export/servers/oozie-4.1.0-cdh5.14.0
bin/oozie-setup.sh prepare-war
第十二步:配置oozie的环境变量
vim /etc/profile
export OOZIE_HOME=/export/servers/oozie-4.1.0-cdh5.14.0
export OOZIE_URL=http://node03.hadoop.com:11000/oozie
export PATH=:$OOZIE_HOME/bin:$PATH
source /etc/profile

第十三步:启动与关闭oozie服务
启动命令
cd /export/servers/oozie-4.1.0-cdh5.14.0
bin/oozied.sh start
关闭命令
bin/oozied.sh stop

第十四步:浏览器页面访问oozie
http://node03:11000/oozie/
修复oozie页面的时间区问题:在我们的页面访问过程中发现oozie仍使用GMT时间,在当前系统的时区存在固定时间差。因此我们需要修改一个JavaScript脚本以获取当前系统的时间
修改js当中的时区问题
cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie-server/webapps/oozie
vim oozie-console.js
function getTimeZone() {
Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
return Ext.state.Manager.get("TimezoneId","GMT+0800");
}
重启oozie即可
cd /export/servers/oozie-4.1.0-cdh5.14.0
关闭oozie服务
bin/oozied.sh stop
启动oozie服务
bin/oozied.sh start
4、oozie的使用
| KEY | 含义 |
|---|---|
| nameNode | HDFS地址 |
| jobTracker | jobTracker(ResourceManager)地址 |
| queueName | Oozie队列(默认填写default) |
| examplesRoot | 全局目录(默认填写examples) |
| oozie.usr.system.libpath | 是否加载用户lib目录(true/false) |
| oozie.libpath | 用户lib库所在的位置 |
| oozie.wf.application.path | Oozie流程所在hdfs地址(workflow.xml所在的地址) |
| user.name | 当前用户 |
| oozie.coord.application.path | Coordinator.xml地址(没有可以不写) |
| oozie.bundle.application.path | Bundle.xml地址(没有可以不写) |
4.1、使用oozie调度shell脚本
安装完成后,则需对oozie的功能进行全面测试以确保其完善性。官方提供了多种标准测试用例我们可以依据这些标准用例来实现oozie的调度
第一步:解压官方提供的调度案例
Oozie集成提供了丰富且实用的示例库。我们可以通过访问官方发布的资源库下载并解压这些示例文件。
cd /export/servers/oozie-4.1.0-cdh5.14.0
tar -zxf oozie-examples.tar.gz

第二步:创建工作目录
根据需要建立一个Oozie的工作目录后,在之后的时间内将所有调度任务的配置文件放置于该工作目录中;特别地,在Oozie安装目录下创建工作 directory。
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
vim oozie_works/shell/hello.sh
注意: 这个脚本一定要是在我们oozie工作路径下的shell路径下的位置
#!/bin/bash
echo "hello world" >> /export/servers/hello_oozie.txt
第五步:修改模板下的配置文件
修改job.properties
cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/shell
vim job.properties
nameNode=hdfs://node01:8020
jobTracker=node01:8032
queueName=default
examplesRoot=oozie_works
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> -->
<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账户进行操作(即通过root账户执行命令),因此建议将文件上传至该特定目录路径。需要注意的是,在某些情况下(即当Hadoop启动时采用了非root账户),则应将文件配置为/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://node03:11000/oozie -config oozie_works/shell/job.properties -run
从监控界面可以看到任务执行成功了

查看Hadoop服务端口19888时会发现,Oozie被配置为执行相应的shell脚本.


4.2、使用oozie调度hive
第一步:拷贝hive的案例模板
cd /export/servers/oozie-4.1.0-cdh5.14.0
cp -ra examples/apps/hive2/ oozie_works/
第二步:编辑hive模板
在本操作中采用的工具是Hiveserver2,并需注意必须确保Hiveserver2服务已正确启动
hive --service hiveserver2 &
hive --service metastore &
修改job.properties
cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/hive2
vim job.properties
nameNode=hdfs://node01:8020
jobTracker=node01:8032
queueName=default
jdbcURL=jdbc:hive2://node03:10000/default
examplesRoot=oozie_works
oozie.use.system.libpath=true
# 配置我们文件上传到hdfs的保存路径 实际上就是在hdfs 的/user/root/oozie_works/hive2这个路径下
oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/hive2
修改workflow.xml
vim 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 default.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://node03:11000/oozie -config oozie_works/hive2/job.properties -run
第五步:查看调度结果


4.3、使用oozie调度MR任务
第一步:准备MR执行的数据
在此处通过Oozie实现了一个MR程序的工作流程,在这种情况下该MR程序既可以由个人自行编写也可采用Hadoop官方提供的标准MR程序本案例中我们选择了Hadoop官方提供的标准MR程序并将其用于wordcount示例以验证其工作性能与此同时我们需要将相关数据准备好并上传至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
第二步:执行官方测试案例
hadoop 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
第三步:准备调度的资源
请将所有需要调度的资源全部准备好并放置于一个专门的文件夹中,请确保包含jar包、job.properties以及workflow.xml。
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包应当存放在以下位置:$/export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/map-reduce/lib
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://node01: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
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<workflow-app xmlns="uri:oozie:workflow:0.5" name="map-reduce-wf">
<start to="mr-node"/>
<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="end"/>
<error to="fail"/>
</action>
<kill name="fail">
<message>Map/Reduce failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name="end"/>
</workflow-app>
第五步:上传调度任务到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
4.4、oozie的任务串联
在实际工作中,必然存在若干个任务,其前一环节的工作成果作为后一环节的数据基础的情况,因此,在workflow.xml配置文件中,我们需要设置相应的关联关系以建立相互关联关系。
需求:首先依次先运行一个Shell脚本;完成后紧接着运行一个MapReduce程序;最后再运行一个Hive程序
第一步:准备工作目录
cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works
mkdir -p sereval-actions
第二步:准备调度文件
整合我们过去的Hive、Shell以及MapReduce(MR)执行流程,并将其整合到一个工作流中,并准备必要的资源文件
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://node01:8020
jobTracker=node01:8032
queueName=default
examplesRoot=oozie_works
EXEC=hello.sh
outputDir=/oozie/output
inputdir=/oozie/input
jdbcURL=jdbc:hive2://node03: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://node03:11000/oozie -config oozie_works/serveral-actions/job.properties -run
4.5、oozie的任务调度,定时任务执行
在Oozie系统中,默认情况下主要通过Coordinator组件来完成任务的定时调度工作。与工作流功能相似地,在该模块中同样可以通过XML文件进行详细参数设置以达到预期效果。下面我们将深入探讨如何配置Coordinator组件以实现实时任务调度的功能。该组件的主要调度方式主要有两种不同的实现方案。
第一种:基于定时的任务调度机制,
Oozie在实现基于时间的任务调度时, 主要依赖三个关键参数: 起始执行的时间点, 结束执行的时间点, 以及定期重复执行的时间间隔.
第二种:依赖数据的任务排程,在存在输入时才开始执行任务**
该类调度系统主要依赖于数据输入,在接收完所有必要的信息后才开始启动任务流程。
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/
第三步:修改配置文件
修改job.properties
cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/cron-job
vim job.properties
nameNode=hdfs://node01:8020
jobTracker=node01:8032
queueName=default
examplesRoot=oozie_works
oozie.coord.application.path=${nameNode}/user/${user.name}/${examplesRoot}/cron-job/coordinator.xml
start=2018-08-22T19:20+0800
end=2019-08-22T19:20+0800
EXEC=hello.sh
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
oozie当中任务的查看以及杀死
查看所有普通任务
oozie jobs -oozie http://bd001:11000/oozie
查看定时任务
oozie jobs -oozie http://bd001:11000/oozie -jobtype coordinator

oozie job -oozie http://bd001:11000/oozie -info 0000033-200526143050941-oozie-root-W
杀死某个任务
oozie可以通过jobid来杀死某个定时任务
oozie job -kill [id]
例如我们可以使用命令
oozie job -oozie http://bd001:11000/oozie -kill 0000033-200526143050941-oozie-root-W
来杀死我们定时任务

常用命令
校验配置文件
oozie validate -oozie http://bd001:11000/oozie /export/servers/oozie/test/coordinator.xml
运行job
oozie job -oozie http://bd001:11000/oozie -config /export/servers/oozie/test/coordinator.properties -run
查看信息
oozie job -oozie http://bd001:11000/oozie -info 0000029-191027171933033-oozie-root-C
查看日志
oozie job -oozie http://bd001:11000/oozie -log 0000064-190923225831711-oozie-root-C
Kill任务
oozie job -oozie http://bd001:11000/oozie -kill 0000064-190923225831711-oozie-root-C
查看所有普通任务
oozie jobs
查看定时任务
oozie jobs -jobtype coordinator -oozie http://bd001:11000/oozie
对比分析Oozie与Azkaban的表现:从功能层面来看两者具有相似性。具体而言,Oozie底层通过 org.apache.hadoop 提供的封装接口来处理Hadoop Spark作业提交,而Azkaban则可以直接操作shell语句进行作业提交。就安全性而言,Ooozie展现出一定的优势。
工作流定义: Oozie基于XML格式进行工作流配置,而Azkaban则使用Properties文件进行参数管理与工作流定义.
部署过程: 在部署过程中,Oozie的配置较为复杂,并且依赖于Yarn集群获取必要的任务日志信息.
任务检测: 当Azkillian中的某个作业出现失败时,在进程依然有效的情况下,默认认为该作业完成并返回成功状态.然而这种处理方式存在缺陷(BUG),而Ooozie则能够准确地判断作业的成功与失败情况.
操作工作流: 在操作工作流方面,Azkarabian主要依赖Web界面进行交互.相比之下,Ooozie提供了更为灵活的支持,不仅包含Web界面,还支持Restful API以及Java API调用.
权限控制: 就权限管理而言,Ooozie目前并未引入复杂的机制,Azkabin则具备较为完善的控制体系,允许用户对 workflow 的读写和执行权限进行精细配置.
运行环境: 从运行环境来看,Ooozie的所有动作都在Hadoop集群上运行,而Azerabian的动作则由其专用服务器负责处理.
