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.架构

azkaban上如何提交一个spark任务_sql


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上如何提交一个spark任务_文件压缩_02

  • 通过azkaban的web管理平台创建project并上传job压缩包
  • azkaban上如何提交一个spark任务_mysql_03

  • 创建任务
  • azkaban上如何提交一个spark任务_mysql_04

  • 上传ZIP包
  • azkaban上如何提交一个spark任务_mysql_05


  • azkaban上如何提交一个spark任务_文件压缩_06

  • 执行任务
  • azkaban上如何提交一个spark任务_文件压缩_07

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执行流程:

azkaban上如何提交一个spark任务_文件压缩_08

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