Oozie基础入门

article/2025/9/16 21:58:48

前言:

       因为工作需要用到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上。最终的目录结构如下:

  /xxx/oozie/workflow.xml  

/xxx/oozie/lib  

/xxx/oozie/lib/mr-1.7-SNAPSHOT-package.jar  

/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

       启动任务=提交任务+开始任务

 


http://chatgpt.dhexx.cn/article/FmFNMT5V.shtml

相关文章

大数据调度工具oozie详细介绍

背景&#xff1a; 之前项目中的sqoop等离线数据迁移job都是利用shell脚本通过crontab进行定时执行&#xff0c;这样实现的话比较简单&#xff0c;但是随着多个job复杂度的提升&#xff0c;无论是协调工作还是任务监控都变得麻烦&#xff0c;我们选择使用oozie来对工作流进行调…

oozie详解

1、什么是Oozie Oozie是一种java web应用程序&#xff0c;它运行在java servlet容器中&#xff0c;并使用数据库来存储一下内容&#xff1a; ①工作流定义 ②当前运行的工作流实例&#xff0c;包括实例的状态和变量 Oozie工作流失放置在控制依赖DAG(有向无环图)中的一组动作&am…

大数据Hadoop之——任务调度器Oozie(Oozie环境部署)

文章目录 一、概述二、Oozie架构三、Oozie环境部署&#xff08;Oozie与CDH集成&#xff09;1&#xff09;添加服务2&#xff09;将 Oozie 服务添加到 CDH3&#xff09;自定义角色分配4&#xff09;数据库设置5&#xff09;审核更改6&#xff09;开始自动安装并自启 四、CDH的 H…

Java并发编程(一):多线程与并发原理回顾

今天来聊一聊经典的Java技术&#xff0c;并发编程。并发是程序的灵魂&#xff0c;一个优秀的Java程序一定会支持高并发&#xff0c;并且&#xff0c;并发编程也是面试环节中经常会问到的一个问题&#xff0c;那么今天我们以一道经典的Java面试题回顾一下Java的并发编程。废话不…

java并发编程的艺术和并发编程这一篇就够了

java并发编程的艺术(精华提炼) 通常我们在使用编发编程时,主要目的是为了程序能够更快的处理,但是并不是说更多的线程就一定能够让程序变得足够快,有时候太多的线程反而消耗了更多的资源,反而让程序执行得更缓慢 一.CPU的上下文切换 就算是单核CPU是能够处理多线程任务的,它只…

JAVA并发编程总结

一、基础知识 1.1 线程安全 当多个线程访问某个类时&#xff0c;这个类始终都能表现出正确的行为&#xff0c;那么就称这个类是线程安全的。 CAP理论 原子性 我们把一个或者多个操作在CPU执行的过程中不被中断的特性称为原子性. 可见性 当一个线程修改了对象状态后&#xf…

Java并发:整理自《Java并发编程实战》和《Java并发编程的艺术》

声明&#xff1a;Java并发的内容是自己阅读《Java并发编程实战》和《Java并发编程的艺术》整理来的。 图文并茂请戳 思维导图下载请戳 目录 (1)基础概念 (2)线程 (3)锁 (4)同步器 (5)并发容器和框架 (6)Java并发工具类 (7)原子操作类 (8)Executor框架(执行机制) (9)…

Java并发编程的艺术-并发编程基础

Java从诞生开始就明智地选择了内置对多线程的支持&#xff0c;这使得Java语言相比同一时期的其他语言具有明显的优势。线程作为操作系统调度的最小单元&#xff0c;多个线程能够同时执行&#xff0c;这将显著提升程序性能&#xff0c;在多核环境中表现得更加明显。但是&#xf…

java并发编程(下篇)

java里的阻塞队列 ArrayBlockingQueue 数组结构组成的有界阻塞队列 LinkedBlockingQeque 链表结构的无界阻塞队列 PriorityBlockingQueue 支持优先级排序的无界阻塞队列 DelayQueue 使用优先级队列实现的无界阻塞队列 LinkedBlockingDeque 链表结构组成的双向队列 并发工具…

Java并发编程之美——第一章 Java并发编程基础

文章目录 Time 2021-12-26——Hireek什么是线程线程的等待和通知等待线程终止的join方法让线程睡眠的sleep方法让出CPU执行权的yield方法线程中断demo 线程上下文切换线程死锁什么是死锁如何避免死锁 用户线程与守护线程ThreadLocalintroduction&#xff0c;下文只阐述重要的se…

Java并发编程入门这一篇就够了(文章很长,但很好哦)

Java并发编程入门这一篇就够了 一、进程与线程1. 进程2. 线程3. 二者对比 二、并行与并发三、Java线程1. 创建和运行线程2. 线程运行原理3. 常见方法4. 常用方法详解及异同区分5. 两阶段终止模式&#xff08;使得线程优雅的退出&#xff09;6.主线程与守护线程7. 线程五种状态8…

Java并发编程之Java线程

文章目录 前言01、线程简介02、线程池03、线程间通信总结 前言 记录一下Java并发编程的知识点。有部分内容是借鉴《Java并发编程的艺术》这本书的。本次先介绍一下线程。 01、线程简介 进程和线程的区别 进程&#xff1a;当一个程序被运行&#xff0c;即把程序的代码从磁盘加载…

Java并发编程的艺术

1、并发编程的挑战 1、上下文切换 CPU通过给每个线程分配CPU时间片来实现多线程机制。时间片是CPU分配给各个线程的时间&#xff0c;这个时间非常短&#xff0c;一般是几十毫秒。 CPU通过时间片分配算法来循环执行任务&#xff0c;当前任务执行一个时间片后会切换到下一个任务…

Java并发编程简介

并发编程简介 1. 什么是并发编程 所谓并发编程是指在一台处理器上“同时”处理多个任务。并发是在在同一实体上的多个事件。多个事件在同一时间间隔发生。 并发编程 ①从程序设计的角度来讲&#xff0c;是希望通过某些机制让计算机可以在一个时间段内&#xff0c;执行多个任务…

【java】Java并发编程系列-基础知识(非常详细哦)

文章目录 一、Java并发编程基础1.1 并发编程基本概念1.1.1原⼦性1.1.2 可⻅性1.1.3 有序性 二、内存模型三、重排序四、内存屏障五、总结 一、Java并发编程基础 主要讲解Java的并发编程的基础知识&#xff0c;包括原⼦性、可⻅性、有序性&#xff0c;以及内存模型JMM&#xff…

理解Java并发编程

计算机基础 要想理解Java多线程&#xff0c;一定离不开计算机组成原理和操作系统&#xff0c;因为&#xff0c;java的多线程是JVM虚拟机调用操作系统的线程来实现的 /*Thread.start() 方法中调用了原生的start0()方法 */ public synchronized void start() {if (threadStatus…

【并发编程】JAVA并发编程面试题合集

1.在Java中守护线程和本地线程的区别&#xff1f; Java中的线程分为两种&#xff1a;守护线程&#xff08;Daemon&#xff09;和用户线程&#xff08;User&#xff09;任何线程都可以设置为守护线程和用户线程&#xff0c;通过方法Thread.setDaemon(boolean)&#xff1b;true表…

Java并发编程概述

在学习并发编程之前&#xff0c;我们需要稍微回顾以下线程相关知识&#xff1a; 线程基本概念 程序&#xff1a;静态的代码&#xff0c;存储在硬盘中 进程&#xff1a;运行中的程序&#xff0c;被加载在内存中&#xff0c;是操作系统分配内存的基本单位 线程&#xff1a;是cpu执…

java并发编程(并发编程的三个问题)

什么是并发编程? 首先我们要知道什么是并发? 什么是并行? 并行: 多件事情在同一时刻同时发生 并发: 在同一时间内,多个事情交替执行 并发编程: 比如抢票,秒杀等在同一场景下,有大量的请求访问同一资源, 会出现一些安全性的问题,所以要通过编程来控制多个线程依次访问资源,称…

java并发编程(荣耀典藏版)

大家好 我是月夜枫&#xff0c;聊一聊java中的并发编程&#xff0c;面试工作中也许都会用到&#xff0c;参考了很大博主的博客&#xff0c;整理了很久的文章&#xff0c;虽然还没有全部整理完&#xff0c;后续慢慢更新吧。 并发编程 一、线程的基础概念 一、基础概念 1.1 进…