linux怎么查看本机内存大小
255
2022-11-16
大数据Hadoop之——任务调度器Oozie(Oozie环境部署)
@[TOC]
一、概述
Oozie是一个基于工作流引擎的开源框架,依赖于MapReduce来实现,是一个管理 Apache Hadoop 作业的工作流调度系统。是由Cloudera公司贡献给Apache的,它能够提供对Hadoop MapReduce和Pig Jobs的任务调度与协调。Oozie需要部署到Java Servlet容器中运行。 官网:https://oozie.apache.org/官方文档:https://oozie.apache.org/docs/5.2.1/index.html安装包下载地址:https://dlcdn.apache.org/oozie/5.2.1/github源码地址:https://github.com/apache/oozie.git
Oozie的特点:
Oozie是管理hadoop作业的调度系统; Oozie的工作流作业是一系列动作的有向无环图(DAG); Oozie协调作业是通过时间(频率)和有效数据触发当前的Oozie工作流程; 工作流通过hPDL定义(一种XML流程定义语言); 资源文件(脚本、jar包等)存放在HDFS Oozie支持各种hadoop作业,例如:java map-reduce、Streaming map-reduce、pig、hive、sqoop和distcp等等,也支持系统特定的作业,例如java程序和shell脚本; Oozie是一个可伸缩,可靠和可拓展的系统。
二、Oozie架构
Oozie三层结构:
Workflow:工作流,由我们需要处理的每个工作组成,进行需求的流式处理,是对要进行的顺序化工作的抽象。 控制节点(CONTROL NODE):控制流节点一般都是定义在工作流开始或者结束的位置,比如start,end,kill等。以及提供工作流的执行路径机制,如decision, fork, join等。 动作节点(ACTION NODE) : 负责执行具体动作的节点,比如:拷贝文件,执行某个hive、shell、sqoop、pig、mr等等。
Coordinator:协调器,可以理解为工作流的协调器,可以将多个工作流协调成一个工作流来进行处理,是对要进行的顺序化的workflow的抽象,定时触发一个workflow。流程图如下:
Bundle:捆,束。将一堆的coordinator进行汇总处理,是对一堆coordiantor的抽象,用来绑定多个coordinator或者多个workflow,流程图如下:
三、Oozie环境部署(Oozie与CDH集成)
一般Oozie是集成到CDH上使用的,所以这里部署就通过CM去部署了,没有部署CDH的小伙伴,可以参考我之前的文章:大数据Hadoop之——Cloudera Hadoop(CM 6.3.1+CDH 6.3.2环境部署)
1)添加服务
2)将 Oozie 服务添加到 CDH
3)自定义角色分配
4)数据库设置
还在是在大数据Hadoop之——Cloudera Hadoop(CM 6.3.1+CDH 6.3.2环境部署)这篇文章初始化的配置。
5)审核更改
6)开始自动安装并自启
到这里Oozie服务就安装完成了。
四、CDH的 Hue 整合 Oozie
由于oozie的xml配置执行各种任务调度是在太过于繁琐,所有一般都使用hue整合oozie来使用。
五、Oozie简单使用
1)在Hue上操作Oozie
1、利用 Hue 调度 shell 脚本
3、配置调用任务
这里选择shell脚本,很多选择
发现报错了
WARN org.apache.oozie.command.wf.ActionStartXCommand: SERVER[hadoop-cdhslave02-168-182-163] USER[admin] GROUP[-] TOKEN[] APP[myworkflow001] JOB[0000003-220423133048789-oozie-oozi-W] ACTION[0000003-220423133048789-oozie-oozi-W@shell-52b4] Error starting action [shell-52b4]. ErrorType [TRANSIENT], ErrorCode [JA009], Message [JA009: Invalid resource request! Cannot allocate containers as requested resource is greater than maximum allowed allocation. Requested resource type=[memory-mb], Requested resource=<memory:2048, vCores:1>, maximum allowed allocation=<memory:1024, vCores:4>, please note that maximum allowed allocation is calculated by scheduler based on maximum resource of registered NodeManagers, which might be less than configured maximum allocation=<memory:1024, vCores:4>
其实这里只是加了一个任务,其实可以加很多任务,接下来就可自行扩展了
2、利用 Hue 调度 hive 脚本
sql文件
create database test001;
CREATE TABLE IF NOT EXISTS test001.person_1 (
id INT COMMENT 'ID',
name STRING COMMENT '名字',
age INT COMMENT '年龄',
likes ARRAY
通过beeline连接hive检查
$ beeline -u jdbc:hive2://hadoop-cdhmaster-168-182-161:10000 -n root show databases; show tables from test001;
3、 利用 Hue 配置定时调度任务
【温馨提示】一定要注意时区的问题,否则调度就出错了。保存之后就可以提交定时任务。
2)CLI操作Oozie
Oozie 提供了一个命令行实用程序oozie来执行作业和管理任务。所有操作都是通过oozie CLI 的子命令完成的。
一个Oozie 的 job 一般由以下文件组成:
job.properties
:记录了job的属性workflow.xml
:使用hPDL 定义任务的流程和分支脚本文件/lib目录
:用来执行具体的任务的文件
job.properties |
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地址(没有可以不写) |
【温馨提示】这个文件如果是在本地通过命令行进行任务提交的话,这个文件在本地就可以了,当然也可以放在hdfs上,与workflow.xml和lib处于同一层级。nameNode,jobTracker和 oozie.wf.application.path在hdfs中的位置必须设置。
1、CLI 调度 shell 脚本
oozie官方提供的oozie-examples.tar.gz这个包里也有:tar -xf oozie-examples.tar.gz $ cd examples/apps/ $ ll
进入到shell的示例目录,发现有两个配置文件job.properties,workflow.xml
$ cd shell
修改job.properties
# 配置hdfs,地址记得改成自己环境的 nameNode=hdfs://hadoop-cdhslave01-168-182-162:8020 # 配置yarn,8088是web端口,8032是yarn的服务端口号 resourceManager=hadoop-cdhslave01-168-182-162:8032 queueName=default examplesRoot=examples # HDFS脚本文件存放目录 oozie.wf.application.path=${nameNode}/user/${user.name}/workflow/shell # 定义脚本变量,也可以直接写脚本名字 shellScript=helloworld.sh
修改workflow.xml
默认是echo输出,这里修改成执行脚本 <workflow-app xmlns="uri:oozie:workflow:1.0" name="shell-wf"> <start to="shell-node"/> <action name="shell-node"> <shell xmlns="uri:oozie:shell-action:1.0"> <resource-manager>${resourceManager}</resource-manager> <name-node>${nameNode}</name-node> <configuration> <property> <name>mapred.job.queue.name</name> <value>${queueName}</value> </property> </configuration> <exec>${shellScript}</exec> <file>/user/oozie/workflow/shell/${shellScript}#${shellScript}</file> <capture-output/> </shell> <ok to="end"/> <error to="fail"/> </action> <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>
脚本:helloworld.sh ```bash #!/bin/bash echo `date` " hello world" >> /tmp/helloworld.log
可以在job.properties定义一个变量,在workflow.xml中使用变量把三个文件都上传到/user/oozie/workflow/shell/目录下
$ sudo -u oozie hadoop fs -mkdir -p /user/oozie/workflow/shell/ $ sudo -u oozie hadoop fs -put * /user/oozie/workflow/shell/
立即执行任务
$ sudo -u oozie /usr/bin/oozie job -oozie -config job.properties -run
Oozie web console is disabled.To enable Oozie web console install the Ext JS library.Refer to Oozie Quick Start documentation for details.
【Oozie web console is disabled 问题解决】
$ find /opt/ -name libext $ cd /opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/lib/oozie/libext $ wget http://archive.cloudera.com/gplextras/misc/ext-2.2.zip $ sudo unzip ext-2.2.zip $ sudo chown oozie:oozie -R ext-2.2
2、执行多个任务job
$ cd /opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/share/doc/oozie-5.1.0+cdh6.3.2/examples/apps # copy一份shell文件 $ cp -r shell shell02 $ cd shell02
新建一个shell脚本,test02.sh
#!/bin/bash echo "test mutil workflow" >> /tmp/test02.log
修改job.properties
# 配置hdfs,地址记得改成自己环境的 nameNode=hdfs://hadoop-cdhslave01-168-182-162:8020 # 配置yarn,8088是web端口,8032是yarn的服务端口号 resourceManager=hadoop-cdhslave01-168-182-162:8032 queueName=default examplesRoot=examples # HDFS脚本文件存放目录 oozie.wf.application.path=${nameNode}/user/${user.name}/workflow/shell # 定义脚本变量,也可以直接写脚本名字 shellScript=helloworld.sh # 新增一个脚本变量 shellScript02=test02.sh
修改workflow.xml,新增一个action
强制覆盖
$ sudo -u oozie hadoop fs -put -f * /user/oozie/workflow/shell/
执行任务
$ sudo -u oozie /usr/bin/oozie job -oozie -config job.properties -run
3、调度MR任务
直接使用官方模板修改(wordcount示例)
$ cd /opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/share/doc/oozie-5.1.0+cdh6.3.2/examples/apps/map-reduce $ ll $ tree lib/
先用传统方式验证一把
$ cat>./wordcount.txt<< EOF hello oozie hello hadoop hadoo oozie hello world hello bigdata bigdata hadoop hello flink EOF $ sudo -u hdfs hadoop fs -put wordcount.txt / # 找到hadoop-mapreduce-examples*.jar包 $ find /opt/ -name hadoop-mapreduce-examples*.jar $ sudo -u hdfs yarn jar /opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/jars/hadoop-mapreduce-examples-3.0.0-cdh6.3.2.jar wordcount /wordcount.txt /out
配置workflow.xml
修改后的workflow.xml内容如下:
修改job.properties,内容如下:
# 配置hdfs,地址记得改成自己环境的 nameNode=hdfs://hadoop-cdhslave01-168-182-162:8020 # 配置yarn,8088是web端口,8032是yarn的服务端口号 resourceManager=hadoop-cdhslave01-168-182-162:8032 queueName=default examplesRoot=examples oozie.wf.application.path=${nameNode}/user/${user.name}/workflow/map-reduce/workflow.xml # 定义脚本变量,也可以直接写脚本名字 outputDir=map-reduce
换掉lib下面的jar包,使用新API
$ cd /opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/share/doc/oozie-5.1.0+cdh6.3.2/examples/apps $ cp /opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/jars/hadoop-mapreduce-examples-3.0.0-cdh6.3.2.jar map-reduce/lib/ $ rm -f map-reduce/lib/oozie-examples-5.1.0-cdh6.3.2.jar
把map-reduce目录推到HDFS上
$ sudo -u oozie hadoop fs -put -f map-reduce /user/oozie/workflow/
执行任务
$ sudo -u oozie /usr/bin/oozie job -oozie -config map-reduce/job.properties -run
登录Oozie web UI:web查看任务
4、调度定时任务
$ cd /opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/share/doc/oozie-5.1.0+cdh6.3.2/examples/apps $ cd cron
修改job.properties,内容如下:
nameNode=hdfs://hadoop-cdhslave01-168-182-162:8020 resourceManager=hadoop-cdhslave01-168-182-162:8032 queueName=default examplesRoot=examples oozie.coord.application.path=${nameNode}/user/${user.name}/workflow/cron # start必须设置未来时间,否则任务会失败 start=2022-04-27T23:30Z end=2022-04-29T01:00Z workflowAppUri=${nameNode}/user/${user.name}/workflow/cron shellScript=test001.sh
修改workflow.xml,其实也是上面第一个示例
修改coordinator.xml,内容如下:
frequency频率最低五分钟,时区调整为中国时区 <coordinator-app name="cron-coord" frequency="${coord:minutes(5)}" start="${start}" end="${end}" timezone="GMT+0800" xmlns="uri:oozie:coordinator:0.2"> <action> <workflow> <app-path>${workflowAppUri}</app-path> <configuration> <property> <name>resourceManager</name> <value>${resourceManager}</value> </property> <property> <name>nameNode</name> <value>${nameNode}</value> </property> <property> <name>queueName</name> <value>${queueName}</value> </property> </configuration> </workflow> </action> </coordinator-app> 把cron整个目录推送到HDFS
$ cd .. $ sudo -u oozie hadoop fs -put cron /user/oozie/workflow/
执行
$ sudo -u oozie /usr/bin/oozie job -oozie -config cron/job.properties -run
3)Java API操作Oozie
1、编辑好shell脚本和workflow.xml文件
$ mkdir -p /opt/test/oozie/workflow/shell
$ vi /opt/test/oozie/workflow/shell/ooziehello.sh
#!/bin/bash
name=$1
echo "hello $name" >> /tmp/oozieshell.log
$ vi /opt/test/oozie/workflow/shell/workflow.xml
3、把上面两个文件上传到HDFS
$ sudo -u oozie hadoop fs -mkdir /user/oozie/workflow/oozieshell/ $ sudo -u oozie hadoop fs -put * /user/oozie/workflow/oozieshell/
4、代码执行提交任务
package com.bigdata;
/**
* workflow shell test
*/
import org.apache.oozie.client.OozieClient;
import org.apache.oozie.client.WorkflowAction;
import org.apache.oozie.client.WorkflowJob;
import java.util.List;
import java.util.Properties;
public class WorkFlowShellTest {
public static void main(String[] args) {
System.setProperty("user.name", "oozie");
OozieClient oozieClient = new OozieClient("http://hadoop-cdhslave02-168-182-163:11000/oozie/");
try {
System.out.println(oozieClient.getServerBuildVersion());
Properties properties = oozieClient.createConfiguration();
properties.put("oozie.wf.application.path", "${nameNode}/user/${user.name}/workflow/oozieshell");
properties.put("queueName", "default");
properties.put("nameNode", "hdfs://hadoop-cdhslave01-168-182-162:8020");
properties.put("resourceManager", "hadoop-cdhslave01-168-182-162:8032");
properties.put("shellScript", "ooziehello.sh");
properties.put("argument", "oozie");
//运行workflow
String jobid = oozieClient.run(properties);
System.out.println("jobid:" + jobid);
//根据workflow id获取作业运行情况
WorkflowJob workflowJob = oozieClient.getJobInfo(jobid);
//获取作业日志
System.out.println(oozieClient.getJobLog(jobid));
//获取workflow中所有ACTION
List
其它的示例也类似,就是把之前的job.properties,用java格式加载,运行,查询,其它都一样。所以其它示例就由小伙伴自行练习了。
六、常用命令
# 启动 $ oozied.sh start # 停止 $ oozied.sh stop # 提交任务并启动任务(submit和start命令合并) $ oozie job -oozie -config job.properties –run # 提交任务不启动 $ oozie job -oozie -config job.properties –submit # 启动任务 $ oozie job -oozie -start 0001837-220423150913947-oozie-oozi-W ### workflow任务 # 查看所有workflow任务 $ oozie jobs # 查看信息 $ oozie job -oozie -info 0001837-220423150913947-oozie-oozi-W # 查看日志 $ oozie job -oozie -log 0001837-220423150913947-oozie-oozi-W # Kill任务 $ oozie job -oozie -kill 0001831-220423150913947-oozie-oozi-W # 或者下面这句 $ oozie job -kill 0001831-220423150913947-oozie-oozi-W ### coordinator 定时任务 # 查看定时任务 $ oozie jobs -jobtype coordinator -oozie http://hadoop-cdhslave02-168-182-163:11000/oozie/ $ oozie jobs -jobtype coordinator # 删除定时任务 $ oozie job -kill 0000345-220423150913947-oozie-oozi-C
七、Oozie与Azkaban对比
对比指标 | Azkaban | Oozie |
---|---|---|
功能 | Azkaban与Oozie均可以调度mapreduce、pig、java脚本工作流任务;Azkaban与Oozie均可以定时执行工作流任务。 | 与Azkaban 一样 |
工作流传参 | Azkaban支持直接传参,例如${input}。 | Oozie支持参数和EL表达式,例如${fs:dirSize(myInputDir)}。 |
定时执行 | Azkaban的定时执行任务是基于时间的。 | Oozie的定时执行任务是基于时间和输入数据资源管理。 |
工作流执行 | Azkaban有两种运行模式,分别是solo server mode(executor server和web server部署在同⼀台节点)和multi server mode(executor server和web server可以部署在不同节点)。 | Oozie作为工作流服务运行,支持多用户和多工作流。 |
综上所述,Oozie相比Azkaban是一个重量级的任务调度系统,功能全面,但配置使用也更复杂(xml)。如果可以不在意某些功能的缺失,轻量级调度Azkaban是很不错的候选对象。所以如果不是用CDH,还是使用Azkaban方便简单~
关于Azkaban,可以参考我之前的文章:大数据Hadoop之——任务调度器Azkaban(Azkaban环境部署)大数据Hadoop之——Azkaban API详解
关于Oozie的概述和简单使用就到这结束了,如果小伙伴有疑问,欢迎给我留言,未完待续,请耐心等待~
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~