目录
一、azkaban的简介
1)官网
https://azkaban.github.io/
Azkaban是LinkedIn创建的批处理工作流任务调度程序,用于运行Hadoop任务。阿兹卡班通过工作依赖关系来解决排序问题,并提供一个易于使用的web用户界面来维护和跟踪您的工作流程。
2)产生背景
1. 一个完整的大数据分析系统通常都是由大量任务单元组成:shell脚本程序,mapreduce程序、hive脚本、spark程序等。
2. 各任务单元之间存在时间先后及前后依赖关系:先后关系、依赖关系、定时执行。
3. 为了很好地组织起这样的复杂执行计划,需要一个工作流调度系统来调度执行。
3)azkaban的特点
兼容Hadoop的任何版本
易于使用的web UI
简单的web和http工作流上传
项目工作区
调度的工作流
模块化和pluginable
身份验证和授权
跟踪用户操作
邮件提醒失败和成功
SLA警报和自动杀死
重新尝试失败的作业
4)azkaban有oozie的比较
两者在功能方面大致相同,只是Oozie底层在提交Hadoop Spark作业是通过org.apache.hadoop的封装好的接口进行提交,而Azkaban可以直接操作shell语句。在安全性上可能Oozie会比较好。
工作流定义:Oozie是通过xml定义的而Azkaban为properties来定义。
部署过程:Oozie的部署相对困难些,同时它是从Yarn上拉任务日志。
Azkaban中如果有任务出现失败,只要进程有效执行,那么任务就算执行成功,这是BUG,但是Oozie能有效的检测任务的成功与失败。
操作工作流:Azkaban使用Web操作。Oozie支持Web,RestApi,Java API操作。
权限控制:Oozie基本无权限控制,Azkaban有较完善的权限控制,供用户对工作流读写执行操作。
Oozie的action主要运行在hadoop中而Azkaban的actions运行在Azkaban的服务器中。
记录workflow的状态:Azkaban将正在执行的workflow状态保存在内存中,Oozie将其保存在Mysql中。
出现失败的情况:Azkaban会丢失所有的工作流,但是Oozie可以在继续失败的工作流运行
5)常见的调度系统
简单的任务调度:直接使用linux的crontab来定义、shell和python脚本实现
现成开源任务调度: oozie、azkaban和airflow等
复杂的任务调度:自研调度平台
二、azkaban的系统架构
azkaban由三个组件构成
1. web server: 提供了webui接口,用于接收客户端传入的job作业,以及向exec server分发作业
2. exec server : 接收web server分发的作业,并执行。
3. mysql :用于管理Web 和 Exec之间的数据共享和部分状态的同步。
三、azkaban的安装方式
三种方式,分别是源码安装方式、solo模式、multi exec server模式
1.源码安装模式,参考文档。
2.solo模式: 单机模式,指的是azkaban的所有的进程都在一台机器上,而且只有一个exec server
3.multi exec server模式 :指的是exec server有多个,分布在不同的机器节点上
3.1 Solo Server安装
3.1.1 Solo Server简介
这种Solo Server服务是azkaban的单机版,即是单实例,它安装简单,便于学习。他的优点如下:
- 安装简单:不需要mysql实例,它内置h2来做存储。
- 启动简单:web server和executor server都运行在相同进程中。
- 功能齐全:它包含所有azkaban的特征。你可以使用azkaban用这种通用方法并为其安装插件。
3.1.2 安装步骤
1)上传、解压、并更名
[root@xxx01 ~]# tar -zxvf azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz -C /usr/local/
[root@xxx01 ~]# cd /usr/local/
[root@xxx01 local]# mv azkaban-solo-server-0.1.0-SNAPSHOT/ azkaban-solo
2)配置环境变量
[root@xxx01 ~]# vim /etc/profile
#azkaban environment
export AZKABAN_HOME=/usr/local/azkaban-solo
export PATH=$AZKABAN_HOME/bin:$PATH
[root@xxx01 ~]# source /etc/profile
3)添加用户
[root@xxx01 ~]# vim $AZKABAN_HOME/conf/azkaban-users.xml
在第四行上添加如下内容:
<user password="admin" roles="metrics,admin" username="admin"/>
到此为止,solo模式安装成功
4)启动azkaban : 注意 必须在azkaban的家里运行启动脚本
[root@xxx01 azkaban-solo]# ./bin/start-solo.sh
5)打开浏览器
输入ip:8081 如果能打开,就表示安装成功
3.2 Multi exec Server安装方式
3.2.1 节点布局
xxx01 webserver
xxx02 execserver
xxx03 execserver
3.2.2 配置mysql
步骤1)找到create-all-sql-0.1.0-SNAPSHOT.sql脚本
方式1:
上传安装包里的azkaban-db-0.1.0-SNAPSHOT.tar.gz,在linux上解压,进入里面去找
方式2:
在windows上解压,然后进入里面找到脚本
步骤2)进入mysql,创建一个azkaban库
create database azkaban;
步骤3)执行脚本
use azkaban;
source /root/create-all-sql-0.1.0-SNAPSHOT.sql
步骤4)保证azkaban这个库是远程授权的
grant all privileges on *.* to root@'%' identified by '@Mmforu45';
步骤5) 修改mysql的配置
(建议修改,如果在重启服务时,报错,就不要修改了)
[root@xxx03 azkaban]# vi /etc/my.cnf
在[mysqld]下添加
max_allowed_packet=1024M
[root@xxx03 ~]# systemctl restart mysqld
3.2.3 配置web server
步骤1)上传、解压、更名
[root@xxx01 ~]# tar -zxvf azkaban-web-server-0.1.0-SNAPSHOT.tar.gz -C /usr/local/
[root@xxx01 ~]# cd /usr/local/
[root@xxx01 local]# mv azkaban-web-server-0.1.0-SNAPSHOT/ azkaban-web
步骤2)配置环境变量(配不配无所谓)
步骤3)导入mysql的驱动包
进入azkaban-web目录下,创建extlib目录,并上传mysql的驱动jar包到extlib目录下
[root@xxx01 local]# cd azkaban-web
[root@xxx01 azkaban-web]# mkdir extlib
步骤4)生成秘钥
[root@qphone01 azkaban-web]# keytool -keystore keystore -alias jetty -genkey -keyalg RSA
需要指定秘钥库指令,以及再次确认秘钥库指令,都是123456
一路回车,直到出现“是否正确”,回答y即可
步骤5) 配置azkaban.properties
# Azkaban Personalization Settings
azkaban.name=Test
azkaban.label=My Local Azkaban
azkaban.color=#FF3601
azkaban.default.servlet.path=/index
web.resource.dir=/usr/local/azkaban-web/web
default.timezone.id=Asia/Shanghai
# Azkaban UserManager class
user.manager.class=azkaban.user.XmlUserManager
user.manager.xml.file=/usr/local/azkaban-web/conf/azkaban-users.xml
# Loader for projects
executor.global.properties=/usr/local/azkaban-exec/conf/global.properties
azkaban.project.dir=projects
# Velocity dev mode
velocity.dev.mode=false
# Azkaban Jetty server properties.
jetty.use.ssl=false
jetty.maxThreads=25
jetty.ssl.port=8443
jetty.port=8081
jetty.keystore=keystore
jetty.password=123456
jetty.keypassword=123456
jetty.truststore=keystore
jetty.trustpassword=123456
# 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=true
# Azkaban mysql settings by default. Users should configure their own username and password.
database.type=mysql
mysql.port=3306
mysql.host=xxx03
mysql.database=azkaban
mysql.user=root
mysql.password=@Mmforu45
mysql.numconnections=100
#Multiple Executor
azkaban.use.multiple.executors=true
#azkaban.executorselector.filters=StaticRemainingFlowSize,MinimumFreeMemory,CpuStatus
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
步骤6) 配置azkaban-users.xml
添加admin用户
<azkaban-users>
<user groups="azkaban" password="azkaban" roles="admin" username="azkaban"/>
<user password="metrics" roles="metrics" username="metrics"/>
<user password="admin" roles="metrics,admin" username="admin"/>
<role name="admin" permissions="ADMIN"/>
<role name="metrics" permissions="METRICS"/>
</azkaban-users>
3.2.4 配置exec server
步骤1)上传、解压、更名
[root@xxx02 ~]# tar -zxvf azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz -C /usr/local/
[root@xxx02 ~]# cd /usr/local/
[root@xxx02 local]# mv azkaban-exec-server-0.1.0-SNAPSHOT/ azkaban-exec
步骤2)进入azkaban-exec目录下,创建extlib目录,将mysql的驱动包导入到此目录下
[root@xxx02 local]# cd azkaban-exec
[root@xxx02 azkaban-exec]# mkdir extlib
步骤3) 修改azkaban.properties
[root@xxx02 azkaban-exec]# vi conf/azkaban.properties
修改为下面的内容(注意和你的机器的路径,密码要匹配)
# Azkaban Personalization Settings
azkaban.name=Test
azkaban.label=My Local Azkaban
azkaban.color=#FF3601
azkaban.default.servlet.path=/index
web.resource.dir=/usr/local/azkaban-web/web
default.timezone.id=Asia/Shanghai
# Azkaban UserManager class
user.manager.class=azkaban.user.XmlUserManager
user.manager.xml.file=/usr/local/azkaban-web/conf/azkaban-users.xml
# Loader for projects
executor.global.properties=/usr/local/azkaban-exec/conf/global.properties
azkaban.project.dir=projects
# Velocity dev mode
velocity.dev.mode=false
# Azkaban Jetty server properties.
jetty.use.ssl=false
jetty.maxThreads=25
jetty.port=8081
# Where the Azkaban web server is located
azkaban.webserver.url=http://xxx01:8081
# 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=true
# Azkaban plugin settings
azkaban.jobtype.plugin.dir=/usr/local/azkaban-exec/plugins/jobtypes/
# Azkaban mysql settings by default. Users should configure their own username and password.
#azkaban.executorselector.filters=StaticRemainingFlowSize,MinimumFreeMemory,CpuStatus
azkaban.executorselector.filters=StaticRemainingFlowSize,CpuStatus
database.type=mysql
mysql.port=3306
mysql.host=xxx03
mysql.database=azkaban
mysql.user=root
mysql.password=@Mmforu45
mysql.numconnections=100
# Azkaban Executor settings
executor.port=12321
executor.maxThreads=50
executor.flow.threads=30
5)修改插件文件
[root@xxx02 azkaban-exec]# vi ./plugins/jobtypes/commonprivate.properties
set execute-as-user
execute.as.user=false
memCheck.enabled=false #添加内存检查关闭 ,否则报错不足3G
到此为止,azkaban-exec配置好了,就差xxx03了,我们可以scp到另一台机器上
[root@xxx02 azkaban-exec]# cd ..
[root@xxx02 local]# scp -r azkaban-exec xxx03:/usr/local/
6)启动测试(建议先重启虚拟机)
zkaban启动的顺序为,先启动executor,再启动web。否则web工程会因为找不到executor而启动失败。
先启动两个exec
[root@xxx02 ~]# cd /usr/local/azkaban-exec
[root@xxx02 azkaban-exec]# ./bin/start-exec.sh
[root@xxx03 ~]# cd /usr/local/azkaban-exec
[root@xxx03 azkaban-exec]# ./bin/start-exec.sh
然后查看元数据表executors
登录你的mysql
查看executors表里的两个active是不是1,如果不是,请修改为1
然后再启动web-server
[root@xxx01 ~]# cd /usr/local/azkaban-web
[root@xxx01 azkaban-web]# ./bin/start-web.sh
然后开心的启动webui吧,xxxxx:8081
四、azkaban的应用
到目前为止,azkaban的工作flow机制分为两种flow机制,一个是比较旧的job流,一个是比较新的flow流。
job流,称之为flow1.0版本,flow流,称之为flow2.0版本
4.1、Flow1.0版本的job流
4.1.1 说明
1. azkaban的job流文件,后缀是.job
里面必须要有一个type属性 必须赋值
值可以是:command,java,pig中的一个
2. azkaban执行的job必须要提前打包,打包的格式必须是zip格式
3. 流文件里的书写格式:
1)一定要注意行末不要有空格
2)utf-8编码集,如果在window上实在不行,可以上传到linux进行zip压缩,然后下载到windows上,再上传到azkaban上
4.1.2 案例演示1:打印hello world
1)创建一个后缀为.job的文件helloworld,输入内容如下:
type=command
command=echo "hello world"
注意:编码集的问题,最终一定要保证是utf-8编码格式
2) 压缩成zip包
3)上传到azkaban上
1. 首先创建项目
2. 上传到项目下
3. 执行run job
4. 进入就绪界面后,点击execute,运行
注意:
灰色:表示未运行
绿色:运行通过
红色:运行失败
蓝色:正在运行中
4.1.3 案例演示2之调用shell指令
1)编写一个shell脚本calculate.sh
#!/usr/bin/bash
sum=0
for i in $(seq 1 100)
do
sum=$(( $sum + $i ))
done
echo $sum >> /root/sum.log
2)编写job文件a2.job,调用shell脚本
type=command
command=/usr/bin/bash calculate.sh
3)打包,上传,测试
4.1.4 案例演示2之执行mr程序
1)编写job文件a3.job
type=command
command=/usr/local/hadoop/bin/hadoop jar hadoop-mapreduce-examples-2.6.0-cdh5.13.2.jar wordcount /input /output
2)将hadoop-mapreduce-examples-2.6.0-cdh5.13.2.jar找到,并下载到和a3.job相同的位置
3)打包,上传,测试
注意:hdfs、yarn要启动、input目录是否存在,上传要统计的文件
4.1.5 案例演示4之工作流演示
1)创建b.sh
#!/bin/bash
echo hello_bbb >/root/b.log
sleep 30s
2)创建jobB.job
type=command
command=/bin/bash b.sh
3) 创建a.sh
#!/bin/bash
echo hello_aaa >/root/a.log
4) 创建jobA.job
type=command
dependencies=jobB
command=/bin/bash a.sh
5) 打包,上传,测试
4.1.6 azkaban调度hive脚本
1)创建一个hql脚本:create_table.hql
create database mydb3;
use mydb3;
create table if not exists test1(
sid int,
sname string
)
row format delimited
fields terminated by ',';
2)创建一个job文件:create_table.job
type=command
command=/usr/local/hive/bin/beeline -u jdbc:hive2://qianfeng02:10000 -n root -f create_table.hql
注意:需要在qianfeng02上开启hiveserver2服务项。
3)打包,上传执行,然后查看吧
4.1.7 azkaban定时调度任务
1)创建一个sh脚本:testcrond.sh
#!/bin/bash
echo "aaaaa" >>/root/crond.log
2)创建一个job文件:testcrond.job
type=command
command=/usr/bin/bash testcrond.sh
3) 打包,上传到azkaban上
4)点击run job或者是execute flow 进入界面,不要立即点击execute,而是点击schedule, 设置定时任务
5)设置完之后,要点击定时任务下面的schedule按钮,继续点击execute
6)来到新界面后,需要点击FLOW列里的job名称,进入执行计划界面
7)再点击Schedule/execute Flow,进入最后界面,点击execute
4.2、 Flow2.0版本的flow流
Azkaban 目前同时支持 Flow 1.0 和 Flow2.0 ,但是官方文档上更推荐使用 Flow 2.0,因为 Flow 1.0 会在将来的版本被移除。Flow 2.0 的主要设计思想是提供 1.0 所没有的流级定义。用户可以将属于给定流的所有 job / properties 文件合并到单个流定义文件中,其内容采用 YAML 语法进行定义,同时还支持在流中再定义流,称为为嵌入流或子流。
4.2.1 基本结构
项目 zip 将包含多个流 YAML 文件,一个项目 YAML 文件以及可选库和源代码。Flow YAML 文件的基本结构如下:
1. 所有的workflow都是在一个文件里写的
2. 文件以流名称为后缀的,如:my-flow-name.flow;
3. 包含 DAG 中的所有节点;
4. 每个节点可以是不同的类型,比如可以是flow,hive,hadoopjava,pig,noop,command
5. 每个节点可以拥有 name, type, config, dependsOn 和 nodes sections 等属性;
6. 通过列出 dependsOn 指定依赖关系
7. 包含与流相关的其他配置
8. flow1.0里的属性都移植到config下,config下是以键值对的形式书写的。
注意:还需要单独写一个xxxx.project文件指定azkaban使用的是workflow2.0版本
azkaban-flow-version: 2.0
4.3 YAML语法
想要使用 Flow 2.0 进行工作流的配置,首先需要了解 YAML 。YAML 是一种简洁的非标记语言,有着严格的格式要求的,如果你的格式配置失败,上传到 Azkaban 的时候就会抛出解析异常。
4.3.1 基本规则
1. 大小写敏感2. 使用缩进表示层级关系 ;3. 缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级;4. 使用#表示注释 ;5. 字符串默认不用加单双引号,但单引号和双引号都可以使用,双引号表示不需要对特殊字符进行转义;6. YAML 中提供了多种常量结构,包括:整数,浮点数,字符串,NULL,日期,布尔,时间。
4.3.2 对象的写法
# value 与 : 符号之间必须要有一个空格
key: value
4.3.3 map的写法:
# 写法一 同一缩进的所有键值对属于一个map
key:
key1: value1
key2: value2
# 写法二
{key1: value1, key2: value2}
4.3.4 数组的写法
# 写法一 使用一个短横线加一个空格代表一个数组项
- a
- b
- c
# 写法二
[a,b,c]
4.3.5 单双引号
s1: '内容\n 字符串'
s2: "内容\n 字符串"
转换后:
{ s1: '内容\\n 字符串', s2: "内容\n 字符串" }
4.3.6 特殊符号
一个 YAML 文件中可以包括多个文档,使用 `---` 进行分割。
4.3.7 配置引用
Flow 2.0 建议将公共参数定义在 `config` 下,并通过 `${}` 进行引用。
4.4 案例介绍
4.4.1 简单案例调度
1)编写一个xxxx.flow文件,比如simple.flow (注意字符集,TAB键等问题)
nodes:
- name: jobA
type: command
config:
command: echo "this is a simple test"
2)编写版本文件:xxx.project ,比如叫same.project
azkaban-flow-version: 2.0
3)打包成xxx.zip文件,上传,测试
4.4.2 多任务调度
1)编写一个xxxx.flow文件,比如multi.flow (注意字符集,TAB键等问题)
nodes:
- name: jobE
type: command
config:
command: echo "This is job E"
# jobE depends on jobD
dependsOn:
- jobD
- name: jobD
type: command
config:
command: echo "This is job D"
# jobD depends on jobA、jobB、jobC
dependsOn:
- jobA
- jobB
- jobC
- name: jobA
type: command
config:
command: echo "This is job A"
- name: jobB
type: command
config:
command: echo "This is job B"
- name: jobC
type: command
config:
command: echo "This is job C"
2)编写版本文件:xxx.project ,比如叫same.project
azkaban-flow-version: 2.0
3)打包成xxx.zip文件,上传,测试
4.4.3 内嵌流调度
1)编写一个xxxx.flow文件,比如embedded.flow (注意字符集,TAB键等问题)
nodes:
- name: jobC
type: command
config:
command: echo "This is job C"
dependsOn:
- embedded_flow
- name: embedded_flow
type: flow
config:
prop: value
nodes:
- name: jobB
type: command
config:
command: echo "This is job B ${prop}"
dependsOn:
- jobA
- name: jobA
type: command
config:
command: echo "This is job A"
2)编写版本文件:xxx.project ,比如叫same.project
azkaban-flow-version: 2.0
3)打包成xxx.zip文件,上传,测试
五、 azkaban的邮箱警报
1)注册一个邮箱
建议是新浪、网易等
2)开启邮箱的第三方客户端协议pop3/smtp/imap
需要手机发送短信进行开启,有一个密码,需要记住。可以备份到电脑,防止忘记。
3)azkaban作为客户端的配置:conf/azkaban.properties
mail.sender=你的邮箱
mail.host=smtp.sina.cn
mail.user=你的邮箱
mail.password=开启pop3/smtp/imap时的密码
下面两个属性,可配可不赔,在azkaban3.0版本以后失效
job.failure.email=mmforu@sina.cn
job.success.email=mmforu@sina.cn
4)重启azkaban的服务
5)案例测试
1. 上传一个案例
2. 进入执行界面,点击Notification
3. 配置失败和成功时通知的邮箱
4. 执行
六、azkaban的电话报警
1)注册瑞祥云账户,最好是邮箱认证
2)进入CA导航里的集成界面,选择email
3)添加相应信息,比如应用名称、邮箱(睿象云的邮箱),然后点击获取AppKey按钮
4)点击配置中的通知策略,配置相应的状态信息,点击保存
5)然后查看一下生成的睿象云的邮箱,复制
6)测试azkaban
1. 上传一个案例
2. 进入执行界面,点击Notification
3. 配置失败和成功时通知的邮箱:睿象云的邮箱
4. 执行
(>...<,距离元旦三天假还剩一天哦~,冲冲冲~)