大数据辅助系统工具Oozie


1 Apache Oozie简介

  • Apache oozie

    • 是一个工作流调度软件 本身属于cloudera 后来贡献给了apache
    • oozie目的根据一个定义DAG(有向无环图)执行工作流程
    • oozie本身的配置是一种xml格式的配置文件 oozie跟hue配合使用将会很方便
    • oozie特点:顺序执行 周期重复定时 可视化 追踪结果
  • Apache Oozie

    • Oozie client:主要是提供一种方式给用户进行工作流的提交启动(cli javaapi rest)

    • Oozie server(本身是一个java web应用)

    • Hadoop生态圈

      • oozie各种类型任务提交底层依赖于mr程序 首先启动一个没有reducetak的mr 通过这个mr

        把各个不同类型的任务提交到具体的集群上执行


  • oozie 流程节点

    • oozie 核心配置是在一个workflow.xml文件 文件中顶一个工作流的执行流程规则

    • 类型

      • control node 控制工作流的执行路径:start end fork join kill
      • action node 具体的任务类型:mr spark shell java hive

      上述两种类型结合起来 就可以描绘出一个工作流的DAG图。

  • oozie工作流类型

    • workflow 基本类型的工作流 只会按照定义顺序执行 无定时触发
    • coordinator 定时触发任务 当满足执行时间 或者输入数据可用 触发workflow执行
    • bundle 批处理任务 一次提交多个coordinator

  • Apache oozie 安装

    • 版本问题:Apache官方提供的是源码包 需要自己结合hadoop生态圈软件环境进行编译 兼容性问题特别难以处理 因此可以使用第三方商业公司编译好 Cloudera(CDH)

    • 修改hadoop的相关配置 启动服务

      • httpfs
      • jobhistory

      配置修改之后需要重启hadoop集群

    • 解压oozie安装包 拷贝相关依赖的软件

    • 修改oozie-site.xml 主要是mysql相关信息 hadoop配置文件

    • 初始化mysql 创建库表

    • 生成执行需要的war包


  • oozie 实战

    • 解压出官方自带的案例 里面封装了各种类型任务的配置模板
    • 优化更新hadoop环境资源配置
      • yarn资源相关的 申请资源的上下限 yarn调度策略(fair 多线程执行模式)
      • mapreduce申请资源相关的 maptask reducetask申请内存的大小
      • scp给其他机器 重启集群 (hadoop ) oozie
  • oozie 调度流程

    • 根据官方自带的示例编写配置文件

      job.properties workflow.xml

    • 把任务配置信息连同依赖的资源一起上传到hdfs指定的路径 这个路径在配置中有

    • 利用oozie的命令进行提交

  • oozie调度hive脚本

    • 首先必须保证hiveserve2服务是启动正常的,如果配置metastore服务,要首先启动metastore

      nohup /export/servers/hive/bin/hive --service metastore &
      nohup /export/servers/hive/bin/hive --service hiveserver2 &
      
  • oozie调度mapreduce程序

    • 需要在workflow.xml中开启使用新版的 api hadoop2.x
  • oozie调度串联任务

    通过action节点 成功失败控制执行的流程

    如果上一个action成功 跳转到下一个action 这样就可以变成首尾相连的串联任务

  • oozie基于时间的定时

    主要是需要coordinator来配合workflow进行周期性的触发执行

    需要注意时间的格式问题 时区的问题

2 Apache Oozie使用

1. Oozie 概述
Oozie 是一个用来管理 Hadoop 生态圈 job 的工作流调度系统。由 Cloudera
公司贡献给 Apache。Oozie 是运行于 Java servlet 容器上的一个 java web 应
用。Oozie 的目的是按照 DAG(有向无环图)调度一系列的 Map/Reduce 或者 Hive
等任务。Oozie 工作流由 hPDL(Hadoop Process Definition Language)定义
(这是一种 XML 流程定义语言)。适用场景包括:
需要按顺序进行一系列任务;
需要并行处理的任务;
需要定时、周期触发的任务;
可视化作业流运行过程;
运行结果或异常的通报。

2. Oozie 的架构
Oozie Client:提供命令行、java api、rest 等方式,对 Oozie 的工作流
流程的提交、启动、运行等操作;
Oozie WebApp:即 Oozie Server,本质是一个 java 应用。可以使用内置的
web 容器,也可以使用外置的 web 容器;
Hadoop Cluster:底层执行 Oozie 编排流程的各个 hadoop 生态圈组件;

3. Oozie 基本原理
Oozie 对工作流的编排,是基于 workflow.xml 文件来完成的。用户预先将工
作流执行规则定制于 workflow.xml 文件中,并在 job.properties 配置相关的参数,
然后由 Oozie Server 向 MR 提交 job 来启动工作流。
3.1. 流程节点
工作流由两种类型的节点组成,分别是:
Control Flow Nodes:控制工作流执行路径,包括 start,end,kill,decision,
fork,join。
Action Nodes:决定每个操作执行的任务类型,包括 MapReduce、java、hive、
shell 等。

4. Oozie 工作流类型
4.1. WorkFlow
规则相对简单,不涉及定时、批处理的工作流。顺序执行流程节点。
Workflow 有个大缺点:没有定时和条件触发功能。
4.2. Coordinator
Coordinator 将多个工作流 Job 组织起来,称为 Coordinator Job,并指定触发
时间和频率,还可以配置数据集、并发数等,类似于在工作流外部增加了一个协
调器来管理这些工作流的工作流 Job 的运行。

4.3. Bundle
针对 coordinator 的批处理工作流。Bundle 将多个 Coordinator 管理起来,这
样我们只需要一个 Bundle 提交即可。

3 Apache Oozie 安装

1. 修改 hadoop 相关配置
1.1. 配置 httpfs 服务
修改 hadoop 的配置文件 core-site.xml

hadoop.proxyuser.root.hosts



hadoop.proxyuser.root.groups


hadoop.proxyuser.root.hosts 允许通过 httpfs 方式访问 hdfs 的主机名、域
名;
hadoop.proxyuser.root.groups 允许访问的客户端的用户组

1.2. 配置 jobhistory 服务
修改 hadoop 的配置文件 mapred-site.xml

mapreduce.jobhistory.address
node-1:10020
MapReduce JobHistory Server IPC host:port


mapreduce.jobhistory.webapp.address
node-1:19888
MapReduce JobHistory Server Web UI host:port

mapreduce.jobhistory.done-dir /export/data/history/done mapreduce.jobhistory.intermediate-done-dir /export/data/history/done_intermediate 启动 history-server mr-jobhistory-daemon.sh start historyserver 停止 history-server mr-jobhistory-daemon.sh stop historyserver 通过浏览器访问 Hadoop Jobhistory 的 WEBUI http://node-1:19888 1.3. 重启 Hadoop 集群相关服务

2. 上传 oozie 的安装包并解压
oozie 的安装包上传到/export/softwares
tar -zxvf oozie-4.1.0-cdh5.14.0.tar.gz
解压 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 …/
3. 添加相关依赖
oozie 的安装路径下创建 libext 目录
cd /export/servers/oozie-4.1.0-cdh5.14.0
mkdir -p libext
拷贝 hadoop 依赖包到 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 的驱动包到 libext
mysql-connector-java-5.1.32.jar
添加 ext-2.2.zip 压缩包到 libext
ext-2.2.zip

4. 修改 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 时区

oozie.service.JPAService.jdbc.driver
com.mysql.jdbc.Driver


oozie.service.JPAService.jdbc.url
jdbc:mysql://node-1:3306/oozie


oozie.service.JPAService.jdbc.username
root


oozie.service.JPAService.jdbc.password
hadoop


oozie.processing.timezone
GMT+0800


oozie.service.coord.check.maximum.frequency
false


oozie.service.HadoopAccessorService.hadoop.configurations
*=/export/servers/hadoop-2.7.5/etc/hadoop

5. 初始化 mysql 相关信息
上传 oozie 的解压后目录的下的 yarn.tar.gz 到 hdfs 目录
bin/oozie-setup.sh sharelib create -fs hdfs://node-1:9000 -
locallib oozie-sharelib-4.1.0-cdh5.14.0-yarn.tar.gz
本质上就是将这些 jar 包解压到了 hdfs 上面的路径下面去
创建 mysql 数据库
mysql -uroot -p
create database oozie;
初始化创建 oozie 的数据库表
cd /export/servers/oozie-4.1.0-cdh5.14.0
bin/oozie-setup.sh db create -run -sqlfile oozie.sql

6. 打包项目,生成 war 包
cd /export/servers/oozie-4.1.0-cdh5.14.0
bin/oozie-setup.sh prepare-war
7. 配置 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= P A T H : PATH: PATH:OOZIE_HOME/bin
source /etc/profile

8. 启动关闭 oozie 服务
启动命令
cd /export/servers/oozie-4.1.0-cdh5.14.0
bin/oozied.sh start
关闭命令
bin/oozied.sh stop
启动的时候产生的 pid 文件,如果是 kill 方式关闭进程 则需要删除该文件
重新启动,否则再次启动会报错。
9. 浏览器 web UI 页面
http://node-1:11000/oozie/

10. 解决 oozie 页面时区显示异常
页面访问的时候,发现 oozie 使用的还是 GMT 的时区,与我们现在的时区
相差一定的时间,所以需要调整一个 js 的获取时区的方法,将其改成我们现在的
时区。
修改 js 当中的时区问题
cd 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
bin/oozied.sh stop
bin/oozied.sh start

4 Apache Oozie 实战

oozie 安装好了之后,需要测试 oozie 的功能是否完整好使,官方已经给自带
带了各种测试案例,可以通过官方提供的各种案例来学习 oozie 的使用,后续也
可以把这些案例作为模板在企业实际中使用。
先把官方提供的各种案例给解压出来
cd /export/servers/oozie-4.1.0-cdh5.14.0
tar -zxvf oozie-examples.tar.gz
创建统一的工作目录,便于集中管理 oozie。企业中可任意指定路径。这里
直接在 oozie 的安装目录下面创建工作目录
cd /export/servers/oozie-4.1.0-cdh5.14.0
mkdir oozie_works

1. 优化更新 hadoop 相关配置
1.1. yarn 容器资源分配属性
yarn-site.xml:
<!—节点最大可用内存,结合实际物理内存调整 -->

yarn.nodemanager.resource.memory-mb
3072

<!—每个容器可以申请内存资源的最小值,最大值 -->

yarn.scheduler.minimum-allocation-mb
1024


yarn.scheduler.maximum-allocation-mb
3072

<!—修改为 Fair 公平调度,动态调整资源,避免 yarn 上任务等待(多线程执行) -->

yarn.resourcemanager.scheduler.class
org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler

<!—Fair 调度时候是否开启抢占功能 -->

yarn.scheduler.fair.preemption
true

<!—超过多少开始抢占,默认 0.8–>

yarn.scheduler.fair.preemption.cluster-utilization-threshold
1.0

1.2. mapreduce 资源申请配置
设置 mapreduce.map.memory.mb 和 mapreduce.reduce.memory.mb 配置
否则 Oozie 读取的默认配置 -1, 提交给 yarn 的时候会抛异常 Invalid resource
request, requested memory < 0, or requested memory > max configured,
requestedMemory=-1, maxMemory=8192
mapred-site.xml
<!—单个 maptask、reducetask 可申请内存大小 -->

mapreduce.map.memory.mb
1024


mapreduce.reduce.memory.mb
1024

1.3. 更新 hadoop 配置重启集群
重启 hadoop 集群
重启 oozie 服务
2. Oozie 调度 shell 脚本
2.1. 准备配置模板
把 shell 的任务模板拷贝到 oozie 的工作目录当中去
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
2.2. 修改配置模板
修改 job.properties
cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/shell
vim job.properties
nameNode=hdfs://node-1:8020
jobTracker=node-1:8032
queueName=default
examplesRoot=oozie_works
oozie.wf.application.path= n a m e N o d e / u s e r / {nameNode}/user/ nameNode/user/{user.name}/${examplesRoot}/shell
EXEC=hello.sh
jobTracker:在 hadoop2 当中,jobTracker 这种角色已经没有了,只有
resourceManager,这里给定 resourceManager 的 IP 及端口即可。
queueName:提交 mr 任务的队列名;
examplesRoot:指定 oozie 的工作目录;
oozie.wf.application.path:指定 oozie 调度资源存储于 hdfs 的工作路径;
EXEC:指定执行任务的名称。

修改 workflow.xml




j o b T r a c k e r < / j o b − t r a c k e r > < n a m e − n o d e > {jobTracker}</job-tracker> <name-node> jobTracker</jobtracker><namenode>{nameNode}


mapred.job.queue.name
q u e u e N a m e < / v a l u e > < / p r o p e r t y > < / c o n f i g u r a t i o n > < e x e c > {queueName}</value> </property> </configuration> <exec> queueName</value></property></configuration><exec>{EXEC}
/user/root/oozie_works/shell/KaTeX parse error: Expected 'EOF', got '#' at position 7: {EXEC}#̲{EXEC}








w f : a c t i o n D a t a ( ′ s h e l l − n o d e ′ ) [ ′ m y o u t p u t ′ ] e q ′ H e l l o O o z i e ′ < / c a s e > < d e f a u l t t o = " f a i l − o u t p u t " / > < / s w i t c h > < / d e c i s i o n > < k i l l n a m e = " f a i l " > < m e s s a g e > S h e l l a c t i o n f a i l e d , e r r o r m e s s a g e [ {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:actionData(shellnode)[myoutput]eqHelloOozie</case><defaultto="failoutput"/></switch></decision><killname="fail"><message>Shellactionfailed,errormessage[{wf:errorMessage(wf:lastErrorNode())}]


Incorrect output, expected [Hello Oozie] but was [${wf:actionData(‘shellnode’)[‘my_output’]}]


2.3. 上传调度任务到 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
2.4. 执行调度任务
通过 oozie 的命令来执行调度任务
cd /export/servers/oozie-4.1.0-cdh5.14.0
bin/oozie job -oozie http://node-1:11000/oozie -config
oozie_works/shell/job.properties -run
从监控界面可以看到任务执行成功了。
可以通过 jobhistory 来确定调度时候是由那台机器执行的。

3. Oozie 调度 Hive
3.1. 准备配置模板
cd /export/servers/oozie-4.1.0-cdh5.14.0
cp -ra examples/apps/hive2/ oozie_works/
3.2. 修改配置模板
修改 job.properties

cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/hive2
vim job.properties
nameNode=hdfs://node-1:8020
jobTracker=node-1:8032
queueName=default
jdbcURL=jdbc:hive2://node-1:10000/default
examplesRoot=oozie_works
oozie.use.system.libpath=true
# 配 置 我 们 文 件 上 传 到 hdfs 的 保 存 路 径 实 际 上 就 是 在 hdfs 的
/user/root/oozie_works/hive2 

这个路径下
oozie.wf.application.path= n a m e N o d e / u s e r / {nameNode}/user/ nameNode/user/{user.name}/${examplesRoot}/hive2
修改 workflow.xml(实际上无修改)

<?xml version="1.0" encoding="UTF-8"?> ${jobTracker} ${nameNode} mapred.job.queue.name ${queueName} ${jdbcURL} INPUT=/user/${wf:user()}/${examplesRoot}/inputdata/table OUTPUT=/user/${wf:user()}/${examplesRoot}/outputdata/hive2 Hive2 (Beeline) action failed, error message[${wf:errorMessage(wf:lastErrorNode())}] 编辑 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); 3.3. 上传调度任务到 hdfs cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works hdfs dfs -put hive2/ /user/root/oozie_works/

3.4. 执行调度任务
首先确保已经启动 hiveServer2 服务。
cd /export/servers/oozie-4.1.0-cdh5.14.0
bin/oozie job -oozie http://node-1:11000/oozie -config
oozie_works/hive2/job.properties -run
可以在 yarn 上看到调度执行的过程:

4. Oozie 调度 MapReduce
4.1. 准备配置模板
准备 mr 程序的待处理数据。用 hadoop 自带的 MR 程序来运行 wordcount。
准备数据上传到 HDFS 的/oozie/input 路径下去
hdfs dfs -mkdir -p /oozie/input
hdfs dfs -put wordcount.txt /oozie/input
拷贝 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/mapreduce/lib
rm -rf oozie-examples-4.1.0-cdh5.14.0.jar
拷贝官方自带 mr 程序 jar 包到对应目录
cp
/export/servers/hadoop-2.7.5/share/hadoop/mapreduce/hadoopmapreduce-examples-2.7.5.jar
/export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/mapreduce/lib/

4.2. 修改配置模板
修改 job.properties
cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/mapreduce
vim job.properties
nameNode=hdfs://node-1:8020
jobTracker=node-1:8032
queueName=default
examplesRoot=oozie_works
oozie.wf.application.path= n a m e N o d e / u s e r / {nameNode}/user/ nameNode/user/{user.name}/${examplesRoot}/mapreduce/workflow.xml
outputDir=/oozie/output
inputdir=/oozie/input
修改 workflow.xml
cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/mapreduce
vim workflow.xml

<?xml version="1.0" encoding="UTF-8"?> ${jobTracker} ${nameNode} mapred.job.queue.name ${queueName} mapred.mapper.new-api true mapred.reducer.new-api true

mapreduce.job.output.key.class
org.apache.hadoop.io.Text

mapreduce.job.output.value.class org.apache.hadoop.io.IntWritable mapred.input.dir ${nameNode}/${inputdir} mapred.output.dir ${nameNode}/${outputDir} mapreduce.job.map.class

org.apache.hadoop.examples.WordCount$TokenizerMapper

mapreduce.job.reduce.class

org.apache.hadoop.examples.WordCount$IntSumReducer

mapred.map.tasks

1







Map/Reduce failed, error
message[ w f : e r r o r M e s s a g e ( w f : l a s t E r r o r N o d e ( ) ) ] < / m e s s a g e > < / k i l l > < e n d n a m e = " e n d " / > < / w o r k f l o w − a p p > 4.3 . 上 传 调 度 任 务 到 h d f s c d / e x p o r t / s e r v e r s / o o z i e − 4.1.0 − c d h 5.14.0 / o o z i e w o r k s h d f s d f s − p u t m a p − r e d u c e / / u s e r / r o o t / o o z i e w o r k s / 4.4 . 执 行 调 度 任 务 c d / e x p o r t / s e r v e r s / o o z i e − 4.1.0 − c d h 5.14.0 b i n / o o z i e j o b − o o z i e h t t p : / / n o d e − 1 : 11000 / o o z i e − c o n f i g o o z i e w o r k s / m a p − r e d u c e / j o b . p r o p e r t i e s – r u n 5 . O o z i e 任 务 串 联 在 实 际 工 作 当 中 , 肯 定 会 存 在 多 个 任 务 需 要 执 行 , 并 且 存 在 上 一 个 任 务 的 输 出 结 果 作 为 下 一 个 任 务 的 输 入 数 据 这 样 的 情 况 , 所 以 我 们 需 要 在 w o r k f l o w . x m l 配 置 文 件 当 中 配 置 多 个 a c t i o n , 实 现 多 个 任 务 之 间 的 相 互 依 赖 关 系 。 需 求 : 首 先 执 行 一 个 s h e l l 脚 本 , 执 行 完 了 之 后 再 执 行 一 个 M R 的 程 序 , 最 后 再 执 行 一 个 h i v e 的 程 序 。 5.1 . 准 备 工 作 目 录 c d / e x p o r t / s e r v e r s / o o z i e − 4.1.0 − c d h 5.14.0 / o o z i e w o r k s m k d i r − p s e r e v a l − a c t i o n s 5.2 . 准 备 调 度 文 件 将 之 前 的 h i v e , s h e l l , M R 的 执 行 , 进 行 串 联 成 到 一 个 w o r k f l o w 当 中 。 c d / e x p o r t / s e r v e r s / o o z i e − 4.1.0 − c d h 5.14.0 / o o z i e w o r k s c p h i v e 2 / s c r i p t . q s e r e v a l − a c t i o n s / c p s h e l l / h e l l o . s h s e r e v a l − a c t i o n s / c p − r a m a p − r e d u c e / l i b s e r e v a l − a c t i o n s / 5.3 . 修 改 配 置 模 板 c d / e x p o r t / s e r v e r s / o o z i e − 4.1.0 − c d h 5.14.0 / o o z i e w o r k s / s e r e v a l − a c t i o n s v i m w o r k f l o w . x m l < w o r k f l o w − a p p x m l n s = " u r i : o o z i e : w o r k f l o w : 0.4 " n a m e = " s h e l l − w f " > < s t a r t t o = " s h e l l − n o d e " / > < a c t i o n n a m e = " s h e l l − n o d e " > < s h e l l x m l n s = " u r i : o o z i e : s h e l l − a c t i o n : 0.2 " > < j o b − t r a c k e r > {wf:errorMessage(wf:lastErrorNode())}]</message> </kill> <end name="end"/> </workflow-app> 4.3. 上传调度任务到 hdfs cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works hdfs dfs -put map-reduce/ /user/root/oozie_works/ 4.4. 执行调度任务 cd /export/servers/oozie-4.1.0-cdh5.14.0 bin/oozie job -oozie http://node-1:11000/oozie -config oozie_works/map-reduce/job.properties –run 5. Oozie 任务串联 在实际工作当中,肯定会存在多个任务需要执行,并且存在上一个任务的输 出结果作为下一个任务的输入数据这样的情况,所以我们需要在 workflow.xml 配 置文件当中配置多个 action,实现多个任务之间的相互依赖关系。 需求:首先执行一个 shell 脚本,执行完了之后再执行一个 MR 的程序,最 后再执行一个 hive 的程序。 5.1. 准备工作目录 cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works mkdir -p sereval-actions 5.2. 准备调度文件 将之前的 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/ 5.3. 修改配置模板 cd /export/servers/oozie-4.1.0- cdh5.14.0/oozie_works/sereval-actions 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> wf:errorMessage(wf:lastErrorNode())]</message></kill><endname="end"/></workflowapp>4.3hdfscd/export/servers/oozie4.1.0cdh5.14.0/oozieworkshdfsdfsputmapreduce//user/root/oozieworks/4.4cd/export/servers/oozie4.1.0cdh5.14.0bin/ooziejobooziehttp://node1:11000/oozieconfigoozieworks/mapreduce/job.propertiesrun5Oozieworkflow.xmlactionshellMRhive5.1cd/export/servers/oozie4.1.0cdh5.14.0/oozieworksmkdirpserevalactions5.2hiveshellMRworkflowcd/export/servers/oozie4.1.0cdh5.14.0/oozieworkscphive2/script.qserevalactions/cpshell/hello.shserevalactions/cpramapreduce/libserevalactions/5.3cd/export/servers/oozie4.1.0cdh5.14.0/oozieworks/serevalactionsvimworkflow.xml<workflowappxmlns="uri:oozie:workflow:0.4"name="shellwf"><startto="shellnode"/><actionname="shellnode"><shellxmlns="uri:oozie:shellaction:0.2"><jobtracker>{jobTracker}
${nameNode}

mapred.job.queue.name
q u e u e N a m e < / v a l u e > < / p r o p e r t y > < / c o n f i g u r a t i o n > < e x e c > {queueName}</value> </property> </configuration> <exec> queueName</value></property></configuration><exec>{EXEC}

/user/root/oozie_works/sereval-actions/KaTeX parse error: Expected 'EOF', got '#' at position 7: {EXEC}#̲{EXEC}







j o b T r a c k e r < / j o b − t r a c k e r > < n a m e − n o d e > {jobTracker}</job-tracker> <name-node> jobTracker</jobtracker><namenode>{nameNode}





mapred.job.queue.name
${queueName}

mapred.mapper.new-api true mapred.reducer.new-api true mapreduce.job.output.key.class org.apache.hadoop.io.Text mapreduce.job.output.value.class org.apache.hadoop.io.IntWritable

mapred.input.dir
n a m e N o d e / {nameNode}/ nameNode/{inputdir}

mapred.output.dir ${nameNode}/${outputDir} mapreduce.job.map.class

org.apache.hadoop.examples.WordCount$TokenizerMapper

mapreduce.job.reduce.class

org.apache.hadoop.examples.WordCount$IntSumReducer

mapred.map.tasks 1 ${jobTracker} ${nameNode} mapred.job.queue.name ${queueName} ${jdbcURL} INPUT=/user/${wf:user()}/${examplesRoot}/inputdata/table OUTPUT=/user/${wf:user()}/${examplesRoot}/outputdata/hive2 ${wf:actionData('shell-node')['my_output'] eq 'Hello Oozie'} Shell action failed, error

message[ w f : e r r o r M e s s a g e ( w f : l a s t E r r o r N o d e ( ) ) ] < / m e s s a g e > < / k i l l > < k i l l n a m e = " f a i l − o u t p u t " > < m e s s a g e > I n c o r r e c t o u t p u t , e x p e c t e d [ H e l l o O o z i e ] b u t w a s [ {wf:errorMessage(wf:lastErrorNode())}]</message> </kill> <kill name="fail-output"> <message>Incorrect output, expected [Hello Oozie] but was [ wf:errorMessage(wf:lastErrorNode())]</message></kill><killname="failoutput"><message>Incorrectoutput,expected[HelloOozie]butwas[{wf:actionData(‘shellnode’)[‘my_output’]}]



job.properties 配置文件

nameNode=hdfs://node-1:8020
jobTracker=node-1:8032
queueName=default
examplesRoot=oozie_works
EXEC=hello.sh
outputDir=/oozie/output
inputdir=/oozie/input
jdbcURL=jdbc:hive2://node-1:10000/default
oozie.use.system.libpath=true
# 配 置 我 们 文 件 上 传 到 hdfs 的 保 存 路 径 实 际 上 就 是 在 hdfs 的

/user/root/oozie_works/sereval-actions 这个路径下
oozie.wf.application.path= n a m e N o d e / u s e r / {nameNode}/user/ nameNode/user/{user.name}/${examplesRoot}/serevalactions/workflow.xml
5.4. 上传调度任务到 hdfs
cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/
hdfs dfs -put sereval-actions/ /user/root/oozie_works/
5.5. 执行调度任务
cd /export/servers/oozie-4.1.0-cdh5.14.0/
bin/oozie job -oozie http://node-1:11000/oozie -config
oozie_works/sereval-actions/job.properties -run

6. Oozie 定时调度
在 oozie 当中,主要是通过 Coordinator 来实现任务的定时调度,Coordinator
模块主要通过 xml 来进行配置即可。
Coordinator 的调度主要可以有两种实现方式
第一种:基于时间的定时任务调度:
oozie 基于时间的调度主要需要指定三个参数,第一个起始时间,第二个结
束时间,第三个调度频率;
第二种:基于数据的任务调度, 这种是基于数据的调度,只要在有了数据
才会触发调度任务。
6.1. 准备配置模板
第一步:拷贝定时任务的调度模板
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/
6.2. 修改配置模板
修改 job.properties
cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works/cronjob
vim job.properties
nameNode=hdfs://node-1:8020
jobTracker=node-1:8032
queueName=default
examplesRoot=oozie_works
oozie.coord.application.path= n a m e N o d e / u s e r / {nameNode}/user/ nameNode/user/{user.name}/${examplesRoot}/cron-

job/coordinator.xml
#start:必须设置为未来时间,否则任务失败
start=2019-05-22T19:20+0800
end=2019-08-22T19:20+0800
EXEC=hello.sh
workflowAppUri= n a m e N o d e / u s e r / {nameNode}/user/ nameNode/user/{user.name}/${examplesRoot}/cronjob/workflow.xml
修改 coordinator.xml
vim coordinator.xml




w o r k f l o w A p p U r i < / a p p − p a t h > < c o n f i g u r a t i o n > < p r o p e r t y > < n a m e > j o b T r a c k e r < / n a m e > < v a l u e > {workflowAppUri}</app-path> <configuration> <property> <name>jobTracker</name> <value> workflowAppUri</apppath><configuration><property><name>jobTracker</name><value>{jobTracker}


nameNode
n a m e N o d e < / v a l u e > < / p r o p e r t y > < p r o p e r t y > < n a m e > q u e u e N a m e < / n a m e > < v a l u e > {nameNode}</value> </property> <property> <name>queueName</name> <value> nameNode</value></property><property><name>queueName</name><value>{queueName}





修改 workflow.xml
vim workflow.xml




j o b T r a c k e r < / j o b − t r a c k e r > < n a m e − n o d e > {jobTracker}</job-tracker> <name-node> jobTracker</jobtracker><namenode>{nameNode}


mapred.job.queue.name
q u e u e N a m e < / v a l u e > < / p r o p e r t y > < / c o n f i g u r a t i o n > < e x e c > {queueName}</value> </property> </configuration> <exec> queueName</value></property></configuration><exec>{EXEC}

/user/root/oozie_works/cron-job/KaTeX parse error: Expected 'EOF', got '#' at position 7: {EXEC}#̲{EXEC}







6.3. 上传调度任务到 hdfs
cd /export/servers/oozie-4.1.0-cdh5.14.0/oozie_works
hdfs dfs -put cron-job/ /user/root/oozie_works/

6.4. 执行调度
cd /export/servers/oozie-4.1.0-cdh5.14.0
bin/oozie job -oozie http://node-1:11000/oozie -config
oozie_works/cron-job/job.properties –run

5 Oozie 和 Hue 整合

1. 修改 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://node-1: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]
 # 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 and $USER, 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

2. 启动 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
页面访问 hue
http://node-1:8888/
3. Hue 集成 Oozie
3.1. 使用 hue 配置 oozie 调度
hue 提供了页面鼠标拖拽的方式配置 oozie 调度
3.2. 利用 hue 调度 shell 脚本
在 HDFS 上创建一个 shell 脚本程序文件。

打开工作流调度页面。

3.3. 利用 hue 调度 hive 脚本
在 HDFS 上创建一个 hive sql 脚本程序文件。
打开 workflow 页面,拖拽 hive2 图标到指定位置。

3.4. 利用 hue 调度 MapReduce 程序
利用 hue 提交 MapReduce 程序
3.5. 利用 Hue 配置定时调度任务
在 hue 中,也可以针对 workflow 配置定时调度任务,具体操作如下:

一定要注意时区的问题,否则调度就出错了。保存之后就可以提交定时任务。
点击进去,可以看到定时任务的详细信息。

6 Oozie 任务查看、杀死

查看所有普通任务
oozie jobs
查看定时任务
oozie jobs -jobtype coordinator
杀死某个任务 oozie 可以通过 jobid 来杀死某个定时任务
oozie job -kill [id]
oozie job -kill 0000085-180628150519513-oozie-root-C

posted @ 2021-04-11 20:09  赵广陆  阅读(149)  评论(0编辑  收藏  举报