热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

javaoozie任务状态_Oozie工作流分析

我们在实际的生成操作中经常需要将一些任务在晚上开启进行定时执行,或者多个作业,例如hive,mapreduce,shell等任务的组合调用。我们可以使用

我们在实际的生成操作中经常需要将一些任务在晚上开启进行定时执行,或者多个作业,例如hive,mapreduce,shell等任务的组合调用。

我们可以使用linux的contab + spervisor + inotify-tool进行任务的配值,但是操作起来麻烦,而且没有可视化的参数返回界面。也不能保证任务的可靠性。

在hadoop技术栈中我们可以使用oozie做为任务的调度与定时触发的工具。可以方便的帮助我们进行管理和调度我们常见的9中作业调度。

oozie基本架构

是一个工作流调度系统工作流的调度是DAG(有向无环图)-Directed Acyclical Graphs

Coordinator job可以通过时间和数据集的可用性触发

集成了Hadoop生态系统的其它任务,如mr,pig,hive,sqoop,distcp

可扩展:一个Oozie就是一个mr程序,但是仅仅是map,没有reduce

可靠性:任务失败后的重试

AAffA0nNPuCLAAAAAElFTkSuQmCC

oozie.png

workflow,coordinator,bundle

Workflow:工作流,由我们需要处理的每个工作组成,进行需求的流式处理。

Coordinator:协调器,可以理解为工作流的协调器,可以将多个工作流协调成一个工作流来进行处理。

Bundle:捆,束。将一堆的coordinator进行汇总处理。

简单来说,workflow是对要进行的顺序化工作的抽象,coordinator是对要进行的顺序化的workflow的抽象,bundle是对一堆coordiantor的抽象。层级关系层层包裹。

Oozie的作业有三部分组成,分别是job.properties,workflow.xml,lib文件夹。

Job.properties

配值需要的参数

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地址(没有可以不写)nameNode=hdfs://cm1:8020jobTracker=cm1:8032queueName=defaultexamplesRoot=examples

oozie.wf.application.path=${nameNode}/user/workflow/oozie/shell

workflow.xml  2.        3.

4.        5.            6.  ${fs:exists(concat(concat("/xxx/output/xxxList/",

7.       task_id),"/_SUCCESS"))}  8.    9.            10.       11.

12.       13.           14.             ${fs:exists(concat(concat(“/xxx/output/", task_id),"/_SUCCESS"))}  15.               16.           17.       18.

19.       20.           21.             ${jobTracker}  22.             ${namenode}  23.               24.                   25.                     mapreduce.job.queuename  26.                     ${queueName}  27.                   28.               29.            com.xxx.Main       30.          31.        32.        33.     34.     35.         Map/Reduce failed.error message[${wf:errorMessage(wf:lastErrorNode())}]36.     37.     38. 

Oozie的节点分成两种,流程控制节点和动作节点。所谓的节点实际就是一组标签。两种节点分别如下:

流程控制节点——定义workflow的开始——定义workflow的结束——实现switch功能标签连用——调用子workflow——程序出错后跳转到这个节点执行相关操作——并发执行workflow——并发执行结束(与fork一起使用)

动作节点——表示运行的是shell操作——表示运行的java程序——表示是对hdfs进行操作——表示进行的是MR操作——表示进程的是hive操作——表示进行的是sqoop的相关操作

文件需要被放在HDFS上才能被oozie调度,如果在启动需要调动MR任务,jar包同样需要在hdfs上。

lib文件夹

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

oozie cli

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 Coordinator job 定时任务

修改时区

.修改 core-site.xml

oozie.processing.timezone

GMT+0800

修改 $OOZIE_HOME/oozie-server/webapps/oozie/oozie-console.jsfunction getTimeZone() {

Ext.state.Manager.setProvider(new Ext.state.COOKIEProvider());return Ext.state.Manager.get("TimezoneId","GMT+0800");

}

1.编辑job.propertiesnameNode=hdfs://cen-ubuntu.cenzhongman.com:8020

jobTracker=localhost:8032

queueName=default

oozieAppsRoot=oozie-apps

oozie.coord.application.path=${nameNode}/user/cen/${oozieAppsRoot}/cron-schedule

start=2017-07-30T14:40+0800

end=2017-07-30T14:59+0800

workflowAppUri=${nameNode}/user/cen/${oozieAppsRoot}/cron-schedule

2.编辑 workflow.xml 文件

3.编辑coordinator.xml 文件

xmlns="uri:oozie:coordinator:0.4">

${workflowAppUri}

jobTracker

${jobTracker}

nameNode

${nameNode}

queueName

${queueName}

4.上传文件至 HDFS

5.执行任务export OOZIE_URL=http://cen-ubuntu:11000/oozie/bin/oozie job --config oozie-apps/cron-schedule/job.properties -run

oozie JAVA API

直接将oozie下的oozie-client.jar包拷贝带eclipse中,就可以使用java进行启动oozie任务了,这也方便了项目的集成。public class UserProxy {

public static void main(String[] args) throws Exception {

HadoopLogin login = new HadoopLogin();        final Configuration conf = login.loginHdfs("ibdc","C:/Program Files (x86)/Java/newhadoop_oozieweb_conf/ibdc.keytab");

UserGroupInformation.getLoginUser().doAs(new PrivilegedExceptionAction(){

public Void run() throws Exception {

submitJob();                return null;

}

});

}

private static void submitJob() throws OozieClientException, InterruptedException    {         // get a OozieClient for local Oozie

XOozieClient  wc =new AuthOozieClient("http://hadoop7:11000/oozie/");//       OozieClient wc = new OozieClient("http://hadoop7:11000/oozie/v1/job/");//       AuthOozieClient wc = new AuthOozieClient("http://hadoop7:11000/oozie/", AuthOozieClient.AuthType.KERBEROS.toString());

try {

System.out.println(UserGroupInformation.getLoginUser());

} catch (IOException e) {

e.printStackTrace();

}         // create a workflow job configuration and set the workflow application path

Properties conf = wc.createConfiguration();

conf.setProperty(OozieClient.APP_PATH, "hdfs://nameservice1/user/oozieweb/oozie-app/oozieweb/workflow/antest2");

// setting workflow parameters

conf.setProperty("jobTracker", "hadoop7:8032");

conf.setProperty("nameNode", "hdfs://nameservice1");//       conf.setProperty("examplesRoot", EXAMPLE_DIR);

conf.setProperty("queueName", "cdrapp");//       conf.setProperty("outputDir", OUTPUT_DIR);//       conf.setProperty("oozie.wf.rerun.failnodes", "true");

conf.setProperty("hdfs.keytab.file", "C:/Program Files (x86)/Java/newhadoop_oozieweb_conf/oozieweb.keytab");

conf.setProperty("hdfs.kerberos.principal", "oozieweb");

conf.setProperty("mapred.mapper.new-api", "true");

conf.setProperty("mapred.reducer.new-api", "true");

conf.setProperty("oozie.use.system.libpath", "true");

// submit and start the workflow job

String jobId = wc.run(conf);

System.out.println("Workflow job submitted");

// wait until the workflow job finishes printing the status every 10 seconds

while (wc.getJobInfo(jobId).getStatus() == WorkflowJob.Status.RUNNING) {

System.out.println("Workflow job running ...");

Thread.sleep(10 * 1000);

}

// print the final status of the workflow job

System.out.println("Workflow job completed ...");

System.out.println(wc.getJobInfo(jobId));

}

}

oozie和azkaban 区别

工作流定义:Oozie是通过xml定义的而Azkaban为properties来定义。

部署过程:  Oozie的部署太虐心了。有点难。同时它是从Yarn上拉任务日志。

Azkaban中如果有任务出现失败,只要进程有效执行,那么任务就算执行成功,这是BUG,但是Oozie能有效的检测任务的成功与失败。

操作工作流:Azkaban使用Web操作。Oozie支持Web,RestApi,Java API操作。

权限控制:   Oozie基本无权限控制,Azkaban有较完善的权限控制,入用户对工作流读写执行操作。

Oozie的action主要运行在hadoop中而Azkaban的actions运行在Azkaban的服务器中。

记录workflow的状态:Azkaban将正在执行的workflow状态保存在内存中,Oozie将其保存在Mysql中。

出现失败的情况:Azkaban会丢失所有的工作流,但是Oozie可以在继续失败的工作流运行。

作者:张晓天a

链接:https://www.jianshu.com/p/b0a82baa19a7



推荐阅读
  • Azkaban(三)Azkaban的使用
    界面介绍首页有四个菜单projects:最重要的部分,创建一个工程,所有flows将在工程中运行。scheduling:显示定时任务executing:显示当前运行的任务histo ... [详细]
  • mapreduce源码分析总结
    这篇文章总结的非常到位,故而转之一MapReduce概述MapReduce是一个用于大规模数据处理的分布式计算模型,它最初是由Google工程师设计并实现的ÿ ... [详细]
  • Flink使用java实现读取csv文件简单实例首先我们来看官方文档中给出的几种方法:首先我们来看官方文档中给出的几种方法:第一种:Da ... [详细]
  • SparkOnYarn在YARN上启动Spark应用有两种模式。在cluster模式下,Spark驱动器(driver)在YARNApp ... [详细]
  • Hadoop之Yarn
    目录1Hadoop1.x和Hadoop2.x架构区别2Yarn概述3Yarn基本架构4Yarn工作机制5作业提交全过程6资源调度器7任务的推测执行1Hadoop1.x和Hadoo ... [详细]
  • mapreduce原理_MapReduce原理及WordCount实践
    参考链接:https:www.cnblogs.comlaowangcp8961946.html一、MapReduce流程1.1Mapreduce整体流程: ... [详细]
  • Hadoop——Hive简介和环境配置
    一、Hive的简介和配置1.简介Hive是构建在Hadoop之上的数据操作平台lHive是一个SQL解析引擎,它将SQL转译成MapReduce作业,并 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • 对于开源的东东,尤其是刚出来不久,我认为最好的学习方式就是能够看源代码和doc,測试它的样例为了方便查看源代码,关联导入源代 ... [详细]
  • 我们在之前的文章中已经初步介绍了Cloudera。hadoop基础----hadoop实战(零)-----hadoop的平台版本选择从版本选择这篇文章中我们了解到除了hadoop官方版本外很多 ... [详细]
  • MapReduce工作流程最详细解释
    MapReduce是我们再进行离线大数据处理的时候经常要使用的计算模型,MapReduce的计算过程被封装的很好,我们只用使用Map和Reduce函数,所以对其整体的计算过程不是太 ... [详细]
  • Java开发实战讲解!字节跳动三场技术面+HR面
    二、回顾整理阿里面试题基本就这样了,还有一些零星的问题想不起来了,答案也整理出来了。自我介绍JVM如何加载一个类的过程,双亲委派模型中有 ... [详细]
  • 当计算任务越来越多,作业提交越来越多,企业普通的做法是,在原有的系统架构上,不停地往上堆积硬件或者加服务器。的确,hadoop设计上的优秀和可扩展性可以方便的 ... [详细]
author-avatar
sx-March23
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有