这篇文章将为大家详细讲解有关Azkaban是什么 ,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
1、Azkaban是什么
我们在工作中应该都遇到过这样的场景:有一个任务,这个任务可以划分成多个较小的任务完成,之所以进行划分是因为小任务之间可以并发的进行,例如是一个shell脚本执行的命令吧,大任务A可以划分成B、C、D、E四个子任务(脚本)完成,而B和C是可以同时进行的,D依赖B和C的输出,E又依赖D的输出,于是我们一般的做法可能就是开两个终端同时执行B和C,等两个都执行完成之后再执行D,接着在执行E。整个执行的过程都需要我们参与,但是整个的执行过程类似一个有向无环图,每一个子任务的执行可以看作整个任务的一个流,我们可以同时从没有入度的节点开始执行,任何没有流向(两个节点之间没有通路)关系节点都可以并行得执行,人为的控制难免就有点力不从心了(因为很多任务都需要在深夜执行,一般我们都是写脚本并设置cron),这时候我们需要的就是一个工作流调度器。 Azkaban就是完成这种任务的(其实主要还是用于对hadoop生态圈的任务的支持),它是由Linkedin实现并开源的,主要用于在一个工作流内以一个特定的顺序运行一组工作和流程,它的配置是通过简单的key:value对的方式,通过配置中的dependencies来设置依赖关系,这个依赖关系必须是无环的,否则会被视为无效的工作流。 Azkaban有如下功能特点:
-
Web用户界面
-
方便上传工作流
-
方便设置任务之间的关系
-
调度工作流
-
认证/授权(权限的工作)
-
能够杀死并重新启动工作流
-
模块化和可插拔的插件机制
-
项目工作区
-
工作流和任务的日志记录和审计
我觉得这些都是一些主流的工作流调度器应该支持的功能,我觉得azkaban的web页面做得比较好,这样可以大大降低管理成本,它支持的任务调度类型是基于插件的,这也就使得我们可以实现自己的插件来完成特定的需求。另外,它还能够在任务完成、失败、成功的时候发送email,支持SLA设置等功能,总体来说,功能还是很强大的。
2、安装部署
azkaban分为三个组建:mysql服务器、web服务器和executor服务器,其中mysql用于存储一些项目以及执行计划(所有任务的属性信息、执行计划、执行的结果以及输出),每次执行情况等信息;web服务器使用Jetty对外提供web服务,是用户可以通过web页面方便的管理;执行服务器是负责具体的工作流的提交,执行,可以启动多个执行服务器,它们通过mysql数据库来协调任务的执行。
首先需要从官网上下载各个模块,都是二进制的安装包格式,当然也可以使用源码编译,下载地址:http://azkaban.github.io/downloads.html 接下来的安装过程可以参考:http://blog.javachen.com/2014/08/25/install-azkaban/ 因为web客户端是通过https的方式进行访问的,所以这里需要创建一个keystore证书文件,使用命令:keytool -keystore keystore -alias jetty -genkey -keyalg RSA,按照提示输入需要的信息,最后输入的”输入 <jetty> 的密钥口令“可以和密钥库口令一样,并且需要在web服务器的配置文件azkaban.properties中修改Jetty服务器的属性,其中 jetty.keystore=keystore jetty.password=redhat jetty.keypassword=redhat jetty.truststore=keystore jetty.trustpassword=redhat 设置为你生成的证书文件的信息。接着就可以在浏览器中输入https://ip:8443访问azkaban了(登录的用户名和密码是在web服务器的user配置文件中设置的,这里我们使用的是admin)。
3、测试
这里我们进行简单的测试,由于azkaban原生是支持shell命令(所以也就可以支持shell脚本以及python等其他脚本程序)的,所以可以使用简单的shell命令进行测试,我们创建4个子任务,每一个子任务的配置都是任务名.job文件。它们的配置如下: test.job
type=command
command=sleep 3
command.1=echo "Hello World"
start.job
type=command
command=sleep 5
command.1=echo "start execute"
sleep.job
type=command
dependencies=test, start
command=sleep 10
finish.job
type=command
dependencies=sleep
command=echo "finish" 这里通过dependencies属性来标识该任务依赖的任务,可以有一个或者多个,通过","分割,这些任务的type都是command,azkaban也支持其它类型的命令类型,有些需要安装插件才能支持。 然后我们将这四个job文件放在一个目录下压缩成一个zip文件,在Azkaban的web界面的首页可以通过”Create Project“按钮来创建新的一个工作流,输入必要的信息之后会进入到project界面,我们可以通过upload上传我们要执行的任务流,可以重复upload进行覆盖。但是之前的任务流的执行结果不会被覆盖。如果工作流的配置有问题(例如出现相互依赖),上传会不成功,但是没有看到提示。等待压缩文件上传成功之后,我们可以通过界面查看各个任务的依赖关系图:
可以通过”Execute Flow“按钮来启动一个工作流的一次执行,点击之后会进入配置界面,包括其中包括”Flow View“、”Notification“、”Failure Options“、”Concurrent“、”Flow Parameters“,另外还需要注意的是左下角的Schedule按钮,这里可以设置工作流的定时执行。注意,这里是每一次工作流执行的时候都需要设置的,目前没有看到保存历史设置的情况,当然如果希望重复之前执行的一次设置的话可以找到之前的那次执行,然后再次运行(这时候还是需要进入配置页面,但是会保存那次运行的配置)。其中需要注意的是在”Failure Options“和”Concurrent“中的配置,他们分别配置了在工作流中一个任务执行失败之后的处理和这个project的多次执行流(多次Execute)如果存在并行时的处理。我们在这里不进行配置,直接执行命令: 提交之后会提示本次执行的id(我觉得这里通过一个可识别的字符串进行标示会更好一些),这个id是全局唯一的,也就是说多个project的每一次执行都会递增得到新的exec id。 执行完成之后,可以通过web界面查看每一个任务流的执行结果以及每一个子任务的执行结果。
在Graph标签下可以查看每一个任务执行的情况、当前执行到哪一个任务了,Flow Log中会实时得输出工作流的运行日志,点击每一个子任务可以查看子任务的运行状态以及实时输出的日志信息,总体来说还是非常方便的。
这里涉及的几个概念:project、flow和job,首先一个project是一个要执行任务的整体,它可以包含多个flow,每一个project可以上传一个.zip的文件,flow之间是相互独立的,但是有一个总的flow,这个flow可能引用其他的flow作为它执行的一部分(相当于总flow的一个子job,但是这个job是一个flow)。每一个flow包含多个job,这些job是相互独立的,通过job文件中dependencies设置依赖关系,每一个flow的结束job可以作为这个flow的标识(flow名),我们可以通过这样的方式将一个flow作为一个job加入到另外的flow中: jobGroup.job type=flow
flow.name=finish
dependencies=realStart finish是之前定义的flow的标识(因为它是终止job),这个flow作为一个job可以设置其他的依赖关系,下面是一个包含子flow的任务依赖图:
我觉得之所以要设计成这样是为了将每个flow独立出来,方便flow的重用。
4、用户管理
azkaban中有用户和用户组的概念,用户和用户组以及权限的配置信息保存在配置文件azkaban-users.xml中,认证的方式是由azkaban.user.XmlUserManager来实现的,具体的配置可以在azkaban.properties(web服务器的conf下)进行配置:
Parameter | Default |
---|---|
user.manager.class | azkaban.user.XmlUserManager |
user.manager.xml.file | azkaban-users.xml |
我们在azkaban-users.xml可以配置三类内容:user、group和role,user项可以配置username、password、roles、group信息,分别配置用户名、密码、用户的权限以及所属的组;group项可以配置name和roles,分别用于配置组名和这个组使用的权限;role定义了权限信息,可以配置name和permissions,分别表示规则名和赋予的权限信息。azkaban支持的权限包括:
Permissions | Values |
---|---|
ADMIN | 可以做任务事情,包括给其他用户添加、修改权限 |
READ | 只能访问每一个project的内容和日志信息 |
WRITE | 可以在已创建的project上传、修改任务的属性,可以删除任何的project |
EXECUTE | 允许用户执行任何的任务流 |
SCHEDULE | 允许用户添加、删除任何任务流的调度信息 |
CREATEPROJECTS | 在禁止创建project的情况下仍允许创建新的project |
这里的权限设置没有细化到每一个user在每一个project中,每一个用户所拥有的权限可以在每一个project下面执行相同的操作,另外用户和用户组之间的权限信息还不是很明确,如果使用用户组作为权限的分配单位(即一个用户组下的所有用户拥有相同的权限),每个用户再次指定权限就有点多余了。
关于“Azkaban是什么 ”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/230386.html