目录
Azkaban安装Linux集群版
官网下载地址https://github.com/azkaban/azkaban/tags
上传tar包
新建一个文件夹,将tar包都解压到该目录下
tar -zxvf azkaban-db-3.84.4.tar.gz -C /opt/module/azkaban/
tar -zxvf azkaban-exec-server-3.84.4.tar.gz -C /opt/module/azkaban/
tar -zxvf azkaban-web-server-3.84.4.tar.gz -C /opt/module/azkaban/
修改默认文件名,方便快捷启动
mv azkaban-exec-server-3.84.4 azkaban-exec
mv azkaban-web-server-3.84.4 azkaban-web
配置MySQL
创建Azkaban数据库,存放Azkaban元数据信息
mysql> create database azkaban;
创建azkaban用户并赋予权限
# 设置密码有效长度4位及以上
mysql> set global validate_password_length=4;
# 设置密码策略最低级别
mysql> set global validate_password_policy=0;
# 创建azkaban用户,任何主机都可以访问Azkaban,密码是azkaban
mysql> CREATE USER 'azkaban'@'%' IDENTIFIED BY 'azkaban';
# 赋予azkaban用户增删改查权限
mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON azkaban.* to 'azkaban'@'%' WITH GRANT OPTION;
创建azkaban表,使用azkaban自带的数据库脚本生成数据
# 创建azkaban表
mysql> use azkaban;
mysql> source /opt/module/azkaban/azkaban-db-3.84.4/create-all-sql-3.84.4.sql
# 退出mysql
mysql> quit;
更改MySQL包大小,防止azkaban连接MySQL阻塞
vim /etc/my.cnf
# 在[mysqld]下面加一行max_allowed_packet=1024M
[mysqld]
max_allowed_packet=1024M
重启MySQL
systemctl restart mysqld
配置Executor Server
Azkaban Executor Server 处理工作流和作业的实际执行
编辑azkaban.properties
vim /opt/module/azkaban/azkaban-exec/conf/azkaban.properties
同步azkaban-exec到所有节点
xsync /opt/module/azkaban/azkaban-exec
启动executor server
必须进入到azkaban-exec路径,分别在三台机器上启动
bigdata100> bin/start-exec.sh
bigdata102> bin/start-exec.sh
bigdata104> bin/start-exec.sh
如果在azkaban-exec目录下出现executor.port文件,则说明启动成功
激活executor
bigdata100> curl -G "bigdata100:12321/executor?action=activate" && echo
bigdata102> curl -G "bigdata102:12321/executor?action=activate" && echo
bigdata104> curl -G "bigdata104:12321/executor?action=activate" && echo
如果三台服务器都提示如下,则说明激活成功
配置Web Server
Azkaban Web Server处理项目管理,身份验证,计划和执行触发
编辑azkaban.properties
vim /opt/module/azkaban/azkaban-web/conf/azkaban.properties
StaticRemainingFlowSize:正在排队的任务数
CpuStatus:CPU占用情况
MinimumFreeMemory:内存占用情况。测试环境,必须将MinimumFreeMemory删除掉,否则它会认为集群资源不够,不执行
修改azkaban-users.xml文件,添加czs用户
vim /opt/module/azkaban/azkaban-web/conf/azkaban-users.xml
启动web server
必须进入到主节点的azkaban-web路径启动
bigdata100> bin/start-web.sh
访问主节点的8081端口,并用czs账号登录
Azkaban基本使用
第一个Hello World
在自己机器上,新建一个azkaban.project文件,编辑内容如下
说明使用azkaban2.0语法
azkaban-flow-version: 2.0
新建basic.flow文件,内容如下
name:job名称
type:job类型,command表示执行作业的方式为命令
config:job配置
nodes:
- name: jobA
type: command
config:
command: echo "Hello World"
将azkaban.project和basic.flow文件压缩到一个zip文件夹,文件夹必须是英文
在WebServer新建项目
给项目名称命名和添加项目描述
上传压缩的文件夹
执行任务流
在日志中,查看运行结果
作业依赖操作
目标:JobA和JobB执行完毕之后,才能执行JobC
azkaban.project
azkaban-flow-version: 2.0
编写basic.flow
nodes:
- name: jobC
type: command
# jobC 依赖 JobA和JobB
dependsOn:
- jobA
- jobB
config:
command: echo "I’m JobC"
- name: jobA
type: command
config:
command: echo "I’m JobA"
- name: jobB
type: command
config:
command: echo "I’m JobB"
将azkaban.project和basic.flow文件压缩到一个zip文件夹,文件夹必须是英文
重复上述第一个hello world操作
自动失败重试操作
目标:如果执行任务失败,需要重试3次,重试的时间间隔10000ms
azkaban.project
azkaban-flow-version: 2.0
编写basic.flow
retries重试次数
retry.backoff:重试的时间间隔
nodes:
- name: JobA
type: command
config:
command: sh /not_exists.sh
retries: 3
retry.backoff: 10000
将azkaban.project和basic.flow文件压缩到一个zip文件夹,文件夹必须是英文
重复上述第一个hello world操作
手动失败重试操作
目标:JobA->JobB(依赖于A)->JobC->JobD->JobE->JobF。生产环境中任何Job都有可能挂掉,可以根据需求执行想要执行的Job
azkaban.project
azkaban-flow-version: 2.0
编写basic.flow
retries重试次数
retry.backoff:重试的时间间隔
nodes:
- name: JobA
type: command
config:
command: echo "This is JobA."
- name: JobB
type: command
dependsOn:
- JobA
config:
command: echo "This is JobB."
- name: JobC
type: command
dependsOn:
- JobB
config:
command: echo "This is JobC."
- name: JobD
type: command
dependsOn:
- JobC
config:
command: echo "This is JobD."
- name: JobE
type: command
dependsOn:
- JobD
config:
command: echo "This is JobE."
- name: JobF
type: command
dependsOn:
- JobE
config:
command: echo "This is JobF."
将azkaban.project和basic.flow文件压缩到一个zip文件夹,文件夹必须是英文
重复上述第一个hello world操作
JavaProcess作业类型操作
JavaProcess类型可以运行一个自定义主类方法,type类型为javaprocess,可用的配置为
- Xms:最小堆
- Xmx:最大堆
- classpath:类路径
- java.class:要运行的Java对象,其中必须包含Main方法
- main.args:main方法的参数
创建一个azkaban的maven工程
创建测试类
public class AzTest {
public static void main(String[] args) {
System.out.printf("this is azkaban java process test");
}
}
打成jar包
maven的pom文件添加如下内容,然后maven package
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
新建basic.flow文件
azkaban-flow-version: 2.0
新建basic.flow文件
Xms:最小堆
Xmx:最大堆
java.class:要运行的Java对象,其中必须包含Main方法
nodes:
- name: test_java
type: javaprocess
config:
Xms: 96M
Xmx: 200M
java.class: czs.study.azkaban.AzTest
将azkaban.project和basic.flow文件压缩到一个zip文件夹,文件夹必须是英文
重复上述第一个hello world操作
Azkaban条件工作流
条件工作流功能允许用户自定义执行条件来决定是否运行某些Job。条件可以由当前Job的父Job输出的运行时参数构成,也可以使用预定义宏。在这些条件下,用户可以在确定Job执行逻辑时获得更大的灵活性,例如,只要父Job之一成功,就可以运行当前Job
运行时参数操作
基本原理:父Job将参数写入JOB_OUTPUT_PROP_FILE环境变量所指向的文件,子Job使用 ${jobName:param}来获取父Job输出的参数并定义执行条件,支持的条件运算符如下:
== 等于
!= 不等于
> 大于
>= 大于等于
< 小于
<= 小于等于
&& 与
|| 或
! 非
目标:JobA执行一个shell脚本,JobB执行一个shell脚本,但JobB不需要每天都执行,而只需要每个周一执行。
新建JobA.sh
#!/bin/bash
echo "do JobA"
wk=`date +%w`
echo "{\"wk\":$wk}" > $JOB_OUTPUT_PROP_FILE
新建JobB.sh
#!/bin/bash
echo "do JobB"
新建condition.flow
nodes:
- name: JobA
type: command
config:
command: sh JobA.sh
- name: JobB
type: command
dependsOn:
- JobA
config:
command: sh JobB.sh
condition: ${JobA:wk} == 1
将JobA.sh、JobB.sh、condition.flow和azkaban.project打包成condition.zip
创建condition项目->上传condition.zip文件->执行作业
预定义宏操作
Azkaban中预置了几个特殊的判断条件,称为预定义宏,预定义宏会根据所有父Job的完成情况进行判断,再决定是否执行。可用的预定义宏如下:
- all_success: 表示父Job全部成功才执行(默认)
- all_done:表示父Job全部完成才执行
- all_failed:表示父Job全部失败才执行
- one_success:表示父Job至少一个成功才执行
- one_failed:表示父Job至少一个失败才执行
目标:JobA执行一个shell脚本,JobB执行一个shell脚本,JobC执行一个shell脚本,要求JobA、JobB中有一个成功即可执行
新建JobA.sh
#!/bin/bash
echo "do JobA"
新增JobC.sh
#!/bin/bash
echo "do JobC"
新建macro.flow
nodes:
- name: JobA
type: command
config:
command: sh JobA.sh
- name: JobB
type: command
config:
command: sh JobB.sh
- name: JobC
type: command
dependsOn:
- JobA
- JobB
config:
command: sh JobC.sh
condition: one_success
JobA.sh、JobC.sh、macro.flow、azkaban.project文件,没有JobB.sh,打包
创建macro项目->上传macro.zip文件->执行作业
Azkaban邮件告警
QQ邮箱开启SMTP服务
进入QQ邮箱-账号即可看到,一定要记住生成的授权码
在azkaban-web节点上,编辑azkaban.properties
vim /opt/module/azkaban/azkaban-web/conf/azkaban.properties
保存并重启web-server
bigdata100> bin/shutdown-web.sh
bigdata100> bin/start-web.sh
编写basic.flow
nodes:
- name: jobA
type: command
config:
command: echo "This is an email test."
将azkaban.project和basic.flow压缩成email.zip
测试邮箱告警效果