AZKABAN的学习与使用
一、Azkaban的概述
1.简介
Azkaban是由Linkedin开源的一个批量工作流任务调度器
用于在一个工作流内以一个特定的顺序运行一组工作和流程
Azkaban定义了一种KV文件格式来建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流
2.特点
- 兼容任何版本的Hadoop
- 易于使用的web用户界面
- 简单的 web 和 http 工作流上传
- 项目工作区
- 工作流调度
- 模块化和可插拔的插件机制
与常用工作流调度器Oozie的对比:
1).工作流定义
- Azkaban使用yaml(Azkaban 3.x版本)格式文件定义工作流
- Oozie使用XML文件定义工作流
2).定时执行
- Azkaban的定时执行任务是基于时间的
- Oozie的定时执行任务基于时间和输入数据
3).资源管理
- Azkaban有较严格的权限控制,如用户对工作流进行读/写/执行等操作
- Oozie暂无严格的权限控制
3.作用
- 一个完整的数据分析系统通常都是由大量任务单元组成:
shell脚本程序,java程序,mapreduce程序、hive脚本等 - 各任务单元之间存在时间先后及前后依赖关系
- 为了很好地组织起这样的复杂执行计划,需要一个工作流调度系统来调度执行
4.架构
1、关系型数据库(MySQL): 存储元数据,如项目名称、项目描述、项目权限、任务状态、SLA规则等,AzkabanWebServerAzkabanExecutorServer都需要访问数据库
2、AzkabanWebServer:AzkabanWebServer是整个Azkaban工作流系统的主要管理者,对外提供web服务,使用户可以通过web页面管理。职责包括项目管理、权限授权、任务调度、监控executor
3、AzkabanExecutorServer:负责具体的工作流的提交、执行,它们通过mysql数据库来协调任务的执行
二、Azkaban的安装
官网
https://azkaban.github.io/
源码包下载地址
https://github.com/azkaban/azkaban/tags
编译
♥注意:需要 Jdk 1.8或更高
# 编译 Azkaban
./gradlew build
# 清理编译出来的文件
./gradlew clean
# 编译并发布
./gradlew installDist
# 运行测试用例
./gradlew test
# 不执行测试用例进行编译Azkaban【一般我们执行这一句就可以了,如果失败了,就多执行几次,直到成功为止】
./gradlew build -x test
2.1 solo-server 模式安装
# 解压
mkdir /opt/install/azkaban
tar zxvf azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz -C /opt/install/azkaban/
# 更改文件夹名称
mv azkaban-solo-server-0.1.0-SNAPSHOT/ azkaban-solo-server
# 进入文件夹
cd azkaban-solo-server/
# 启动
bin/start-solo.sh
#查看进程
440294 AzkabanSingleServer
#关闭
bin/shutdown-solo.sh
2.2 two-server 模式安装
数据库准备
# 创建数据库
CREATE DATABASE azkaban;
# 创建用户,用户名和密码都是azkaban
mysql> CREATE USER 'azkaban'@'%' IDENTIFIED BY 'azkaban';
# give the user INSERT, SELECT, UPDATE, DELETE permission on all tables in the Azkaban db.
mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON azkaban.* to 'azkaban'@'%' WITH GRANT OPTION;
# 刷新权限
mysql> flush privileges;
# 切换数据库
mysql> use azkaban;
# 创建Azkaban表
mysql> source /opt/install/azkaban/azkaban-db/create-all-sql-0.1.0-SNAPSHOT.sql;
# 拷贝配置文件模板
cp /usr/share/mysql/my-small.cnf /etc/my.cnf.d/
# 修改配置文件
vim /etc/my.cnf.d/my-small.cnf
---------------------------------
[mysqld]
...
max_allowed_packet=1024M
---------------------------------
# 重启mysql来让配置生效
systemctl restart mysql
安装Executor Server
#解压
tar zxvf /opt/software/azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz -C /opt/install/azkaban/
#修改配置
cd /opt/install/azkaban/
mv azkaban-exec-server-0.1.0-SNAPSHOT/ azkaban-exec
cd azkaban-exec/
# 配置mysql信息
vi conf/azkaban.properties
---------------------------------
mysql.port=3306
mysql.host=singleNode
mysql.database=azkaban
mysql.user=azkaban
mysql.password=azkaban
mysql.numconnections=100
---------------------------------
#启动exec-server
bin/start-exec.sh
#查看进程
443678 AzkabanExecutorServer
#激活executor
[root@singleNode azkaban-exec]curl -G "localhost:$(<./executor.port)/executor?action=activate" && echo
{"status":"success"}
安装Web Server
#解压
tar zxvf /opt/software/azkaban-web-server-0.1.0-SNAPSHOT.tar.gz -C /opt/install/azkaban/
#修改配置
cd /opt/install/azkaban/
mv azkaban-web-server-0.1.0-SNAPSHOT/ azkaban-web
cd azkaban-web/
# 配置mysql信息
vim conf/azkaban.properties
---------------------------------
mysql.port=3306
mysql.host=singleNode
mysql.database=azkaban
mysql.user=azkaban
mysql.password=azkaban
mysql.numconnections=100
---------------------------------
# 配置用户信息
vim conf/azkaban-users.xml
---------------------------------
<azkaban-users>
<user groups="azkaban" password="azkaban" roles="admin" username="azkaban"/>
<user password="metrics" roles="metrics" username="metrics"/>
<user password="admin" roles="admin" username="admin"/>
<role name="admin" permissions="ADMIN"/>
<role name="metrics" permissions="METRICS"/>
</azkaban-users>
---------------------------------
#启动web-server
bin/start-web.sh
#查看进程
444293 AzkabanWebServer
443678 AzkabanExecutorServer
端口web访问
8081
三、Azkaban的实例演示
Flow1.0-单一job执行
- 编写job文件
type=command
command=echo 'Hello World'
- 将job文件压缩为zip格式文件
- 通过azkaban的web管理平台创建project并上传job压缩包
- 创建任务
- 上传ZIP包
- 执行任务
Flow1.0-多job工作流
编写a,b,c,d 4个job文件
type=command
command=echo "job a"
type=command
command=echo "job b"
dependencies=a
type=command
command=echo "job c"
dependencies=a
type=command
command=echo "job d"
dependencies=b,c
将4个job文件压缩为一个zip格式文件
如上次相同提交job,并执行。
job执行流程:
Flow2.0-单一job执行
Yaml介绍:
基本语法
- 大小写敏感
- 使用缩进表示层级关系
- 缩进不允许使用tab,只允许空格
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
- '#'表示注释
编写project和flow文件
Demo03.project
azkaban-flow-version: 2.0
Demo03.flow
nodes:
- name: demo03
type: command
config:
command: echo "Hello World"
将2个文件压缩为一个zip格式文件
提交job
Flow2.0-多job工作流
编写project和flow文件
Demo04.project
azkaban-flow-version: 2.0
Demo04.flow
nodes:
- name: a
type: command
config:
command: echo "job AAAAAA"
- name: b
type: command
dependsOn:
- a
config:
command: echo "job BBBBBB"
- name: c
type: command
dependsOn:
- a
config:
command: echo "job CCCCCC"
- name: d
type: command
dependsOn:
- c
- b
config:
command: echo "job DDDDDD"
将2个文件压缩为一个zip格式文件
提交job
Flow2.0-故障重启
编写flow, project 和sql文件
Demo05.project
azkaban-flow-version: 2.0
Demo05.flow
nodes:
- name: demo05
type: command
config:
command: aaa
retries: 3
retry.backoff: 5000
将2个文件压缩为一个zip格式文件
提交job
Flow2.0-Hive调度
编写flow, project 和sql文件
Demo06.project
azkaban-flow-version: 2.0
Demo06.flow
nodes:
- name: demo06
type: command
config:
command: hive -f demo06.sql
Demo06.sql
show databases;
将3个文件压缩为一个zip格式文件
提交job