您的位置:首页 > 大数据

Oozie基础入门

2018-03-01 15:08 447 查看

前言:

       因为工作需要用到oozie,但是晚上的资料确实越看越迷茫,经过很大的努力,终于折腾清楚了,这里,做一个总结,帮助后来者更好地进行入门,当然,粗鄙之言,难免疏漏,欢迎交流指正
 

引入:

       对于我们的工作,可能需要好几个hadoop作业(job)来协作完成,往往一个job的输出会被当做另一个job的输入来使用,这个时候就涉及到了数据流的处理。
       我们不可能就盯着程序,等它运行完再去运行下一个程序,所以,一般的做法就是通过shell来做,但是如果涉及到的工作流很复杂(比方说有1,2,3,4四个作业,1的输出作为2 3 4的输入,然后2 3的结果运算之后再和1的结果进行某种运算……最后再输出)是很费时费力的。这里就用到了oozie——一个能把多个MR作业组合为一个逻辑工作单元(一个工作流),从而自动完成任务调用的工具。
 
备注:oozie本质就是一个作业协调工具(底层原理是通过将xml语言转换成mapreduce程序来做,但只是在集中map端做处理,避免shuffle的过程。),所以我对它的暂时的定位就是会用,能解决问题就行,暂时没有进行深入研究。
 

安装oozie

       安装方式主要是看hadoop的版本注1,我这里的是CDH的hadoop版本,用的也是cloudare的平台,所以涉及的是CDH的安装。
       CDH的oozie的安装一般是两种方式,一种是手动安装,还有一种是通过Cloudare Manager添加服务,它们主要的区别是通过Cloudare Manager添加服务安装的对应的hdfs上的oozie共享库(hdfs://user/oozie/share/lib)有对应的jar包,而手动安装的没有。注2
注1:我接触过的有apache的hadoop,以及CDH的hadoop,用的顺手的还是CDH的hadoop,主要是因为cloudare manager这个监控平台的强大性能。
注2:我采用的是添加服务,但是因为cloudare manager使用的是离线安装,oozie共享库中也没有jar包,手动添加一下就好了。
 

关于控制台

       Oozie是有web界面提供的,可以直接进行web操作,后期方便又实用,但是这里有个坑,通过添加服务打开的web界面上面显示如下图:
      


具体的解决办法见下图圈住的。必须下载Ext-2.2.zip文件,但是这个文件在官网上是需要付费下载的,而且国内的CSDN都需要付费下载,找了好久才找到。
    


下载好的文件安装包之后通过 unzip命令将zip解压到“/var/lib/oozie/目录下(unzip ext-2.2.zip -d /var/lib/oozie/),然后在CM的网页界面配置中启用web控制台,见如下图:
    


重启完成之后控制台界面如下图:
地址为:OozieserverIp:11000/oozie/  (OozieserverIp为oozie所在的服务器的ip地址)
    


注:在配置任务的时候需要注意时区问题,这里的时区要与自己程序执行的主体所在平台的时区相一致。(Setting—>Timezone)

主要概念

       Oozie主要有三个主要概念,分别是workflow,coordinator,bundle。
Workflow:
       工作流,由我们需要处理的每个工作组成,进行需求的流式处理。
Coordinator:
       协调器,可以理解为工作流的协调器,可以将多个工作流协调成一个工作流来进行处理。
Bundle:
       捆,束。将一堆的coordinator进行汇总处理。
 
简单来说,workflow是对要进行的顺序化工作的抽象,coordinator是对要进行的顺序化的workflow的抽象,bundle是对一堆coordiantor的抽象。层级关系层层包裹。
 
网上找了一幅图来描述oozie各个组件之间的关系。
     


 

关于oozie的作业

       这一段应该是工具使用的大头,但是关于这部分网上的资料很多,这里也是做一个入门级的介绍
       Oozie的作业有三部分组成,分别是job.properties,workflow.xml,lib文件夹。下面分别介绍

Job.properties

       从名称也能看出来,这个文件是用来配置作业(job)中用到的各种参数的,总结如下
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
当前用户
Coordinator:oozie.coord.application.path
Coordinator.xml地址(没有可以不写)
 
Bundle:oozie.bundle.application.path
Bundle.xml地址(没有可以不写)
注:1、这个文件如果是在本地通过命令行进行任务提交的话,这个文件在本地就可以了,当然也可以放在hdfs上,与workflow.xml和lib处于同一层级。
2、nameNode,jobTracker和workflow.xml在hdfs中的位置必须设置。
       eg:启动任务
       ooziejob -oozie http://oozieServerIp:11000/oozie/-config job.properties-run
一个简单的job.properties文件如下:
       Shell节点的job.properties文件:
nameNode=hdfs://cm1:8020
jobTracker=cm1:8032
queueName=default
examplesRoot=examples
 
oozie.wf.application.path=${nameNode}/user/workflow/oozie/shell

workflow.xml:

       这个文件是定义任务的整体流程的文件,需要注意的有三点:版本信息,EL函数,节点信息。
       先上一个例子:
1.  <workflow-app xmlns="uri:oozie:workflow:0.4" name="${sys_name}-MonitorPlus-Task-${task_id}">   2.      <start to=“check-xxx-succ-flag"/>   3.     4.      <decision name=“check-xxx-succ-flag">   5.          <switch>   6.  <case to="check-mr-succ-flag">${fs:exists(concat(concat("/xxx/output/xxxList/",    7.       task_id),"/_SUCCESS"))}</case>   8.  <default to=“do-xxx"/>   9.          </switch>   10.     </decision>   11.    12.     <decision name="check-mr-succ-flag">   13.         <switch>   14.             <case to="end">${fs:exists(concat(concat(“/xxx/output/", task_id),"/_SUCCESS"))}</case>   15.             <default to="do-mr"/>   16.         </switch>   17.     </decision>   18.    19.     <action name=“do-xxx" retry-max="3" retry-interval="10">   20.         <java>   21.             <job-tracker>${jobTracker}</job-tracker>   22.             <name-node>${namenode}</name-node>   23.             <configuration>   24.                 <property>   25.                     <name>mapreduce.job.queuename</name>   26.                     <value>${queueName}</value>   27.                 </property>   28.             </configuration>   29.            <main-class>com.xxx.Main</main-class>        30.          </java> 31.        <ok to=”end”/> 32.        <error to=”fail”/> 33.     </action> 34.     <kill name=”fail”> 35.         <message>Map/Reduce failed.error message[${wf:errorMessage(wf:lastErrorNode())}]</message> 36.     </kill> 37.     <end name=”end”/> 38. </workflow-app>

版本信息:

       这个是写在第一行的,如下:
<workflow-app xmlns="uri:oozie:workflow:0.4" name="${sys_name}-MonitorPlus-Task-${task_id}">
在xmls属性中定义了workflow的版本为0.4,workflow的版本不能高于oozie兼容的最高版本,可以降低。

EL函数

       但凡涉及到“${ }”这样的符号基本都是EL函数,花括号中写的是需要的函数信息。当然,如果是在job.properties中设置的常量也可以通过EL函数取出来,例如“${nameNode}”。常用的EL函数有基本的EL函数,workFlow EL函数和HDFSEL函数。分别如下:
          


        


        


节点:

       Oozie的节点分成两种,流程控制节点和动作节点。所谓的节点实际就是一组标签。两种节点分别如下:
n  流程控制节点
u  <start />——定义workflow的开始
u  <end />——定义workflow的结束
u  <decision />——实现switch功能
<switch><case /><default /></switch>标签连用
u  <sub-workflow>——调用子workflow
u  <kill />——程序出错后跳转到这个节点执行相关操作
u  <fork />——并发执行workflow
u  <join />——并发执行结束(与fork一起使用)
案例;
    


        


n  动作节点
u  <shell />——表示运行的是shell操作
u  <java />——表示运行的java程序
u  <fs />——表示是对hdfs进行操作
u  <MR />——表示进行的是MR操作
u  <hive />——表示进程的是hive操作
u  <sqoop />——表示进行的是sqoop的相关操作
Workflow.xml综述       文件需要被放在HDFS上才能被oozie调度,如果在启动需要调动MR任务,jar包同样需要在hdfs上。最终的目录结构如下:
l    /xxx/oozie/workflow.xml  l  /xxx/oozie/lib  l  /xxx/oozie/lib/mr-1.7-SNAPSHOT-package.jar  l  /xxx/oozie/lib/xxx.mr-1.7-SNAPSHOT-package.jar 

Lib文件夹:

       在workflow工作流定义的同级目录下,需要有一个lib目录,在lib目录中存在java节点MapReduce使用的jar包。需要注意的是,oozie并不是使用指定jar包的名称来启动任务的,而是通过制定主类来启动任务的。在lib包中绝对不能存在某个jar包的不同版本,不能够出现多个相同主类。 

Oozie Cli命令:

       这个是oozie的客户端使用的关于oozie job的命令,总结如下
l  启动任务
oozie job -oozie oozie_url -config job.properties_address-run
l  停止任务
oozie job -oozie oozie_url -kill jobId -oozie-oozi-W
l  提交任务
oozie job -oozie oozie_url -config job.properties_address -submit
l  开始任务
oozie job -oozie oozie_url -config job.properties_address -startJobId -oozie-oozi-W
l  查看任务执行情况
oozie job -oozieoozie_url -config job.properties_address -info jobId -oozie-oozi-W
 
说明: 所有的命令都是以oozie job -oozie oozie_url 开头的-config 制定job.properties文件夹的位置,-run 文件启动后会返回一个唯一的jobId,供之后使用。
 
启动任务,提交任务,开始任务的区别:
       提交任务是指将任务提交给oozie但是并不运行,也会返回一个唯一的jobId。 -submit
       开始任务是将提交的任务执行。-start
       启动任务=提交任务+开始任务
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息