Azkaban是一款基于Java编写的任务调度系统java
任务调度:有四个任务脚A、B、C、D,其中任务A与任务B能够并行运行,而后任务C依赖任务A和任务B的运行结果,任务D依赖任务C的运行结果,此时整个过程能够等效为一个有向无环图,而给全部的任务运行定一个运行规则就能够理解为任务调度。mysql
在任务简单时能够人为控制,可是当任务很是多,依赖复杂时,若是没有清晰的任务规划图,很容易在任务之间造成闭环从而出错,或者多个可并行的任务没有并行执行而浪费资源,这种时候就须要一个工做流调度器,Azkaban就是完成这种任务的。git
Azkaban分为三个部分:github
mysql服务器:用于存储项目、日志或者执行计划之类的信息web
web服务器:使用Jetty对外提供web服务,使用户能够经过web页面方便管理sql
executor服务器:负责具体的工做流的提交、执行数据库
首先可从Azkaban官网上下载azkaban,初学时能够只下载azkaban-web-server-2.5.0.tar.gz
,azkaban-executor-server-2.5.0.tar.gz
和azkaban-sql-script-2.5.0.tar.gz
三个组件压缩包便可,下载后进行解压azkaban-sql-script-2.5.0.tar.gz
包中包含的都是Azkaban所需用到的全部数据库表的建立语句,在Azkaban 2.5.0版本的这个包中会有一个create-all.sql
文件,能够一次性建立好全部的数据库表。azkaban-web-server-2.5.0.tar.gz
解压后在其conf/azkaban.properties
文件中能够进行web服务器数据库链接,web访问方式与端口,web访问帐号密码,邮件等设置,各位根据本身的实际状况进行配置。azkaban-executor-server-2.5.0.tar.gz
解压后在其conf/azkaban.properties
文件中能够进行执行服务器数据库链接,执行服务器线程数等设置。bash
在这些都设置好之后,浏览器访问对应IP与端口,便可进入Azkaban的web界面了。此时Azkaban的基础搭建基本完成。服务器
Azkaban界面中的主要元素有三个,分别是project、job与flow
project能够理解为某个项目,其项目中包含了许多须要执行的任务,即为job,各个job之间造成依赖关系,便组成了工做流flow
在Azkaban系统的web界面中有建立project的交互,能够经过界面建立一个project,可是Azkaban没有建立job与flow的界面,这一点很讨厌。因而须要编写以.job
为扩展名的文件而后上传,才能在系统中造成job任务。
首先,须要建立以.job
为扩展名的文件,一个文件即表明一个任务。
全部的job都须要一个知道他们如何去执行的type。通常的,有这样四种job类型:Java、command、javaprocess和pig。
本文以type=command
为例
其次在这个文件中添加这个任务所需的参数与参数值,
必须的参数有type
与command
例如
type=commandcommand=echo 'jobs start'
四类job类型的文件均可以添加的参数有retries
--> 任务失败时自动重启的次数retry.backoff
--> 每一次任务尝试重启时之间等待的毫秒数working.dir
--> 能够从新指定任务执行的工做目录,默认为目前正在运行的任务的工做目录failure.emails
--> 任务失败时的邮件提醒设置,以逗号分隔多个邮箱success.emails
--> 任务成功时的邮件提醒设置,以逗号分隔多个邮箱notify.emails
--> 任务不管失败仍是成功都邮件提醒设置,以逗号分隔多个邮箱dependencies
--> 定义该文件依赖的文件,值为被依赖文件的文件名,多个目标以逗号分隔,不加扩展名
保存为start.job
文件即建立好了一个job
Azkaban每一个project中只能上传一个
.zip
文件
定义好全部的参数后即为定义好了一个job,若是添加了dependencies
参数即造成了工做流flow
以开头的任务流为例:
#start.jobtype=commandcommand=echo "jobs start"
#A.jobtype=commandcommand=echo "This A job"dependencies=start
#B.jobtype=commandcommand=echo "This B job"dependencies=start
#C.jobtype=commandcommand=echo "This C job"dependencies=A,B
#D.jobtype=commandcommand=echo "This D job"dependencies=C
保存好5个文件后,将5文件打包成zip,而后在界面中进行上传,就会将这几个job上传到了系统中,最终呈现
从而一个工做流flow建好。
注意,想多个工做流flow并到一张图中,必须多个工做流flow有一个公共的结束job文件
Azkaban能够给每个flow设定定时调度,这样就能够等到特定时间运行,然而,这样依旧不能知足一些需求
例如:
一个整个平台的任务调度中,大部分的job任务是根据依赖依次进行,可是有某些个job则依然须要本身的运行设定时间,即上一个job完成后须要等待,不能当即执行下一个job,可是Azkaban给job任务单独设定时后,会覆盖整个任务流flow的设置,因此此时须要引进子任务流subflow
子任务流的建立须要一个job文件,其参数形式为
type= xxx flow.name= xxxdependencies= xxx
注意
子流文件的参数设置须要遵循:
flow.name为设定的子流subflow的结束job文件的文件名
子流内部的起始文件不存在依赖 ,其依赖关系在type=flow这个文件中设定
子流后面的文件的依赖则为type=flow这个job文件的文件名
因此上面这个例子中
添加一个文件:
#subflow.jobtype=flowflow.name=Cdependencies=start
相应修改文件:
#A.jobtype=commandcommand=echo "This A job"
#B.jobtype=commandcommand=echo "This B job"
#D.jobtype=commandcommand=echo "This D job"dependencies=subflow
此时工做流会变为
这样在这个project中,就能够分别对两个流进行调度的设定,而且主流中的依赖会等待子流的运行,整体任务调度图也会很是的清晰
Azkaban自带有邮件提醒功能,在web服务器的conf/azkaban.properties
文件中,有如下字段
# mail settingsmail.host=mail.sender=mail.user=mail.password=job.failure.email=job.success.email=job.notify.email=
这里面全部的值都是设定的是邮件的发送者,当初觉得是设定接受者,被坑了很久,而邮件的接受者设置则须要前文所说的job文件的failure.emails
,success.emails
,notify.emails
三个参数,可是这三个属性不是直接加在.job
文件中,而是须要在全部.job
文件的根目录下建立一个以.properties
为扩展名的文件
例如:
# system.propertiessuccess.emails=xxx@xx.com failure.emails=xxx@xx.com
一些其余须要全局做用的参数也能够添加在这个文件中,此属性文件会做用于全局job文件,一块儿打包上传便可。这样就能够实现任务成功或失败时的邮件提醒。
Azkaban还能够自行开发插件,不过这个系统依然有一些bug,若是后续有需求则须要慢慢修补了。