(1)目前计算框架和作业类型繁多:MapReduce Java、Streaming、HQL、Pig等。
(2)如何对这些框架和作业进行统一管理和调度:
① 不同作业之间存在依赖关系(DAG:有向无环图,指定了作业之间的调度关系);
② 周期性作业;
③ 定时执行的作业;
④ 作业执行状态监控与报警。
(3)多种解决方案
① crontab(crontab文件包含送交cron守护进程的一系列作业和指令。每个用户可以拥有自己的crontab文件;同时,操作系统保存一个针对整个系统的crontab文件,该文件通常存放于/etc或者/etc之下的子目录中,而这个文件只能由系统管理员来修改);
② 自己设计调度系统;
③ 直接使用开源系统。
(1)对常见作业类型进行调度
① MapReduce(Java、Streaming等)作业;
② Hive作业;
③ Pig作业;
④ Shell …
(2)根据需要对作业进行调度
① 按周期调度;
② 定时调度。
(3)支持容错与报警
任务的重启;任务失败的报警等。
(4)可视化作业流运行过程
可视化作业流,当前执行到哪个作业了,作业流当前的状态等。
(1)Oozie(目前大多数企业都在用这个,所以本文接下来主要对Oozie进行讲述)
Yahoo开源,基于xml表达作业依赖关系。
(2)Azkaban
Linkedin开源,通过java property配置作业依赖关系。
(3)Zeus(宙斯)
阿里开源,通过界面配置作业依赖关系。目前已经停止维护了。
(4)其他开源系统
Cascading(通过Java API编程实现作业依赖关系)。
(1)Oozie是用于Hadoop 平台的开源的工作流调度引擎;
(2)用来管理Hadoop作业;
(3)属于web应用程序,由Oozie client和Oozie server两个组件构成;
(4)Oozie server运行于Java Servlet容器(Tomcat)中的web程序;
(5)Oozie以action为基本任务单位,可以将多个action构成一个DAG图(有向无环图Direct Acyclic Graph)的模式进行运行;
(6)Oozie工作流通过HPDL(一种通过XML自定义处理的语言)来构造Oozie的工作流;
(7)一个Oozie服务器主要包括四个服务:Oozie workflow、Oozie coordinator、Oozie bundlehe Oozie SLA(Service level agreement ,Oozie服务水平协议)。
(1)Oozie workflow:该组件用于定义和执行一个特定顺序的MapReduce、Hive和Pig作业等;
(2)Oozie coordinator:该组件用于支持基于事件、系统资源存在性等条件的workflow的自动化执行;(简单地理解为工作流的协调器,可以将多个workflow工作流协调成一个coordinator工作流来进行处理)
(3)Oozie bundle:该引擎可以定义和执行“一束”应用,从而提供一个批量化的方法,将一组coordinator应用程序一起进行管理;
(4)Oozie服务水平协议(Service Level Agreement,SLA):该组件支持workflow应用程序执行过程的记录跟踪。
(1)左侧:Oozie 通过 Tomcat Http Server 对外提供了 JAVA API 、REST API 、CLI(终端) 、Web 接口(hue) ;产生的数据存储在 Oozie object dstabase 上;
(2)中间:Oozie 的三层结构;
(3)右侧:Oozie 的 Coordinator Engine 协调引擎 能够监控基于 Time-based triggers 和 HDFS 上的 Data-based triggers;每一个 Oozie Job 都是一个只有 Map Task 的 MapReduce 程序。
(1)workflow使用Hadoop流程定义语言(Hadoop Process Defination Language,hPDL)来描述工作流,hPDL是类似xml语言的一种相当简洁的定义类语言。
(2)作业流由一组行为节点(Hadoop MR作业、Hive作业等)构成,且这些节点通过控制流相连。
① 工作流控制节点定义了工作流的起始和结束,并控制工作流的执行路径;
② 行为节点包含一个计算/处理任务,包括:Hadoop MapReduce,HDFS,Pig,SSH,HTTP,eMail等;可设置重试次数。
(3)Oozie工作流执行图
(4)workflow工作流生命周期
(5)workflow工作流状态转换图
(6)workflow流控制节点
(7)workflow行为节点
① workflow默认支持的action动作
② workflow扩展action动作
(8)workflow异步操作
workflow中的所有异步操作(action)都需要在Hadoop集群上以MapReduce作业的方式进行执行,这样充分利用了集群的优点。Oozie通过两种方式来检查任务是否完成:
① 回调:当一个任务和一个计算被启动后,会为任务提供一个回调url,该任务执行完成后,会执行回调通知Oozie。
② 轮询:Oozie不停地去查询任务执行的完成状态。如果由于网络故障回调机制失败,也会使用轮询的方式去获取任务的状态。
Oozie提供这两种方式来控制任务,将资源密集型的任务放到服务节点之外,使Oozie节约服务器资源,确保单个Oozie服务器可以支持上千个作业。
(9)workflow规则
① job.properties:定义workflow作业的配置信息;(内容形式为key=value)
② workflow.xml:定义作业的执行工作流,是一个有定义规则的xml文件;
③ 三方库:将依赖的.jar和.so放到lib/目录下;
④ 程序目录结构如下:
(1)定期执行一个工作流;
(2)数据准备完毕后执行一个工作流。
(1)Oozie bundle是顶层抽象,允许将一组coordinator任务打包成为一个bundle任务;
(2)组成一个整体bundle的多个coordinator可以作为一个整体来进行控制,包括启动、停止、挂起、继续、重新执行等操作;
(3)bundle中不支持它的coordinator应用程序之间的显示依赖关系,如果需要定义依赖关系,可以在coordinator中通过输入输出事件来指定依赖。
(1)步骤1:将工作流文件上传到HDFS上;
hadoop fs -put ~/map-reduce map-reduce;
(2)步骤2:运行工作流;
Oozie job -Oozie http://oracle:11000/Oozie/ -config ~/map-reduce/job.properties –run
……
job: 14-20140325161321-Oozie-ninj
(3)查看工作流运行状态
Oozie job -info 14-20140325161321-Oozie-ninj -Oozie http://oracle:11000/Oozie/
(1)统一调度Hadoop系统中常见的MR任务启动、HDFS操作、Shell调度、Hive操作等;
(2)使用复杂的依赖关系、事件触发、时间触发使用xml语言进行表达,开发效率提高;
(3)一组任务使用一个DAG来表示,使用图形表达流程逻辑更加清晰;
(4)支持很多种任务调度,能完成大部分Hadoop任务处理;
(5)程序定义支持EL常量和函数,表达更加丰富。
(1)Oozie是管理Hadoop作业的工作流调度系统;
(2)Oozie的工作流是一系列的操作图;
(3)Oozie协调作业是通过时间(频率)以及有效数据触发当前的Oozie工作流程;
(4)Oozie是针对Hadoop开发的开源工作流引擎,专门针对大规模复杂工作流程和数据管道设计;
(5)Oozie围绕两个核心:工作流和协调器,前者定义任务的拓扑和执行逻辑,后者负责工作流的依赖和触发。
参考文章:
[1] https://blog.csdn.net/g11d111/article/details/74538789
[2] https://www.cnblogs.com/jzdwajue/p/7223657.html
[3] https://blog.csdn.net/carolzhang8406/article/details/79159391
[4] https://www.cnblogs.com/cenzhongman/p/7229387.html?yyue=a21bo.50862.201879
[5] https://blog.csdn.net/weixin_39198774/article/details/79412726
[6] https://blog.csdn.net/nsrainbow/article/details/43746111