Azkaban调研

一、概述

Azkaban来自LinkedIn公司,用于管理他们的Hadoop批处理工作流。日常生产环境中,为了得到想要的数据,通常需要执行很多作业,一批作业执行完毕,再将中间结果进一步处理,最后得到有价值的数据,因此作业之间执行有先后顺序和依赖关系。这样的一组作业称为一个工作流,Azkaban就是用来构建、运行和管理工作流的工具,它提供友好的Web用户界面来维护和跟踪用户的工作流程。

简单来讲,它有几个特点:

  • 兼容各个版本的hadoop
  • 用户可通过web页面提交工作流
  • 工作流调度
  • 系统模块化支持插件开发
  • 用户认证和权限验证
  • 用户操作追踪
  • 任务执行结果邮件报警
  • 按照SLA执行报警和杀作业
  • 失败作业重试

Azkaban已经在LinkedIn运行了好几年,管理着很多Hadoop和数据仓库作业流,具有很强的可用性。项目主页:http://azkaban.github.io/azkaban2/

二、系统结构

Azkaban目前有2个大版本,azkaban1.x和azkaban2.x,1系结构比较简单,不需要依赖数据库,执行器和调度器以及webServer都集成在一起,缺点是没有用户和权限管理,其它功能不够丰富,随着用户规模增大和系统健壮性需求,azkaban系统演进到最新2.2版本,不过感兴趣的童鞋还是可以体验一下azkaban1,测试版地址在http://10.4.19.55:8030/。下面重点介绍一下azkaban2。

Azkaban2由三个重要的组件组成,mysql数据库、executor、webServer。架构图如下: 
其中AzkabanWebServer除了提供web页面响应服务,还负责项目管理,认证,调度,监控和发起执行,它是azkaban的大脑。executor则负责作业的执行,对执行过程及结果进行监控,并将执行状况汇报给AzkabanWebServer,两者采用http接口进行通信。

Mysql数据库是azkaban2中加进来的组件,azkaban系统中多数数据都存储在mysql中,甚至包括用户上传的工作流文件、作业执行的日志等。executor和webServer都通过jdbc频繁地对其操作。

项目主页解释executor和webServer分离的好处是方便系统升级,后续作业规模变大,可能会出现多个executor,这样的结构方便扩展并能获得更高的可用性。上述3个组件也可以不在一台机器上部署。

azkaban2.2测试环境链接:https://10.4.19.55:8443 用户名azkaban密码azkaban

三、Azkaban怎么用

3.1创建工程

输入用户名和密码登陆到azkaban之后,你就能看到工程界面,点击”Create Project“按钮:


在弹出的对话框填入项目名称和项目描述,然后点击创建工程,这时候页面会跳转到你刚新建的项目页面,点击右上角绿色的上传按钮,将项目的zip包上传。就能看到刚才自己上传的工作流了。


3.2、创建工作流

简单来讲,工作流是由一个或多个job以及相应的配置文件组成的,那么什么是job,job之间的依赖关系怎么表明?先看一个例子

3.2.1、如何描述作业

#foo.job
type=command
command=echo foo

上面的内容就是一个简单地作业,作业名字可以任起,但是必须以.job结尾,作业采用”key=value“,这样的方式描述,比如上面,type是关键字,代表作业类型,这里的类型就是command,command的意思是指linux的shell命令。

下面的command也是关键字,代表了具体的要执行的命令。显然有时候需要执行多个命令,作业还可以写成下面的样式,即如果有多个命令的时候,可以采用command.x。除了type和command还有其它一些作业参数,例如重试次数,重试间隔,报警接收人等。

type=command
command=echo "*****start*****"*
command.1=echo "This is how one runs a command job"
command.2=whoami
command.3=echo "******end******"type=command*
这种作业类型属于内置作业类型,即azkaban核心代码中可识别的,前面提到azkaban是用来管理hadoop作业的,那么相应的,作业类型就需要改变称为hadoopJava,只有安装了相应的插件,系统才能识别这种类型。除了hadoop作业,azkaban通过插件的方式,还支持了普通java作业,pig以及hive等,系统的接口也允许我们自己开发属于自己的作业类型插件。当然不同的作业类型配置也不一样,这里先以command类型为例,先让大家了解一下整个azkaban是怎样使用的。

3.2.2、建立依赖关系

#bar.job

jobtype=command
dependencies=foo
command=echo bar

刚才我们创建了一个foo.job,现在创建一个依赖foo.job的作业bar.job,内容如上,同样指定作业类型为command,但是多了一个关键字dependencies,它就是用来标明依赖关系的关键字。所谓依赖,就是指dependencies指定的作业运行成功之后才执行自己的任务。

到这里一个简单地工作流其实已经创建好了,把foo.job和bar.job打成zip压缩包,压缩包名字可以任意。该zip包就可以作为附件提交到在3.1步骤中创建的工程中。这时候就会看到我们刚才创建的工作流。 

页面会以层级关系展开工作流的依赖关系,你可以点击执行工作流,那么系统就会先执行foo.job,然后执行bar.job,对于提交上来的工作流,也可以手动触发执行单个job,可以选择依赖执行和单独执行,依赖执行就是把它依赖的job都递归依赖执行。
                                                     

工作流或者作业执行完毕之后都可以通过查看日志看到作业执行的结果。

以上是一个非常简单地例子,当有多层依赖以及多个依赖关系时,要注意一个原则,即依赖关系构成的拓扑图,需要符合DAG(有向无环)原则,否则不能通过系统检查,因为一但构成环,将无法触发执行。另外一个细节,工作流不需要用户自己命名,工作流最终收敛到一个job上,那个没有其它job依赖的作业的名字会自动成为工作流的名字,例如上面bar.job,它依赖foo.job,而没有其它的job依赖它,所以它自动成为工作流的名字。

当有多个依赖关系存在的时候,系统绘制的依赖关系图能清晰地表明作业依赖关系和执行顺序,例如下面这种:

                                                                     
工作流zip包除了封装.job文件,还能添加以.properties结尾的系统配置文件,并且可以通过目录结构建立配置项的作用域,详情参考http://azkaban.github.io/azkaban2/documents/2.1/jobconf.html

3.3、项目权限管理

一个登陆用户对一个项目可以有以下五种权限:

              ADMIN 最高权限,可以胡作非为,包括添加其它用户权限和删除项目。
              READ 查看作业、工作流、和相关日志
              WRITE 上传、修改项目工作流文件。
              EXECUTE 执行、暂停、取消作业。execute, pause, cancel jobs.
              SCHEDULE 添加、修改、删除工作流调度命令。

项目创建者显然拥有对该项目的admin权限,同时它可以向其他用户授权admin权限,这样系统中对一个项目可能有多个admin角色,获得admin角色的用户还可以取消其他人的admin权限,但是不能连自己也取消了。

因为这样就会出现没有没有人能删除的项目。

此外,azkaban默认的用户管理实现方法中还有分组的概念,因此除了可以添加用户对项目的管理权限外,还可以设置属组的权限,这对于多用户的生产环境来讲,无疑是非常有帮助的。

3.4、执行工作流

点击项目的工作流,进入工作流配置状态,一个工作流可以调度执行,即定时执行,也可以立即执行,azkaban功能比较强大,它自动根据工作流的依赖关系绘制工作流的流程图,并且实时采用颜色变化表示各个作业的执行状态,这样整个工作流的执行进度就一目了然。

其中绿色代表成功执行的job,蓝色代表正在执行,红色代表失败,灰色代表还没执行。 
对于执行中的工作流,azkaban可以方便的干预,例如a-b-c-d,任意节点都可以暂停、恢复和取消;对于后续还未执行的节点支持作业修改。这样就极大地方便了错误恢复,断点执行,减少了不必要的作业重跑。

azkaban支持流节点单独执行和依赖执行,假如c节点执行失败,a、b已经成功,就可以独立重跑c,或者修改c的作业之后再重跑(作业本身可以设置作业重试次数),你也可以依赖执行,即重跑a,b。

对于上图中的失败节点,只需要独立重跑myjob2即可,同时图上还会给出失败次数标记,这一点可以帮助你判断你程序的问题,此时很可能需要修改重新提交你的该节点作业程序,然后重跑该节点。 
作业失败、成功提醒功能采用邮件方式,我们也可以自己实现Alert接口添加短信报警功能。执行一个工作流之前,可以对工作做一些非常有用的配置。

通过下面的界面可以添加报警接收人email,同时可以对工作的失败情况作出预案,例如当工作流出现一个失败节点的时候你可以选择没干完的就不要再干了,也可以选择杀掉所有的作业,标记工作流失败,还可以让能干的都尽量干完。

  • Finish Current Running finishes only the currently running jobs. It will not start any new jobs.
  • Cancel All immediately kills all jobs and fails the flow.
  • Finish All Possible will keep executing jobs as long as its dependencies are met. 
    在上图的”Concurrent“一栏,我们可以对正在运行中的工作流作进一步限制,常常有这样的情况,例如我启动了一个工作流,启动之后我不希望有任何人或者我自己的误操作再启动另一个相同的工作流,因为这样可能会产生一些不一致的情况,这时候,就可以通过Concurrent限制系统仅有一个工作流实例。

还有一种情况是我需要连续启动多个相同的工作流,但是我希望一样的工作流能顺序执行,而不是同时执行或者交叠执行,这时可以配置成阻塞式,即等前一个工作流的一个job A干完了我的A job再干,或者前一个工作流A job的所有依赖干完了我的A就能干。

这一点,对整个工作流的管理还是比较细致的,同时最后一个功能Flow Parameters是指对所有job生效的全局配置文件重写,这样可以在启动flow之前方便地更改全局配置,而不用重新上传工作流文件。

3.5、工作流调度

工作流调度就是定时执行的意思,前面说过,一个工作流提交上来之后,可以立即执行,也可以调度执行,即定时执行,看下面的图, 
一个工作流调度时间可以精确到分钟级别,同时可以设置执行频率,一分钟、小时、天、星期、月,可以说它实现了类似crontab的功能。


你可能感兴趣的:(Azkaban调研)