介绍css
Azkaban是twitter出的一个任务调度系统,操做比Oozie要简单不少并且很是直观,提供的功能比较简单。Azkaban以Flow为执行单元进行定时调度,Flow就是预约义好的由一个或多个可存在依赖关系的Job组成的工做流。Azkaban的官方主页是http://azkaban.github.io/azkaban2/ ,它的的主要特色有下面几个:html
- 兼容全部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)java
Azkaban主要是解决Hadoop Job的依赖关系,它包括三个组件,组件之间的关系以下图所示mysql
- Relational Database(MySQL)存储Azkaban和Job的状态信息
- AzkabanWebServer经过WebUI的方式处理对project信息的管理,定时调度和监控
- AzkabanExecutorServer负责根据做业的依赖关系完成做业的解析和调度
-
安装步骤git
首先准备Azkaban相关软件,其中AzkabanWebServer和AzkabanExecutorServer要安装到不一样目录,下载连接http://azkaban.github.io/azkaban2/downloads.htmlgithub
- 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)web
Azkaban使用MYSQL管理工程、计划和执行ajax
- 安装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 Serversql
- 将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等文件
- 获取SSL须要的keystore。此处尤为注意要用java的keytool工具,否则会报错(PATH最好将新填的内容放在旧的前面,如PATH=$JAVA_HOME/bin:......:${PATH})
- 证书制做可参考http://wingware.iteye.com/blog/1160396 ,http://docs.codehaus.org/display/JETTY/How+to+configure+SSL
- keytool -keystore keystore -alias jetty -genkey -keyalg RSA
- 示例以下
- keytool -keystore keystore -alias jetty -genkey -keyalg RSA
Enter keystore password: password
What is your first and last name?
[Unknown]: jetty.mortbay.org
What is the name of your organizational unit?
[Unknown]: Jetty
What is the name of your organization?
[Unknown]: Mort Bay Consulting Pty. Ltd.
What is the name of your City or Locality?
[Unknown]:
What is the name of your State or Province?
[Unknown]:
What is the two-letter country code for this unit?
[Unknown]:
Is CN=jetty.mortbay.org, OU=Jetty, O=Mort Bay Consulting Pty. Ltd.,
L=Unknown, ST=Unknown, C=Unknown correct?
[no]: yes
Enter key password for <jetty>
(RETURN if same as keystore password): password
- 成功获得keystore文件后,根据实际状况修改azkaban.properties文件里以下内容
- jetty.keystore=keystore
jetty.password=password
jetty.keypassword=password
jetty.truststore=keystore
jetty.trustpassword=password
- 配置数据库。根据实际状况修改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插件
- HDFS Viewer插件
- 修改Azkaban2-web-server-install-dir/conf/azkaban.properties:
- viewer.plugins=hdfs
- Azkaban 会从以下地址加载hdfs viewer插件:
- Azkaban2-web-server-install-dir/plugins/viewer/hdfs
- 将azkaban-hdfs-viewer-2.1.tar.gz解压到Azkaban2-web-server-install-dir/plugins/viewer并将目录重命名为hdfs
- *若是hadoop没有启动安全机制,重启AzkabanWebServer 便可使用hdfs插件。若是hadoop启动了安全机制,则须要修改Azkaban2-web-server-install-dir/plugins/viewer/hdfs/conf/plugin.properties里的以下配置:
- Parameter Description
azkaban.should.proxy Wether Azkaban should proxy as another user to view the hdfs filesystem, rather than Azkaban itself, defaults to true
hadoop.security.manager.class The security manager to be used, which handles talking to secure hadoop cluster, defaults to azkaban.security.HadoopSecurityManager_H_1_0 (for hadoop 1.x versions)
proxy.user The Azkaban user configured with kerberos and hadoop. Similar to how oozie should be configured, for secure hadoop installations
proxy.keytab.location The location of the keytab file with which Azkaban can authenticate with Kerberos for the specified proxy.user
- Job Type插件
- 修改Azkaban2-exec-server-install-dir/conf/azkaban.properties :
- azkaban.jobtype.plugin.dir=plugins/jobtypes
- Azkaban 会从以下地址加载全部的job types插件:
- Azkaban2-exec-server-install-dir/plugins/jobtypes
- 将azkaban-jobtype-2.1.tar.gz解压到Azkaban2-exec-server-install-dir/plugins/并将目录重命名为jobtypes
- 若是hadoop没有启动安全机制,只须要修改Azkaban2-exec-server-install-dir/plugins/jobtypes/commonprivate.properties中以下配置:
- Parameter Description
hadoop.home Your $HADOOP_HOME setting.
jobtype.global.classpath The cluster specific hadoop resources, such as hadoop-core jar, and hadoop conf (e.g. ${hadoop.home}/hadoop-core-1.0.4.jar,${hadoop.home}/conf)
- 若是hadoop启动了安全机制,则须要修改Azkaban2-exec-server-install-dir/plugins/jobtypes/commonprivate.properties中以下配置:
- Parameter Description
hadoop.security.manager.class The security manager to be used, which handles talking to secure hadoop cluster, defaults to azkaban.security.HadoopSecurityManager_H_1_0 (for hadoop 1.x versions)
proxy.user The Azkaban user configured with kerberos and hadoop. Similar to how oozie should be configured, for secure hadoop installations
proxy.keytab.location The location of the keytab file with which Azkaban can authenticate with Kerberos for the specified proxy.user
hadoop.home Your $HADOOP_HOME setting.
jobtype.global.classpath The cluster specific hadoop resources, such as hadoop-core jar, and hadoop con (e.g. ${hadoop.home}/hadoop-core-1.0.4.jar,${hadoop.home}/conf)
使用说明及举例。Job具体可配置信息可参看http://azkaban.github.io/azkaban2/documents/2.1/jobconf.html
- 创建一个简单的能够进行定时调度的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 }