写点什么

Apache Oozie 深入原理讲解

发布于: 2021 年 03 月 16 日
Apache Oozie 深入原理讲解

Oozie 详解

Oozie 是一个用来管理 Hadoop 生态圈 job 的工作流调度系统。由 Cloudera 公司贡献给 Apache。Oozie 是运行于 Java servlet 容器上的一个 java web 应用。Oozie 的目的是按照 DAG(有向无环图)调度一系列的 Map/Reduce 或者 Hive 等任务。Oozie 工作流由 hPDL(Hadoop Process Definition Language)定义(这是一种 XML 流程定义语言)。适用场景包括:

需要按顺序进行一系列任务;

需要并行处理的任务;

需要定时周期触发的任务;

可视化作业流运行过程;

运行结果或异常的通报。


1. Oozie 的架构



Oozie Client:提供命令行、java api、rest 等方式,对 Oozie 的工作流流程的提交、启动、运行等操作;

Oozie WebApp:即 Oozie Server,本质是一个 java 应用。可以使用内置的 web 容器,也可以使用外置的 web 容器;

Hadoop Cluster:底层执行 Oozie 编排流程的各个 hadoop 生态圈组件;

 

2. Oozie 基本原理

Oozie 对工作流的编排,是基于 workflow.xml 文件来完成的。用户预先将工作流执行规则定制于 workflow.xml 文件中,并在 job.properties 配置相关的参数,然后由 Oozie Server 向 MR 提交 job 来启动工作流。

2.1. 流程节点

工作流由两种类型的节点组成,分别是:

Control Flow Nodes:控制工作流执行路径,包括 start,end,kill,decision,fork,join。

Action Nodes:决定每个操作执行的任务类型,包括 MapReduce、java、hive、shell 等。

 


3. Oozie 工作流类型

3.1. WorkFlow

规则相对简单,不涉及定时、批处理的工作流。顺序执行流程节点。

Workflow 有个大缺点:没有定时和条件触发功能。



3.2. Coordinator

Coordinator 将多个工作流 Job 组织起来,称为 Coordinator Job,并指定触发时间和频率,还可以配置数据集、并发数等,类似于在工作流外部增加了一个协调器来管理这些工作流的工作流 Job 的运行。



3.3. Bundle

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

 


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:

<!--节点最大可用内存,结合实际物理内存调整 --><property>        <name>yarn.nodemanager.resource.memory-mb</name>        <value>3072</value></property><!--每个容器可以申请内存资源的最小值,最大值 --><property>        <name>yarn.scheduler.minimum-allocation-mb</name>        <value>1024</value></property><property>        <name>yarn.scheduler.maximum-allocation-mb</name>        <value>3072</value></property>
<!--修改为Fair公平调度,动态调整资源,避免yarn上任务等待(多线程执行) --><property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value></property><!--Fair调度时候是否开启抢占功能 --><property> <name>yarn.scheduler.fair.preemption</name> <value>true</value></property><!--超过多少开始抢占,默认0.8--> <property> <name>yarn.scheduler.fair.preemption.cluster-utilization-threshold</name> <value>1.0</value> </property>
复制代码

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可申请内存大小 --><property>        <name>mapreduce.map.memory.mb</name>        <value>1024</value></property><property>        <name>mapreduce.reduce.memory.mb</name>        <value>1024</value></property>
复制代码

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://node01:8020jobTracker=node01:8032queueName=defaultexamplesRoot=oozie_worksoozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/shellEXEC=hello.sh
复制代码

jobTracker:在 hadoop2 当中,jobTracker 这种角色已经没有了,只有 resourceManager,这里给定 resourceManager 的 IP 及端口即可。

queueName:提交 mr 任务的队列名;

examplesRoot:指定 oozie 的工作目录;

oozie.wf.application.path:指定 oozie 调度资源存储于 hdfs 的工作路径;

EXEC:指定执行任务的名称。

修改 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>        <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>
复制代码

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://node03:11000/oozie -config oozie_works/shell/job.properties  -run

从监控界面可以看到任务执行成功了。

可以通过 jobhistory 来确定调度时候是由那台机器执行的。



发布于: 2021 年 03 月 16 日阅读数: 11
用户头像

还未添加个人签名 2020.11.10 加入

专注于大数据技术

评论

发布
暂无评论
Apache Oozie 深入原理讲解