在大数据繁杂的ETL或其它数据处理过程当中,有些任务是需要定时执行的,虽然Linux自带了cron命令功能,但是仍不能满足最大的一点就是它不能提供集中式的管理和可视化的编辑。其实在大数据的生态当中已集成有个定时调度框架Oozie,只是实践下来发现其学习成本不低,布署的过程也较复杂。在尝试过其它分布工调度框架后(如阿里的宙斯Zeus),还是选择了社区较多人使用的Azkaban。
Azkaban3相对于上个版本所做的更改还是比较大的,感兴趣的话可以到其官方网站 Azkaban 了解下。接下来主要还是分享下Azkaban3的安装布署,下面是Azkaban3的系统架构设计图:

图中的3个组件便是Azkaban3的重要组成部分:
建议使用MySQL5.6及以上版本的数据库,首先创建一个名为azkaban的数据库:
1 | mysql> CREATE DATABASE azkaban DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; |
|---|
指定某个数据库用户,为其赋予对azkaban数据库具有SELECT,INSERT,UPDATE,DELETE的操作权限:
1 | mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON azkaban.* to 'azkaban-dba'@'%' WITH GRANT OPTION; |
|---|
最后就是导入创建表的SQL语句,官方提供的建表语句比较分散,为此特地整理了份完整的建表语句 Azkaban Create Tables 密码: 8ne8 :
1 | mysql> source /opt/download/azkaban-create-tables.sql |
|---|
注意:由于
Azkaban3的项目发布是通过上传文件实现的,因此需要把MySQL中允许上传包大小的能数调整下,此参数位于[mysqld]下:max_allowed_packet=64M,根据实际情况修改适合大小。其实有个办法可做到不修改此参数 ,就是打包
Azkaban项目时尽量不要包依赖文件放进来,通过相对路径的引用即可。
Web Server目录下有7个文件夹,描述如下:
文件夹 | 描述 |
|---|---|
bin | 脚本相关文件,如启动,停止Jetty服务 |
conf | Solo服务的配件文件 |
lib | Web Server必须的依赖包库 |
extlib | 第三方扩展依赖包 |
plugins | Azkaban插件安装位置 |
web | Web Server的文件,如css,js, html等 |
Web Server的布署需要修改至少4处地方,具体如下:
azkaban.properties配置 官方默认的配置文件中缺少了多执行器的参数设置,参考如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | # Azkaban Personalization Settings # 站点名称,中文可用UTF-8编码,不过邮件通知不支持 azkaban.name=Azkaban azkaban.label=Production Environment azkaban.version=3.25 azkaban.color=#FF3601 azkaban.default.servlet.path=/index web.resource.dir=web/ default.timezone.id=Asia/Shanghai # Azkaban UserManager class user.manager.class=azka ban.user.XmlUserManager user.manager.xml.file=conf/azkaban-users.xml # Loader for projects executor.global.properties=conf/global.properties azkaban.project.dir=projects # DB settings database.type=mysql mysql.port=3306 mysql.host=127.0.0.1 mysql.database=azkaban mysql.user=azkaban-dba mysql.password=12345678 mysql.numconnections=100 # Velocity dev mode velocity.dev.mode=false # Azkaban Jetty server properties. jetty.hostname=localhost jetty.use.ssl=false jetty.maxThreads=25 jetty.port=8081 # Azkaban Executor settings executor.port=12321 # Notification Email Settings mail.sender=elkan1788@gmail.com mail.host=stmp.gmail.com mail.user=elkan1788@gmail.com mail.password=12345678 lockdown.create.projects=false cache.directory=cache # JMX stats jetty.connector.stats=true executor.connector.stats=true # Azkaban plugin settings azkaban.jobtype.plugin.dir=plugins/jobtypes # Multiple executors settings azkaban.use.multiple.executors=true azkaban.executorselector.filters=StaticRemainingFlowSize,CpuStatus azkaban.executorselector.comparator.NumberOfAssignedFlowComparator=1 azkaban.executorselector.comparator.Memory=1 azkaban.executorselector.comparator.LastDispatched=1 azkaban.executorselector.comparator.CpuUsage=1 |
|---|
azkaban-users.xml配置 Azkaban采用的是类似Spring Securit的账户信息配置,参考如下:
1 2 3 4 5 6 7 8 9 | <azkaban-users> <!-- UserAccount Info --> <user groups="azkaban" password="azkaban" roles="admin" username="azkaban"/> <user password="metrics" roles="metrics" username="metrics"/> <!-- Role Info --> <role name="admin" permissions="ADMIN"/> <role name="metrics" permissions="METRICS"/> </azkaban-users> |
|---|
log4j.properties配置 官方默认的配置文件中只配置了终端的输出,通过Shell脚本重定向形成日志输出,而log4j本身是支持按日期增量管理的,参考如下:
1 2 3 4 5 6 7 8 9 10 11 12 | log4j.rootLogger=INFO,C,file log4j.appender.C=org.apache.log4j.ConsoleAppender log4j.appender.C.Target=System.err log4j.appender.C.layout=org.apache.log4j.PatternLayout log4j.appender.C.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n log4j.appender.file=org.apache.log4j.DailyRollingFileAppender log4j.appender.file.File=/opt/azkaban3/web-server/logs/web-server.log log4j.appender.file.DatePattern='.'yyyy-MM-dd log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p [%t](%F:%L) - %m%n |
|---|
官方默认提供启停脚本并不太友好,稍稍做了些许修改,参考如下:
1 2 3 4 5 | !/bin/bash # 官方默认 # bin/azkaban-web-start.sh "$@" >> logs/webServerLog_`date +%Y%m%d`.out 2>&1 & bin/azkaban-web-start.sh > /dev/null 2>&1 & |
|---|
1 2 3 4 | !/bin/bash # 官方默认 # bin/azkaban-web-shutdown.sh "$@" >> logs/webServerLog_`date +%Y%m%d`.out 2>&1 & bin/azkaban-web-shutdown.sh > /dev/null 2>&1 & |
|---|
可以把一些公共的配置统一放到conf/global.properties配置中统一管理,如项目执行成功,失败的通知人电子邮件,默认的执行类型等等。
Executor Server与Web Server相比就只是少了个plugins目录,描述如下:
文件夹 | 描述 |
|---|---|
bin | 脚本相关文件,如启动,停止Jetty服务 |
conf | Solo服务的配件文件 |
lib | Executor Server必须的依赖包库 |
extlib | 第三方扩展依赖包 |
plugins | Azkaban插件安装位置 |
原则上建议一台机器上只布署一个Executor Server节点,因为在节点启动的时候它会自动加入到数据库executors列表中,当然也是可以通过端口干预的方法来配置本地伪分布模式布署。
Executor Server布署相对简单多了,只要更新3处即可,具体如下:
azkaban.properties配置 只需要修改下官方默认配置文件的值即可,参考如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | # Azkaban Personalization Settings default.timezone.id=Asia/Shanghai # Loader for projects executor.global.properties=conf/global.properties azkaban.project.dir=projects # DB settings database.type=mysql mysql.port=3306 mysql.host=127.0.0.1 mysql.database=azkaban mysql.user=azkaban-dba mysql.password=12345678 mysql.numconnections=100 # Velocity dev mode velocity.dev.mode=false # Azkaban Executor settings executor.host=127.0.0.1 executor.port=12321 executor.maxThreads=50 executor.flow.threads=30 # JMX stats jetty.connector.stats=true jetty.host=127.0.0.1 executor.connector.stats=true # Azkaban plugin settings azkaban.jobtype.plugin.dir=plugins/jobtypes |
|---|
log4j.properties配置 参考上面的Web Server中的配置即可,注意修改日志文件的输出路径。
同样的对启停脚本做了些更改,方便后期日志的回放,参考如下:
1 2 3 4 5 6 7 | #!/bin/bash export HADOOP_HOME=/opt/hdp/2.3.2.0-2950/hadoop # pass along command line arguments to azkaban-executor-start.sh script # bin/azkaban-executor-start.sh "$@" >> logs/executorServerLog_`date +%Y%m%d`.out 2>&1 & bin/azkaban-executor-start.sh > /dev/null 2>&1 & |
|---|
1 2 3 4 5 6 7 | #!/bin/bash export HADOOP_HOME=/opt/hdp/2.3.2.0-2950/hadoop # pass along command line arguments to azkaban-executor-start.sh script # bin/azkaban-executor-shutdown.sh "$@" >> logs/executorServerLog_`date +%Y%m%d`.out 2>&1 & bin/azkaban-executor-shutdown.sh > /dev/null 2>&1 & |
|---|
至此Azkaban3运行所需要的关键配置已经配置好,接下就是启动相应的服务预览下劳动成果。
启动顺序如下:
Executor Server服务: sh bin/start-exec.shexcecutors表中找到executor server hostname对应的记录,把最后一列active 的值更新为 1Web Server服务:sh bin/start-web.sh注意:启动前请确定端口正常未占用,另外留意内存的使用情况。
启动成功后,在浏览器中输入http://localhost:8081便可看到Web Server的界面,如下图所示:


在上述启动成功的Web Server中创建中新的项目,命名为:ShellJob-Demo,然后把下面示例Job下载并上传至刚才创建好的项目中,注意不需要解压哦。然后在项目中找到Exectue Flow按钮,然后不断的下一步即可,如下图组所示:




Azkaban3是通过Web Server把任务(Job)提交到Executor Server执行的,因此在界面上是不能直观的看到程序执行过程,但可以通过执行列表中找到正在运行的任务,查看其日志的方式来了解运行过程,如下图组所示:


好啦,至此Azkaban3的服务布署及简单示例便完成收工,是不是相对而言比较简单呢。初步阶段来看Azkaban3的使用还是可以贴合业务的场景使用,只是后面提升过程发现它自身也并不完善,比如在上面启动过程中需要手动去更新数据库才能激活Executor Server(只是首次启动时),另外官方并未提供Executor Server运行的管理,分布式运行时需要手动指定Executor Server的ID 等等。但是基本上还是可以满足日常的使用,特别是它的Job Flow设计。最后要是关于Azkaban3有问题可评论中一起讨论,后续也会更新相关的使用教程,敬请关注。