Azkaban是twitter出的一个任务调度系统,操作比Oozie要简单很多而且非常直观,提供的功能比较简单。Azkaban以Flow为执行单元进行定时调度,Flow就是预定义好的由一个或多个可存在依赖关系的Job组成的工作流。Azkaban的官方主页是
http://azkaban.github.io/azkaban2/ ,它的的主要特点有下面几个:
- 兼容所有Hadoop版本(1.x,2.x,CDH)
- 可以通过WebUI进行管理配置,操作方便
- 可以通过UI配置定时调度
- 扩展性好,可针对某一问题开发组件(目前有三个插件HDFSBrowser,JobtypePlugins和HadoopSecurityManager)
- 有权限管理模块
- 可以通过WebUI跟踪Flow或者Job的执行情况
- 可以设置邮件提醒
- 可以为定时Flow或者Flow中的某个Job配置执行时间长度的控制,如果执行时间超过了所设的时间,可以发送警告邮件给相关人员或者Kill掉相应设置的Flow或Job
- 可以重试失败Job
Azkaban也有一些局限性(尚待挖掘),例如任务之间的依赖,不能够指定部分完成(比如我们希望任务A依赖于B,但是并不是B完全执行完成A才可以启动,而是B的某个阶段完成的话就可以启动A)
Azkaban主要是解决Hadoop Job的依赖关系,它包括三个组件,组件之间的关系如下图所示
- Relational Database(MySQL)存储Azkaban和Job的状态信息
- AzkabanWebServer通过WebUI的方式处理对project信息的管理,定时调度和监控
- AzkabanExecutorServer负责根据作业的依赖关系完成作业的解析和调度

安装步骤
首先准备Azkaban相关软件,其中AzkabanWebServer和AzkabanExecutorServer要安装到不同目录,下载链接
http://azkaban.github.io/azkaban2/downloads.html
- azkaban-web-server-2.1.tar.gz
- azkaban-executor-server-2.1.tar.gz
- azkaban-sql-script-2.1.tar.gz
- azkaban-hdfs-viewer-2.1.tar.gz
- azkaban-jobtype-2.1.tar.gz
安装及配置数据库(目前仅支持Mysql)
Azkaban使用MYSQL管理工程、计划和执行
- 安装Mysql 具体安装过程可参考相关资料,比如http://ifalone.me/305.html ,http://dev.mysql.com/doc/index.html
- 为Azkaban创建数据库,其中数据库名字不一定是azkaban
mysql> CREATE DATABASE azkaban;
- 创建Azkaban数据库的用户,其中用户名字不一定是azkaban
mysql> CREATE USER ‘username‘@‘%‘ IDENTIFIED BY ‘password‘;
- 增加azkaban用户对azkaban数据库的增删改查权限
mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON <database>.* to ‘<username>‘@‘%‘ WITH GRANT OPTION;
- 有必要的话可以增加Packet大小,此项限制mysql接受的数据包大小,可以在/etc/my.cnf中配置
[mysqld]
...
max_allowed_packet=1024M
- 配置完重启MYSQL
sudo /sbin/service mysqld restart
- 创建Azkaba需要的数据库表,将azkaban-sql-script-2.1.tar.gz解压,执行create-all-sql脚本即可(其中带有‘_update_’的脚本可以忽视)
- 获取JDBC连接器mysql-connector-java-5.1.25.tar.gz,下载地址http://dev.mysql.com/downloads/connector/j/ 。mysql-connector-java-5.1.25.tar.gz需要在webserver和excutorserver安装完后,分别拷入Azkaban2-web-server-install-dir/extlib和supertool/azkaban/excutorserver/extlib
下载安装Web Server
- 将azkaban-web-server-2.1.tar.gz解压到合适目录,如Azkaban2-web-server-install-dir
解压完应该有如下文件目录
Folder Description
bin 运行 Azkaban jetty server的脚本
conf Azkaban web server的配置文件
lib Azkaban依赖的jar包
extlib 放入到这个目录的jar包会被添加Azkaban的classpath
plugins 插件安装在此目录
web Azkaban web server的相关css,html等文件
- 配置数据库。根据实际情况修改Azkaban2-web-server-install-dir/azkaban.properties文件里如下内容
database.type=mysql
mysql.port=3306
mysql.host=localhost
mysql.database=azkaban
mysql.user=azkaban
mysql.password=azkaban
mysql.numconnections=100
- 配置UserManager。根据实际情况配置azkaban-users.xml相关信息,其中在azkaban.properties里定义了对azkaban-users.xml的引用
user.manager.class=azkaban.user.XmlUserManager
user.manager.xml.file=conf/azkaban-users.xml
- 运行Web Server
在azkaban.properties中如下属性配置jetty的相关行为
jetty.maxThreads=25
jetty.ssl.port=8443
运行前首先要建一个Web Server临时目录,如Azkaban2-web-server-install-dir/tmpdir。然后进入webserver/bin目录,修改azkaban-web-start.sh里的如下内容
tmpdir=Azkaban2-web-server-install-dir/tmpdir
进入webserver根目录执行如下命令,没意外的话正常启动。可通过https:/localhost:8443验证是否启动成功
bin/azkaban-web-start.sh ./
关闭webserver命令如下:
bin/azkaban-web-shutdown.sh ./
下载安装Excutor Server
- 将azkaban-executor-server-2.1.tar.gz解压到合适目录,如Azkaban2-exec-server-install-dir
解压完应该有如下文件目录
Folder Description
bin 启动Azkaban jetty server的脚本
conf Azkaban exec server的相关配置文件
lib Azkaban依赖的jar包
extlib 放入到这个目录的jar包会被添加Azkaban的classpath
plugins 插件安装在此目录
- 配置数据库。根据实际情况修改Azkaban2-exec-server-install-dir/azkaban.properties文件里如下内容
database.type=mysql
mysql.port=3306
mysql.host=localhost
mysql.database=azkaban
mysql.user=azkaban
mysql.password=azkaban
mysql.numconnections=100
- 配置AzabanWebServer和AzkabanExecutorServer客户端
在AzkabanExecutorServer的azkaban.properties里做如下配置:
# Azkaban Executor settings
executor.maxThreads=50
executor.port=12321
executor.flow.threads=30
在AzkabanWebServer的azkaban.properties里做如下配置:
executor.port=12321
这个配置需要重启Server才能生效
- 运行Excutor Server
运行前首先要建一个Excutor Server临时目录,如supertool/azkaban/excutorserver/tmpdir。然后进入excutorserver/bin目录,修改azkaban-web-start.sh里的如下内容
tmpdir=supertool/azkaban/excutorserver/tmpdir
进入excutorserver根目录执行如下命令,没意外的话正常启动
bin/azkaban-exec-start.sh ./
关闭运行如下命令
bin/azkaban-exec-shutdown.sh
安装Azkaban插件

- 建立一个简单的可以进行定时调度的job
Azkaban启动后可以使用浏览器访问站点的8443端口,进入站点后可以进行project增删改查等相关操作。下面以创建一个简单的Job举例,比如创建foo.job
# foo.job
type=command
command=echo "Hello World"
将foo.job压缩成zip格式。然后在web页面创建工程并将foo.zip上传到foo对应工程中,如下图所示

配置完成后可以立即执行此project,也可以设置定时执行,定时配置如下示例如下图。目前时间只能按照UTC和PDT两种时区输入,也就是说要根据当地时间先算UTC时间然后再输入(比如CST-8=UTC,github上已经将此情况列为bug,但是还没修复)。

- 建立一个有依赖关系的job
分别建立foo和bar两个job,其中bar依赖foo。将两个job压缩到一个zip里就生成了一个简单的flow project,其中foo失败后的动作可选,具体可参考http://azkaban.github.io/azkaban2/documents/2.1/executingflow.html 。
#foo.job
type=command
command=echo foo
#bar.job
type=command
dependencies=foo
command=echo bar
- 建立一个HadoopJava类型的Job,主要流程是先把写好的Java程序打成Jar包,然后配置**.job文件,最后将Jar包和**.job压缩到zip文件中上传。一个打包好的有依赖关系的zip包示例http://redmine.mzsvn.com/attachments/download/398/java-hadooptest-de.zip
首先修改Azkaban2-exec-server-install-dir/plugins/jobtypes/common.properties
hadoop.home=hadoop.home=/home/workspace/hadoop-*.*.*
然后修改Azkaban2-exec-server-install-dir/plugins/jobtypes/commonprivate.properties
jobtype.global.classpath=${hadoop.home}/hadoop-core-*.*.*.jar,${hadoop.home}/conf,${hadoop.home}/lib/*
一个示例Job如下,其中wc.properties(可选,非必须)描述了此Job的变量信息,wordcount.job描述了此Job的主要配置信息
#wc.properties
HDFSRoot=/test
param.inData=${HDFSRoot}/input
param.outData=${HDFSRoot}/output
#wordcount.job
type=hadoopJava
job.class=azkaban.jobtype.examples.java.WordCount
classpath=./lib/*
main.args=${param.inData} ${param.outData1}
force.output.overwrite=true
input.path=${param.inData}
output.path=${param.outData}
- 邮件的使用首先需要修改Azkaban2-web-server-install-dir/conf/azkaban.properties,示例如下
# mail settings
mail.sender=******@miaozhen.com
mail.host=smtp.miaozhen.com
mail.user=******@miaozhen.com
mail.password=******
然后需要根据每个Job的情况配置合适的邮件通知列表,示例如下
# foo.job
type=command
command=echo "Hello World"
notify.emails=******@miaozhen.com
failure.emails=******@miaozhen.com
success.emails=******@miaozhen.com
- Azkaban的SLA使用
Azkaban可以为定时Flow或者Flow中的某个Job设置SLA服务,如果执行时间超过了所设的时间,可以发送警告邮件给相关人员或者Kill掉相应设置的Flow或Job,示例如下图。

- Azkaban的接口调用
Azkaban对外提供了Ajax接口,此类接口可通过包装get或者post请求调用。API使用时需要先获取SessionId(默认有效期一天),然后才可以做其他操作。其中获取Session到执行Job的过程示例如下
获取Session命令:
curl -k --data "action=login&username=azkaban&password=azkaban" https://localhost:8443
命令返回结果:
{
"status" : "success",
"session.id" : "5a932706-3d04-4c44-888d-5afcd87b8ebe"
}
创建一个Project命令:
curl -k --data "action=create&name=azkaban&description=dis&session.id=5a932706-3d04-4c44-888d-5afcd87b8ebe" https://localhost:8443/manager
命令返回结果:
{"status":"success","path":"manager?project=azkaaban","action":"redirect"}
上传打包好的zip压缩包命令:
curl -k -i -H "Content-Type: multipart/mixd" -X POST --form ‘session.id=5a932706-3d04-4c44-888d-5afcd87b8ebe‘ --form ‘ajax=upload‘ --form ‘file=@foo.job.zip;type=application/zip‘ --form ‘project=MyProject;type/plain‘ https://localhost:8443/manager
命令返回结果:
HTTP/1.1 100 Continue
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 43
Server: Jetty(6.1.26)
{
"projectId" : "42",
"version" : "1"
}
执行Flow命令:
curl -k --data "ajax=executeFlow&project=azkaban&flow=foo&session.id=5a932706-3d04-4c44-888d-5afcd87b8ebe" https://localhost:8443/executor
命令返回结果:
{
"message" : "Execution submitted successfully with exec id 70",
"project" : "azkaban",
"flow" : "foo",
"execid" : 70
}