最新版Azkaban3.90介绍及安装
1 Azkaban介绍
大数据业务处理场景中,经常有这样的分析场景:
A 任务:将收集的数据通过一系列的规则进行清洗,然后存入 Hive 表 a 中。
B 任务:将 Hive 中已存在的表 b 和表 c 进行关联得到表 d 。
C 任务:将 A 任务中得到的表 a 与 B 任务中得到的表 d 进行关联得到分析的结果表e 。
D 任务:最后将 Hive 中得到的表 e 通过 sqoop 导入到关系型数据库 MySQL 中供web 端查询使用。
显然,以上任务 C 依赖于任务 A 与任务 B 的结果,任务 D 依赖于任务 C 的结果。我们一般的做法可以打开两个终端分别执行任务 A 与任务 B ,当任务 A 与任务 B 执行完成之后再执行任务 C ,当任务 C 执行完成之后再执行任务 D 。整个任务流程中必须保证任务A 、任务 B 执行完成之后执行任务 C ,然后再执行任务 D 。这样某一个环节都离不开人工的参与,需要时刻盯着各任务的执行进度,非常费力。
以上业务场景就是一个大的任务,任务中分为四个子任务 A 、 B 、 C 、 D ,如果能有一个任务调度器给我们自动实现执行任务 A ,执行任务 B ,然后再执行任务 C ,最后执行任务D ,那么就不需要人工时刻盯着任务是否执行完成,是否该开启下一个任务。 Azkaban 就是这样一个工作流的调度器,可以解决以上场景问题。
2 Azkaban 的安装
2.1 Azkaban 由三个关键组件
Azkaban 是一个批量工作流调度器,底层是使用 java 语言开发,用于在一个工作流内以一定的顺序运行一组任务和流程,并且提供了非常方便的 webui 界面来监控任务调度的情况,方便我们来管理流调度任务。
Azkaban 由三个关键组件组成:
- AzkabanWebServer:
主要负责项目管理、用户登录权限认证、定时执行工作任务、跟踪提交任务执行的流程、访问历史执行任务、保存执行计划的状态。 - AzkabanExecutorServer:主要负责工作流程的提交、执行、检索和更新当前正在执行计划的数据,处理执行计划的日志。
- 关系型数据库:
主要是保存工作流中的原数据信息。
下面,让我们从零开始搭建一个 Azkaban 任务流调度系统。
2.2 安装Azkaban
https://github.com/azkaban/azkaban/releases
2.2.1 环境准备
在 Linux 中安装 Azkaban ,系统中需要安装好 jdk,MySQL ,这里选择的是 jdk8和 MySQL5.1 版本。除此之外,还需要安装 git , git 是一个开源的分布式版本控制系统,一般在项目版本控制中会使用 git 控制,这里安装 Azkaban 需要 git 是因为需要通过 git 构建依赖包。
安装git:
yum -y install git
2.2.2 安装 Azkaban
- 上传下载好的 azkaban ,解压到 /opt/azkaban-temp 文件夹
[root@mynode5 software]# tar -zxvf ./azkaban-3.90.0.tar.gz
[root@mynode5 software]# mv ./azkaban-3.90.0 azkaban-temp
- 进入 azkaban-temp 目录,进行编译
[root@node4 azkaban]# ./gradlew distTar
...
BUILD SUCCESSFUL in 4m 6s
54 actionable tasks: 40 executed, 14 from cache
注意:编译过程中有可能由于网络延时造成编译时失败,可以多重试几次解决此问题。
3. 新建 azkaban 目录,将编译好的文件复制到此目录下
[root@node4 software]# mkdir ./azkaban
[root@node4 software]# cd azkaban
[root@node4 azkaban]# cp /software/azkaban-temp/azkaban-
db/build/distributions/azkaban-db-0.1.0-SNAPSHOT.tar.gz
/software/azkaban4.
[root@node4 azkaban]# cp /software/azkaban-temp/azkaban-web-
server/build/distributions/azkaban-web-server-0.1.0-SNAPSHOT.tar.gz
/software/azkaban
[root@node azkaban]# cp /software/azkaban-temp/azkaban-exec-
server/build/distributions/azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz
/software/azkaban
- 在 azkaban 目录下解压各个编译好的压缩包,重新命名
[root@node4 azkaban]# tar -zxvf azkaban-db-0.1.0-SNAPSHOT.tar.gz
[root@node4 azkaban]# tar -zxvf azkaban-web-server-0.1.0-
SNAPSHOT.tar.gz
[root@node4 azkaban]# tar -zxvf azkaban-exec-server-0.1.0-
SNAPSHOT.tar.gz
[root@node4 azkaban]# mv azkaban-db-0.1.0-SNAPSHOT azkaban-db
[root@node4 azkaban]# mv azkaban-web-server-0.1.0-SNAPSHOT azkaban-
web
[root@node4 azkaban]# mv azkaban-exec-server-0.1.0-SNAPSHOT azkaban-
exec
至此,经历了 Azkaban 的下载、编译, Azkaban 安装基本准备工作已经完成,下一步就是配置 Azkaban ,将 Azkaban 运行起来。
2.2.3 导入数据库
运行 Azkaban 基本的原数据信息库,在编译好的 azkaban-db 中就有基本的库信息,需要将这些数据导入到关系型数据库中,这里就是导入 MySQL 数据库中 , 导入的MySQL 数据库可以和当前 Azkaban 安装在同一节点上,也可以安装在不同的节点上,笔者的 Azkaban 安装在 node4 节点上, MySQL 数据库安装在 node1 节点上。
- 登录 mysql 数据库,创建 azkaban 数据库
[root@mynode2 ~]# mysql -u root -p
mysql> create database azkaban default character set latin1;
注意:这里创建 azkaban 时建议使用 latin1 编码,因为索引太长, utf8 编码格式不支持,最高支持 1000 。
2. 准备 sql 文件
将 node4 节点上 /software/azkaban/azkaban-db 目录下的 create-all-sql-0.1.0-SNAPSHOT.sql 复制到 node1 节点 /software/test 目录下。
[root@node4 azkaban-db]# scp /software/azkaban/azkaban-db/create-all-
sql-0.1.0-SNAPSHOT.sql
[root@node4:/software/test create-all-sql-
0.1.0-SNAPSHOT.sql 100% 12KB 11.8KB/s 00:00
- 向 MySQL 中导入数据库
mysql> use azkaban;
mysql> source /software/test/create-all-sql-0.1.0-SNAPSHOT.sql
- 检查导入的数据库表
mysql> show tables;
2. +--------------------------+
3. | Tables_in_azkaban |
4. +--------------------------+
5. | QRTZ_BLOB_TRIGGERS |
6. | QRTZ_CALENDARS |
7. | QRTZ_CRON_TRIGGERS |
8. | QRTZ_FIRED_TRIGGERS |
9. | QRTZ_JOB_DETAILS |
10. | QRTZ_LOCKS |
11. | QRTZ_PAUSED_TRIGGER_GRPS |
12. | QRTZ_SCHEDULER_STATE |
13. | QRTZ_SIMPLE_TRIGGERS |
14. | QRTZ_SIMPROP_TRIGGERS |
15. | QRTZ_TRIGGERS |
16. | active_executing_flows |
17. | active_sla |
18. | execution_dependencies |
19. | execution_flows |
20. | execution_jobs |
21. | execution_logs |
22. | executor_events |
23. | executors |24. | project_events |
25. | project_files |
26. | project_flow_files |
27. | project_flows |
28. | project_permissions |
29. | project_properties |
30. | project_versions |
31. | projects |
32. | properties |
33. | triggers |
34. +--------------------------+
2.3 配置运行 Azkaban
2.3.1 创建 ssl 配置
HTTP 的全称 是 Hypertext Transfer Protocol Vertion (超文 本传输协议), HTTPS 的全称是 Secure Hypertext Transfer Protocol (安全超文本传输协议), HTTPS 基于 HTTP 开发,使用安全套接字层 (SSL) 进行信息交换,简单来说它是HTTP 的安全版。 Azkaban 支持安全的 https 访问,但是需要创建 ssl 配置。
在 /software/azkaban 目录下执行命令: keytool -keystore keystore -alias jetty -genkey -keyalg RSA 创建 ssl 配置。
[root@mynode5 azkaban]# keytool -keystore keystore -alias jetty -genkey
-keyalg RSA
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]: azkaban
您的组织单位名称是什么?
[Unknown]: azkaban
您的组织名称是什么?
[Unknown]: azkaban
您所在的城市或区域名称是什么?
[Unknown]: beijing
您所在的省/市/自治区名称是什么?
[Unknown]: beijing
该单位的双字母国家/地区代码是什么?
[Unknown]: CN
CN=azkaban, OU=azkaban, O=azkaban, L=beijing, ST=beijing, C=CN 是否正确?
[否]: Y
输入 <jetty> 的密钥口令
(如果和密钥库口令相同, 按回车):
输入完信息,执行完以上命令之后,在当前目录下生成一个 keystore 文件,将此文件复制到 azkaban web 服务器根目录下。
[root@node4 azkaban]# mv /software/azkaban/keystore /software/azkaban/azkaban-web
2.3.2 Azkaban web 服务器配置
进 入 /software/azkaban/azkaban-web/conf 目 录 下 , 编 辑azkaban.properties 文件:
[root@node4 conf]# cd /software/azkaban/azkaban-web/conf/
[root@node4 conf]# vim azkaban.properties
编辑内容如下:
# Azkaban Personalization Settings
azkaban.name=My Azkaban #服务器 UI 上显示的名字
azkaban.label=My Local Azkaban #描述
azkaban.color=#FF3601 #web ui 颜色
azkaban.default.servlet.path=/index
web.resource.dir=/software/azkaban/azkaban-web/web/ #web 目录
default.timezone.id=Asia/Shanghai #设置时区,用于任务调度定时
# Azkaban UserManager class
user.manager.class=azkaban.user.XmlUserManager #用户权限管理默认类
user.manager.xml.file=/software/azkaban/azkaban-web/conf/azkaban-users.xml #用户配置文件
# Loader for projects
executor.global.properties=/software/azkaban/azkaban-web/conf/global.properties #全局配置文件
azkaban.project.dir=projects
# Velocity dev mode
velocity.dev.mode=false
# Azkaban Jetty server properties.
jetty.use.ssl=false #Jetty 服务器属性,开启配置成 true
jetty.maxThreads=25 #最大线程数
jetty.port=8081 #Jetty 端口
jetty.keystore=/software/azkaban/azkaban-web/keystore #SSL 文件名
jetty.password=azkaban #SSL 文件密码
jetty.keypassword=azkaban #Jetty 主密码 与 keystore 文件相同
jetty.truststore=/software/azkaban/azkaban-web/keystore #SSL 文件名
jetty.trustpassword=azkaban # SSL 文件密码
jetty.ssl.port=8443 #配置 ssl 之后访问端口
# Azkaban Executor settings
# mail settings
mail.sender=
mail.host=
# User facing web server configurations used to construct the user facing server URLs. They are useful when there is a reverse proxy between Azkaban web servers and users.
# enduser -> myazkabanhost:443 -> proxy -> localhost:8081
# when this parameters set then these parameters are used to generate email links.
# if these parameters are not set then jetty.hostname, and jetty.port(if ssl configured jetty.ssl.port) are used.
# azkaban.webserver.external_hostname=myazkabanhost.com
# azkaban.webserver.external_ssl_port=443
# azkaban.webserver.external_port=8081
job.failure.email=
job.success.email=
lockdown.create.projects=false
cache.directory=cache
# JMX stats
jetty.connector.stats=true
executor.connector.stats=true44. executor.port=12312 #executor 服务器端口
# Azkaban mysql settings by default. Users should configure their own username and password.
database.type=mysql #数据库类型
mysql.port=3306 #端口号
mysql.host=mynode2 #数据库连接 Ip
mysql.database=azkaban #数据库实例
mysql.user=root #数据库用户名
mysql.password=123456 #数据库密码
mysql.numconnections=100 #最大连接数
#Multiple Executor
azkaban.use.multiple.executors=true
azkaban.executorselector.filters=StaticRemainingFlowSize,MinimumFreeMemory,CpuStatus # MinimumFreeMemory 最好去掉,因为检查每台节点是否有 6G 内存
azkaban.executorselector.comparator.NumberOfAssignedFlowComparator=1
azkaban.executorselector.comparator.Memory=1
azkaban.executorselector.comparator.LastDispatched=1
azkaban.executorselector.comparator.CpuUsage=1
2.3.3 Azkaban executor 服务器配置
进 入 /software/azkaban/azkaban-exec/conf 目 录 下 , 编 辑azkaban.properties 文件:
1. # Azkaban Personalization Settings
2. azkaban.name=My Azkaban
3. azkaban.label=My Local Azkaban
4. azkaban.color=#FF3601
5. azkaban.default.servlet.path=/index
6. web.resource.dir=/software/azkaban/azkaban-web/web/
7. default.timezone.id=Asia/Shanghai
8. # Azkaban UserManager class
9. user.manager.class=azkaban.user.XmlUserManager
10. user.manager.xml.file=/software/azkaban/azkaban-web/conf/azkaban-users.xml
11. # Loader for projects
12. executor.global.properties=/software/azkaban/azkaban-web/conf/global.properties
13. azkaban.project.dir=projects
14. # Velocity dev mode
15. velocity.dev.mode=false
16. # Azkaban Jetty server properties.
17. jetty.use.ssl=false #不需要在 executor 中配置
18. jetty.maxThreads=25 #不需要在 executor 中配置
19. jetty.port=8081 #不需要在 executor 中配置
20. # Where the Azkaban web server is located
21. azkaban.webserver.url=https://localhost:8443
22. # mail settings
23. mail.sender=
24. mail.host=
25. # User facing web server configurations used to construct the user facing server URLs. They are useful when there is a reverse proxy between Azkaban web servers and users.
26. # enduser -> myazkabanhost:443 -> proxy -> localhost:8081
27. # when this parameters set then these parameters are used to generate email links.
28. # if these parameters are not set then jetty.hostname, and jetty.port(if ssl configured jetty.ssl.port) are used.29. # azkaban.webserver.external_hostname=myazkabanhost.com
30. # azkaban.webserver.external_ssl_port=443
31. # azkaban.webserver.external_port=8081
32. job.failure.email=
33. job.success.email=
34. lockdown.create.projects=false
35. cache.directory=cache
36. # JMX stats
37. jetty.connector.stats=true
38. executor.connector.stats=true
39. # Azkaban plugin settings
40. azkaban.jobtype.plugin.dir=/software/azkaban/azkaban-exec/plugins/jobtypes
41. # Azkaban mysql settings by default. Users should configure their own username and password.
42. database.type=mysql
43. mysql.port=3306
44. mysql.host=node1
45. mysql.database=azkaban
46. mysql.user=root
47. mysql.password=12345678
48. mysql.numconnections=100
49. # Azkaban Executor settings
50. executor.maxThreads=50
51. executor.port=12321
52. executor.flow.threads=30
2.3.4 启动 Azkaban
- 启动 AzkabanExecutorServer
进入 /software/azkaban/azkaban-exec/bin 目录,启动AzkabanExecutorServer , jps 检查进程 , 出现AzkabanExecutorServer进程表示启动成功。
[root@node4 bin]# cd /software/azkaban/azkaban-exec/bin
[root@node4 bin]# ./start-exec.sh
[root@node4 bin]# jps
8745 AzkabanExecutorServer
8763 Jps
- 激活 AzkabanExecutor
启动/重启 AzkabanExecutor 需要激活,在浏览器中执行如下命令,激活
AzkabanExecutor :
http://node4:12321/executor?action=activate
- 启动 AzkabanWebServer
进入 /software/azkaban/azkaban-web/bin 目录,启动
AzkabanWebServer,jps 检查进程,出现 AzkabanWebServer 进程表示启动成功。
[root@node4 bin]# cd /software/azkaban/azkaban-web/bin
[root@node4 bin]# ./start-web.sh3. [root@mynode5 bin]# jps
4. 8805 Jps
5. 8792 AzkabanWebServer
6. 8745 AzkabanExecutorServer
至此, Azkaban 的搭建已经完成,下面检查 Azkaban 运行情况。
2.4 验证 Azkaban 运行情况
验证 Azkaban 是否启动成功,可以访问 Azkaban 的 WebUI 界面,检查是否启动成功。在浏览器输入 http://node4:8081:
如果配置了ssl请访问:https//node4:port
输入地址之后,出现以上页面表示配置 Azkaban 没有问题,Azkaban 启动成功,默认的用户名和密码都是 Azkaban ,可以输入用户名和密码登录 Azkaban 的界面提交任务流,进行任务管理和调度。:
至此, Azkaban 搭建成功,下面我们模拟一个任务流来尝试利用 Azkaban 来进行任务调度。
3. 构建工作流
以上小节介绍了安装部署 Azkaban ,本节中我们将设计一个模拟的任务流程 flow ,通过这个任务流程来学习如何编写 Azkaban 的任务、如何在 WebUI 中查看任务流调度及状态。
首先介绍下 Azkaban 中 project 、 flows 、 job 之间的关系:一个 project 中可以包含一个或者多个 flows ,一个 flows 包含多个 job 。这里的 job 是在 Azkaban 中运行的一个进程,可以是简单的 linux 命令、 shell 脚本、 sql 脚本等。一个 job 可以依赖于另一个 job ,这种多个 job 之间的依赖关系组成 flow ,也就是任务流。
3.1 设计工作流程
假设现在有 5 个 job ,分别是 job1 、 job2 、 job3 、 job4 、 job5 。每个 job 都执行一个 shell 脚本。 job3 依赖与 job1 和 job2 执行的结果, job4 依赖于 job3 执行的结果, job5 依赖于 job4 执行的结果。
针对以上这个任务需求,我们可以设计一个任务流( flow ),这个任务流中有 5 个job ,按照上述 job 依赖的关系,可以编写一个简单的任务流程提交到 Azkaban 中进行调度执行。
3.2 编写各阶段 Job
编写 job 非常容易,需要创建一个以” .job ”结尾的文本文件,文件中书写格式如下:
type=command
command= 需要执行的脚本或命令
type=command 是 告 诉 Azkaban 使 用 unix 原 生 命 令 去 运 行 命 令 或 者 脚 本 ,command= “ xxx ”就是指定当前 job 需要执行的命令或者脚本,如果当前 job 依赖于其他的 job ,只需要在这个文本文件后面加上“ dependencies= 依赖的 job 名称”即可,依赖的 job 只需要写名称,不需要写出后缀“ job ”。
为了方便演示以上工作流程,这里设计的每个 job 都调起 linux 上的一个脚本,脚本中就使用简单的 echo 打印一些信息供参看 ,5 个 job 及对应的脚本设置内容如下:
- 编写 job 任务
job1.job:
type=command
command= sh job1.sh
job2.job :
type=command
command= sh job2.sh
job3.job:
type=command
command= sh job3.sh
dependencies=job1,job2
job4.job:
type=command
command= sh job4.sh
dependencies=job3
job5.job:
type=command
command= sh job5.sh
dependencies=job4
以上 job 任务的编写可以在本地 window 环境中编写,编写完成后需要将 5 个 job
压缩到一个压缩文件中,后期提交到 Azkaban 中执行。
2. 编写脚本内容
job1.sh:
echo "开始执行 job1... ... "
echo "正在执行 job1... ... "
echo "执行完成 job1... ... "
job2.sh:
echo "开始执行 job2... ... "
echo "正在执行 job2... ... "
echo "执行完成 job2... ... "
job3.sh:
echo "开始执行 job3... ... "
echo "正在执行 job3... ... "
echo "执行完成 job3... ... "
job4.sh:
echo "开始执行 job4... ... "
echo "正在执行 job4... ... "
echo "执行完成 job4... ... "
job5.sh:
echo "开始执行 job5... ... "
echo "正在执行 job5... ... "
echo "执行完成 job5... ... "
以 上 脚 本 是 在 linux 中 编 写 , job1.sh 、 job2.sh 、 job3.sh 、 job4.sh 、job5.sh 几个脚本都需要赋予执行权限。
3.3 配置工作流并执行
Azkaban 中任务提交时,必须将所有 job 文件压缩到一个 zip 文件中再提交到
Azkaban 中执行。首先将以上 5 个 job 压缩到一个 zip 文件中,然后登陆 Azkaban, 点
击右上角的 Create Project 创建一个项目:
在弹出的框中填写项目名称及项目描述:
点击 Create Project ,点击 upload ,上传压缩好的任务:
上传完成之后,查看任务流, Azkaban 默认 Flow 名称是以最后一个没有依赖的 job定义的:
点击 Execute Flow 可以看到任务流的详细依赖关系:
点击 Execute 执行任务。
如果想要每隔一段时间执行一次任务,可以点击 Schedule ,配置定时任务,配置好时间之后,点击 Schedule 调度即可。如图示:
3.4 工作流执行监控
执行任务完成之后,会自动跳转到执行成功界面:
3.5 Azkaban 问题
如果在提交 Azkaban 时出现任务一直运行状态,但是执行不完成,查看 azkabanwebui 日 志 发 现 “ Cannot request memory (Xms 0 kb, Xmx 0 kb) from system for job job1, sleep for 60 secs and retry, at… … ”问题,这个问题是 executor 执行任务之前检查节点内存是否足够 3G ,如果不够就会出现这个错 误 。 可 以 在 …/azkaban-exec/plugins/jobtype 目 录 下 , 配 置commonprivate.properties 文 件 , 在 文 件 中 加 入“ memCheck.enabled=false ”,不检查内存即可,重启 azkaban 就可。