刚刚了解了分布式应用程序的协调服务zookeeper,我们现在来了解一下工作流任务调度系统,就是作业协调的工具。主要了解两个主要产品oozie和azkaban。
一、Oozie
1、oozie本质就是一个作业协调的工具(底层原理是通过将xml语言转化成MapReduce程序来做,但只是集中在map端做处理,避免shuffle过程)。
2、主要概念:
① workflow:工作流,有我们需要处理的每个工作组成,进行需求的流式处理
② coordinator:协调器,可以理解为工作流的协调器,可以将多个工作流协调成一个工作流来进行处理
③ bundle: 束,将一堆coordinator进行汇总处理
简单来说,workflow是对要进行顺序化的工作的抽象,coordinator是对要进行顺序化的workflow的抽象,bundle是对一堆coordinator的抽象
3、oozie的作业由三部分组成:job.properties,workflow.xml,lib
job.properties是用来配置job中各种用到的参数
workflow.xml是定义任务的整体流程的文件,需要注意的有三点:版本信息,EL函数,节点信息。workflow.xml文件需要被放置在HDFS上才能被oozie调度,如果启动需要调动MR任务,jar包同样需要在HDFS上。
oozie的节点分为两种:流程控制节点和动作节点。①流程控制节点一般都是定义在工作流开始或者结束的位置,比如:start,end,kill等,以及提供工作流执行路径机制,比如:decision,fork,join等。②动作节点是负责执行具体动作的节点,比如拷贝文件,执行某个shell脚本等。
lib是在workflow工作流定义的同级目录下,需要一个lib目录,在lib目录中存在MapReduce使用的jar包。需要注意的是,oozie并不是使用指定的jar包启动任务的,而是通过指定主类来启动任务的。在lib包中绝对不能存在某个jar包的不同版本和不能够出现多个相同的主类
4、oozie的最终目录结构如下:
/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
二、Azkaban
1、azkaban是由linkedin公司推出的批量工作流任务调度器,主要用于在一个工作流内以一个特定的顺序运行一组工作和流程。它的配置通过简单的key:value对的方式,通过配置中的dependencies来设置依赖关系,这个依赖必须是无环的,否则会被视为无效的工作流。azkaban使用job配置文件建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。
2、azkaban主要由三个关键组件组成:关系型数据库(MySQL)、AzkabanWebServer、AzkabanExecutorServer。
(1)azkaban使用数据库存储大部分状态,AzkabanWebServer和AzkabanExecutorServer都需要访问数据库
(2)AzkabanWebServer是azkaban工作流系统的主要管理者,它负责project的管理、用户登录认证、定时执行工作流、跟踪工作流执行进度等一系列任务。同时,它还提供Web服务操作的接口,利用该接口,用户可以使用curl或其他ajax的方式,来执行azkaban的相关操作。操作包括:用户登录,创建project、上传workflow、执行workflow、查询workflow的执行进度、杀掉workflow等一系列操作,且这些操作的返回结果均是json的格式。并且azkaban使用方便,azkaban使用以.job为后缀名的键值属性文件来定义工作流中的各个任务,以及使用dependencies属性定义作业间的依赖关系链。这些作业文件和关联的代码最终以*.zip的方式通过azkaban UI传到web服务器上。
(3)AzkabanExecutorServer主要负责具体的工作流的提交、执行,可以启动多个执行器,它通过mysql数据库来协调任务的执行。目前Azkaban将AzkabanExecutor分离成独立的服务器,这样方便某个任务流失败后,可以更方便的将其重新执行和便于Azkaban的升级。
3、作业执行流程:
(1)WebServer根据内存中各个Executor资源状态(WebServer有一个线程会遍历各个active Executor,去发送http请求获取其资源状态信息缓存到内存中),按照选择策略(包括executor资源状态,最近执行流个数等)选择一个executor下发作业流
(2)executor判断是否设置作业粒度分配。如果未设置作业粒度分配,则在当前executor执行所有作业;如果设置了作业粒度分配,则当前节点会成为作业分配决策者,即分配节点
(3)分配节点从zookeeper获取各个executor资源状态信息,然后根据策略选择一个executor分配作业
(4)被分配到作业的executor即成为执行节点,执行作业,然后更新数据库
4、在版本3.0中,Azkaban提供了三种模式:
1、solo server mode:最简单的模式,数据库为内置的H2数据库,AzkabanWebServer和AzkabanExecutorServer会在同一个进程中运行
2、two server mode:数据库为MySQL,AzkabanWebServer和AzkabanExecutorServer在不同进程中,这种模式下,AzkabanWebServer和AzkabanExecutorServer之间互不影响
3、multiple server mode:该模式下,AzkabanWebServer和AzkabanExecutorServer运行在不同主机上,且AzkabanExecutorServer可以有多个
三、Oozie和Azkaban对比
1、两者在功能方面大致相同,只是oozie底层在Hadoop Spark作业是通过org.apache.hadoop的封装好的接口进行提交,而Azkaban可以直接操作shell语句,安全性上更高。oozie配置工作流的时候需要编写大量的XML配置,而且代码复杂度较高,不易于二次开发。oozie相对于azkaban是一个重量级的任务调度系统,功能全面但配置使用也更复杂。
2、工作流定义:oozie是通过XML定义的而azkaban是通过properties来定义的
3、oozie的部署相对困难,而且它是从yarn上拉任务日志,azkaban中如果有任务执行失败,只要进程有效执行,那么就算任务执行成功,但oozie可以有效的检测任务的成功与失败
4、操作工作流:azkaban通过web操作,而oozie支持web,RestApi,Java API操作
5、权限控制:oozie无权限控制,azkaban有比较完善的权限控制,供用户对工作流读写执行操作,oozie的action主要运行在hadoop中而azkaban的actions运行在azkaban的服务器中
6、记录workflow的状态:azkaban将正在执行的workflow状态保存在内存中,而oozie保存在mysql中
7、出现失败的情况:azkaban会丢失所有的工作流,但是oozie可以在继续失败的工作流运行
*附上我学习Azkaban的连接:https://blog.youkuaiyun.com/clypm/article/details/79076801