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:
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
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
jobTracker:在 hadoop2 当中,jobTracker 这种角色已经没有了,只有 resourceManager,这里给定 resourceManager 的 IP 及端口即可。
queueName:提交 mr 任务的队列名;
examplesRoot:指定 oozie 的工作目录;
oozie.wf.application.path:指定 oozie 调度资源存储于 hdfs 的工作路径;
EXEC:指定执行任务的名称。
修改 workflow.xml
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 来确定调度时候是由那台机器执行的。
版权声明: 本文为 InfoQ 作者【五分钟学大数据】的原创文章。
原文链接:【http://xie.infoq.cn/article/916c0b51d89a8811e7c592f55】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论