Azkaban 使用问题及解决(一)

作者: PeTu | 来源:发表于2016-08-07 20:14 被阅读14376次

    什么是Azkaban

    Azkaban是一款基于Java编写的任务调度系统

    任务调度:有四个任务脚A、B、C、D,其中任务A与任务B可以并行运行,然后任务C依赖任务A和任务B的运行结果,任务D依赖任务C的运行结果,此时整个过程可以等效为一个有向无环图,而给所有的任务运行定一个运行规则就可以理解为任务调度。

    在任务简单时可以人为控制,但是当任务非常多,依赖复杂时,如果没有清晰的任务规划图,很容易在任务之间形成闭环从而出错,或者多个可并行的任务没有并行执行而浪费资源,这种时候就需要一个工作流调度器,Azkaban就是完成这种任务的。

    Azkaban分为三个部分:

    1. mysql服务器:用于存储项目、日志或者执行计划之类的信息
    2. web服务器:使用Jetty对外提供web服务,使用户可以通过web页面方便管理
    3. executor服务器:负责具体的工作流的提交、执行

    Azkaban服务器交互图

    基础搭建

    首先可从Azkaban官网上下载azkaban,初学时可以只下载
    azkaban-web-server-2.5.0.tar.gzazkaban-executor-server-2.5.0.tar.gzazkaban-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文件中可以进行执行服务器数据库连接,执行服务器线程数等设置。

    在这些都设置好以后,浏览器访问对应IP与端口,即可进入Azkaban的web界面了。此时Azkaban的基础搭建基本完成。

    了解各个元素及其关系

    Azkaban界面中的主要元素有三个,分别是project、job与flow
    project可以理解为某个项目,其项目中包含了许多需要执行的任务,即为job,各个job之间形成依赖关系,便组成了工作流flow

    创建工作 job 与创建工作流 flow

    在Azkaban系统的web界面中有创建project的交互,可以通过界面创建一个project,但是Azkaban没有创建job与flow的界面,这一点很讨厌。于是需要编写以.job为扩展名的文件然后上传,才能在系统中形成job任务。

    创建job

    首先,需要创建以.job为扩展名的文件,一个文件即代表一个任务。

    所有的job都需要一个知道他们如何去执行的type。一般的,有这样四种job类型:Java、command、javaprocess和pig。
    本文以type=command为例

    其次在这个文件中添加这个任务所需的参数与参数值,
    必须的参数有typecommand
    例如

    type=command
    command=echo 'jobs start'
    

    四类job类型的文件都可以添加的参数有
    retries --> 任务失败时自动重启的次数
    retry.backoff --> 每一次任务尝试重启时之间等待的毫秒数
    working.dir --> 可以重新指定任务执行的工作目录,默认为目前正在运行的任务的工作目录
    failure.emails --> 任务失败时的邮件提醒设置,以逗号分隔多个邮箱
    success.emails --> 任务成功时的邮件提醒设置,以逗号分隔多个邮箱
    notify.emails --> 任务无论失败还是成功都邮件提醒设置,以逗号分隔多个邮箱
    dependencies--> 定义该文件依赖的文件,值为被依赖文件的文件名,多个目标以逗号分隔,不加扩展名
    保存为start.job文件即创建好了一个job

    Azkaban每个project中只能上传一个.zip文件

    创建工作流flow

    定义好所有的参数后即为定义好了一个job,如果添加了dependencies参数即形成了工作流flow
    以开头的任务流为例:

    #start.job
    type=command
    command=echo "jobs start"
    
    #A.job
    type=command
    command=echo "This A job"
    dependencies=start
    
    #B.job
    type=command
    command=echo "This B job"
    dependencies=start
    
    #C.job
    type=command
    command=echo "This C job"
    dependencies=A,B
    
    #D.job
    type=command
    command=echo "This D job"
    dependencies=C
    

    保存好5个文件后,将5文件打包成zip,然后在界面中进行上传,就会将这几个job上传到了系统中,最终呈现

    从而一个工作流flow建好。

    注意,想多个工作流flow并到一张图中,必须多个工作流flow有一个公共的结束job文件

    创建子工作流subflow及其作用

    Azkaban可以给每一个flow设定定时调度,这样就可以等到特定时间运行,然而,这样依旧不能满足一些需求
    例如:
    一个整个平台的任务调度中,大部分的job任务是根据依赖依次进行,但是有某些个job则依然需要自己的运行设定时间,即上一个job完成后需要等待,不能立即执行下一个job,但是Azkaban给job任务单独设定时后,会覆盖整个任务流flow的设置,所以此时需要引进子任务流subflow
    子任务流的创建需要一个job文件,其参数形式为

    type= xxx
    flow.name= xxx
    dependencies= xxx
    

    注意
    子流文件的参数设置需要遵循:

    1. flow.name为设定的子流subflow的结束job文件的文件名
    2. 子流内部的起始文件不存在依赖 ,其依赖关系在type=flow这个文件中设定
    3. 子流后面的文件的依赖则为type=flow这个job文件的文件名

    所以上面这个例子中
    添加一个文件:

    #subflow.job
    type=flow
    flow.name=C
    dependencies=start
    

    相应修改文件:

    #A.job
    type=command
    command=echo "This A job"
    
    #B.job
    type=command
    command=echo "This B job"
    
    #D.job
    type=command
    command=echo "This D job"
    dependencies=subflow
    

    此时工作流会变为

    这样在这个project中,就可以分别对两个流进行调度的设定,并且主流中的依赖会等待子流的运行,总体任务调度图也会非常的清晰

    邮件提醒设置

    Azkaban自带有邮件提醒功能,在web服务器的conf/azkaban.properties文件中,有以下字段

    # mail settings
    mail.host=
    mail.sender=
    mail.user=
    mail.password=
    job.failure.email=
    job.success.email=
    job.notify.email=
    

    这里面所有的值都是设定的是邮件的发送者,当初以为是设定接受者,被坑了好久,而邮件的接受者设置则需要前文所说的job文件的failure.emailssuccess.emailsnotify.emails三个参数,但是这三个属性不是直接加在.job文件中,而是需要在所有.job文件的根目录下创建一个以.properties为扩展名的文件
    例如:

    # system.properties
    success.emails=xxx@xx.com
    failure.emails=xxx@xx.com
    

    一些其他需要全局作用的参数也可以添加在这个文件中,此属性文件会作用于全局job文件,一起打包上传即可。这样就可以实现任务成功或失败时的邮件提醒。

    最后

    Azkaban还可以自行开发插件,不过这个系统依然有一些bug,如果后续有需求则需要慢慢修补了。

    相关文章

      网友评论

      • 803284b34c18:不错不错,收藏了。

        推荐下,分布式作业中间件 Elastic-Job 源码解析 16 篇:http://t.cn/R05mBNd


        随缘361:Azkaban在服务器双IP的情况下如何绑定呢?
        12a033ef755a:写的不错,谢谢博主;已收藏~
        12a033ef755a:写的不错,谢谢博主;已收藏~
      • 辉格食品:已阅
        随缘361:Azkaban在服务器双IP的情况下如何绑定呢?
      • 可乐灬爱上冰:“而是需要在所有.job文件的根目录下创建一个以.properties为扩展名的文件”
        您这句话的,.job文件的根目录在哪呢?
        我是把本地所有 .job 放在一个文件夹下,然后压缩上传到web执行,. properties 无法upload???
        PeTu:@可乐灬爱上冰 我很久没用这个系统了,不过我记得的是,你的那个文件夹就是根目录,并且属性文件是可以上传的。不好意思,没上传上去属性文件我没碰到:sweat_smile:
      • 9fbd6fafc96d:作者君,你好
        请问“这样在这个project中,就可以分别对两个流进行调度的设定,并且主流中的依赖会等待子流的运行,总体任务调度图也会非常的清晰”,这个如何实现?
        我配置调度的时候,确实可以实现分开写调度时间了,但是完全是执行了2次,主流也不会等待子流啊。。。。。。。。。。
        随缘361:Azkaban在服务器双IP的情况下如何绑定呢?
      • c8c42d0adb2f:大神,我这边出现个问题,flow中有三个job,他们之间有依赖关系,第2个job报错了,如果配置可以执行第三个job。我看了下官网的介绍,Failure Options中可以配置,但是配置后,程序还是跑到第2个job就停止了,求大神给点意见
        随缘361:@依栏听风 Azkaban在服务器双IP的情况下如何绑定呢?
        c8c42d0adb2f:@pengtuo 谢谢。
        PeTu:@依栏听风 这个问题我也碰到了,目前没有解决,我猜测是azkaban的bug,就像这个系统不能对某一个job定时执行一样。目前刚改好源码可以对某一个job定时执行,打算后续解决你这个问题
      • 386ea9b88b9d:我用的是azkaban-2.5,我按你的方式建subflow,可等到2个独立的flow,c.job和subflow.job没有任何关系。请问是什么原因呢? 我的工程目录如下:
        #1.job
        type=command
        command= echo "1.job"

        #a.job

        type=command
        command= echo "a.job"

        #b.job

        type=command
        command= echo "b.job"

        #c.job
        type=command
        dependencies=a,b
        command= echo "c.job"

        #subflow.job
        type=flow
        flow.name=c
        dependencies=1
        随缘361:Azkaban在服务器双IP的情况下如何绑定呢?
        PeTu:@386ea9b88b9d 没有测试你的这个问题,但是子流也会单独显示成一个流,并且在主流依然能看见这个子流

      本文标题:Azkaban 使用问题及解决(一)

      本文链接:https://www.haomeiwen.com/subject/obgksttx.html