Azkaban的简单语法

Azkaban的使用说明

简单介绍

1 Azkaban介绍
1)一个完整的数据分析系统通常都是由大量任务单元组成:
Shell脚本程序,Java程序,MapReduce程序、Hive脚本等
2)各任务依赖关系,为了很好地组织起这样的复杂执行计划,需要一个工作流调度系统来调度执行;

2 常见工作流调度系统
1)简单的任务调度:直接使用Linux的Crontab来定义;
2)复杂的任务调度:使用现成的开源调度系统,比如Ooize、Azkaban、 Airflow、DolphinScheduler等。
3 Azkaban与Oozie对比
两种调度器,给出以下详细对比。总体来说,Ooize相比Azkaban是一个重量级的任务调度系统,功能全面,但配置使用也更复杂。轻量级调度器Azkaban是很不错的候选对象。

初步使用

1 Azkaban初操作
1.1 集群模式安装 上传tar包
1)将azkaban-db-3.84.4.tar.gz,azkaban-exec-server-3.84.4.tar.gz,azkaban-web-server-3.84.4.tar.gz上传到hadoop12的/data/soft路径
[ningzhen@hadoop12 soft]$ ll
2)新建/data/module/azkaban目录,并将所有tar包解压到这个目录下
[ningzhen@hadoop12 soft]$ mkdir /data/module/azkaban
3)解压azkaban-db-3.84.4.tar.gz、 azkaban-exec-server-3.84.4.tar.gz和azkaban-web-server-3.84.4.tar.gz到/data/module/azkaban目录下
[ningzhen@hadoop12 soft]$ tar -zxvf azkaban-db-3.84.4.tar.gz -C /data/module/azkaban/
[ningzhen@hadoop12 soft]$ tar -zxvf azkaban-exec-server-3.84.4.tar.gz -C /data/module/azkaban/
[ningzhen@hadoop12 soft]$ tar -zxvf azkaban-web-server-3.84.4.tar.gz -C /data/module/azkaban/
4)进入到/opt/module/azkaban目录,依次修改名称
[ningzhen@hadoop12 azkaban]$ mv azkaban-exec-server-3.84.4/ azkaban-exec
[ningzhen@hadoop12 azkaban]$ mv azkaban-web-server-3.84.4/ azkaban-web
1.2 配置MySQL
1)正常安装MySQL
2)启动MySQL
[ningzhen@hadoop12 azkaban]$ mysql -uroot -proot
3)登陆MySQL,创建Azkaban数据库
mysql> create database azkaban;
4)创建azkaban用户并赋予权限
设置密码有效长度4位及以上
mysql> set global validate_password_length=4;
设置密码策略最低级别
mysql> set global validate_password_policy=0;
创建Azkaban用户,任何主机都可以访问Azkaban,密码是root
mysql> CREATE USER ‘azkaban’@’%’ IDENTIFIED BY ‘root’;
赋予Azkaban用户增删改查权限
mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON azkaban.* to ‘azkaban’@’%’ WITH GRANT OPTION;
赋予Azakban用户远程访问权限
mysql> grant all privileges on azkaban.* to ‘azkaban’@’%’ identified by ‘root’ with grant option;
5)创建Azkaban表,完成后退出MySQL
mysql> use azkaban;
mysql> source /data/module/azkaban/azkaban-db-3.84.4/create-all-sql-3.84.4.sql
mysql> quit;
6)更改MySQL包大小;防止Azkaban连接MySQL阻塞
[ningzhen@hadoop12 softe]$ sudo vim /etc/my.cnf
在[mysqld]下面加一行max_allowed_packet=1024M
[mysqld]
max_allowed_packet=1024M
8)重启MySQL
[ningzhen@hadoop12 soft]$ sudo systemctl restart mysqld
1.3 配置Executor Server
Azkaban Executor Server处理工作流和作业的实际执行。
1)编辑azkaban.properties
[ningzhen@hadoop12 azkaban]$ vim /data/module/azkaban/azkaban-exec/conf/azkaban.properties
修改如下标红的属性
#…
default.timezone.id=Asia/Shanghai
#…
azkaban.webserver.url=http://hadoop12:8081

executor.port=12321
#…
database.type=mysql
mysql.port=3306
mysql.host=hadoop12
mysql.database=azkaban
mysql.user=azkaban
mysql.password=root
mysql.numconnections=100
在最后添加
executor.metric.reports=true
executor.metric.milisecinterval.default=60000
2)同步azkaban-exec到所有节点
[ningzhen@hadoop12 azkaban]$ xsync /data/module/azkaban/azkaban-exec
3)必须进入到/data/module/azkaban/azkaban-exec路径,分别在三台机器上,启动executor server
[ningzhen@hadoop02 azkaban-exec]$ bin/start-exec.sh
[ningzhen@hadoop13 azkaban-exec]$ bin/start-exec.sh
[ningzhen@hadoop14 azkaban-exec]$ bin/start-exec.sh
注意:如果在/data/module/azkaban/azkaban-exec目录下出现executor.port文件,说明启动成功
4)下面激活executor,需要
[ningzhen@hadoop12 azkaban-exec]$ curl -G “hadoop12:$(<./executor.port)/executor?action=activate” && echo

[ningzhen@hadoop13 azkaban-exec]$ curl -G “hadoop13:$(<./executor.port)/executor?action=activate” && echo

[ningzhen@hadoop14 azkaban-exec]$ curl -G “hadoop14:$(<./executor.port)/executor?action=activate” && echo

如果三台机器都出现如下提示,则表示激活成功
{“status”:“success”}
2.1.4 配置Web Server
Azkaban Web Server处理项目管理,身份验证,计划和执行触发。
1)编辑azkaban.properties
[ningzhen@hadoop12 azkaban]$ vim /data/module/azkaban/azkaban-web/conf/azkaban.properties
修改如下属性

default.timezone.id=Asia/Shanghai

database.type=mysql
mysql.port=3306
mysql.host=hadoop12
mysql.database=azkaban
mysql.user=azkaban
mysql.password=root
mysql.numconnections=100

azkaban.executorselector.filters=StaticRemainingFlowSize,CpuStatus
说明:
azkaban.executorselector.filters: 当有多个Executor同时启动的时候,需要从中选择一个Executor去执行任务,这里设置一组过滤器的种类,不满足要求的Executor就不会被分配任务
#StaticRemainingFlowSize:正在排队的任务数;
#CpuStatus:CPU占用情况
#MinimumFreeMemory:内存占用情况。测试环境,必须将MinimumFreeMemory删除掉,否则它会认为集群资源不够,不执行。
2)必须进入到hadoop12的/data/module/azkaban/azkaban-web路径,启动web server
[ningzhen@hadoop12 azkaban-web]$ bin/start-web.sh
4)访问http://hadoop12:8081,并用ningzhen用户登陆
2 Work Flow案例实操
2.1 HelloBigdata案例
1)在windows环境,新建azkaban.project文件,编辑内容如下
azkaban-flow-version: 2.0
注意:该文件作用,是采用新的Flow-API方式解析flow文件。
2)新建basic.flow文件,内容如下
nodes:

  • name: jobA
    type: command
    config:
    command: echo “Hello bigdata”
    (1)Name:job名称
    (2)Type:job类型。command表示你要执行作业的方式为命令
    (3)Config:job配置
    3)将azkaban.project、basic.flow文件压缩到一个zip文件,文件名称必须是英文。

4)在WebServer新建项目:http://hadoop12:8081/index

5)给项目名称命名和添加项目描述

6)first.zip文件上传

7)选择上传的文件

8)执行任务流

9)在日志中,查看运行结果

2.2 作业依赖案例
需求:JobA和JobB执行完了,才能执行JobC
具体步骤:
1)修改basic.flow为如下内容
nodes:

  • name: jobC
    type: command
    #jobC 依赖 JobA和JobB
    dependsOn:

    • jobA
    • jobB
      config:
      command: echo “I’m java”
  • name: jobA
    type: command
    config:
    command: echo “I’m python”

  • name: jobB
    type: command
    config:
    command: echo “I’m bigdata”
    (1)dependsOn:作业依赖,后面案例中演示
    2)将修改后的basic.flow和azkaban.project压缩成second.zip文件

3)重复2.1HelloBigdata后续步骤。

2.3 内嵌工作流案例
需求:JobA执行完后执行JobB,JobA和JobB形成一个工作流embedded_flow;JobC依赖于embedded_flow该工作流。
1)工作流定义文件中可以添加子工作流,例如:
nodes:

  • name: jobC
    type: command
    #jobC 依赖embedded_flow
    dependsOn:

    • embedded_flow
      config:
      command: echo “I’m JobC”
  • name: embedded_flow
    type: flow
    nodes:

    • name: jobB
      type: noop
      dependsOn:

      • jobA
    • name: jobA
      type: command
      config:
      command: pwd
      参数说明:
      type: 作业类型。flow表示,定义为工作流类型
      type: noop 什么也不处理
      2)将修改后的basic.flow和azkaban.project压缩成three.zip文件

3)重复2.1HelloBigdata后续步骤。

2.4 自动失败重试案例
例:如果执行任务失败,需要重试3次,重试的时间间隔10000ms
具体步骤:
1)编译配置流
nodes:

  • name: JobA
    type: command
    config:
    command: sh /not_exists.sh
    retries: 3
    retry.backoff: 10000
    参数说明:
    retries:重试次数
    retry.backoff:重试的时间间隔
    2)将修改后的basic.flow和azkaban.project压缩成four.zip文件

3)重复2.3.1节HelloWorld后续步骤。

4)执行并观察到一次失败+三次重试

5)也可以点击上图中的Log,在任务日志中看到,总共执行了4次。

6)也可以在Flow全局配置中添加任务失败重试配置,此时重试配置会应用到所有Job。
案例如下:
config:
retries: 3
retry.backoff: 10000
nodes:

  • name: JobA
    type: command
    config:
    command: sh /not_exists.sh
    2.2.5 手动失败重试案例
    例:JobA=>JobB=>JobC=>JobD=>JobE=>JobF。生产环境,任何Job都有可能挂掉,可以根据需求执行想要执行的Job。
    具体步骤:
    1)编译配置流
    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.”
      2)将修改后的basic.flow和azkaban.project压缩成five.zip文件

3)重复2.3HelloBigdata后续步骤。

Enable和Disable下面都分别有如下参数:
Parents:该作业的上一个任务
Ancestors:该作业前的所有任务
Children:该作业后的一个任务
Descendents:该作业后的所有任务
Enable All:所有的任务
4)可以根据需求选择性执行对应的任务。

Azkaban进阶

1.1 JavaProcess作业类型案例
JavaProcess类型可以运行一个自定义主类方法,type类型为javaprocess,可用的配置为:
Xms:最小堆
Xmx:最大堆
java.class:要运行的Java对象,其中必须包含Main方法
案例:
1)新建一个azkaban的maven工程
2)创建包名:com. ningzhen
3)创建AzTest类
package com. ningzhen;

public class AzTest {
public static void main(String[] args) {
System.out.println(“This is for testing!”);
}
}
4)打包成jar包azkaban-1.0-SNAPSHOT.jar
5)新建testJava.flow,内容如下
nodes:

  • name: test_java
    type: javaprocess
    config:
    Xms: 96M
    Xmx: 200M
    java.class: com.atguigu.AzTest
    6)将Jar包、flow文件和project文件打包成javatest.zip
    7)创建项目=》上传javatest.zip =>执行作业=>观察结果
    1.2 条件工作流案例
    条件工作流功能允许用户根据条件指定是否运行某些作业。条件由先前作业的运行时参数(例如输出)和预定义宏组成。

1.2.1 运行时参数案例
1)运行时参数一般指作业的输出,使用时有以下几个条件:
(1)使用 $ {jobName:param}来定义作业运行时参数的条件
(2)“:” 用于分隔jobName和参数
(3)job运行时,使用参数与条件中的字符串或数字进行比较
(4)用户需要事先将参数的值写入$ JOB_OUTPUT_PROP_FILE
2)支持的运算符:
(1)== 等于
(2)!= 不等于
(3)> 大于
(4)>= 大于等于
(5)< 小于
(6)<= 小于等于
(7)&& 与
(8)|| 或
(9)! 非
3)案例:
JobA执行一个shell脚本;
JobB条件依赖于JobA,当JobA中param1的值为“BBB”,执行JobB;
JobC也条件依赖于JobA,当JobA中param1的值为“CCC”,执行JobC

(1)新建basic.flow
nodes:

- name: JobA
   type: command
   config:
     command: sh write_to_parameter.sh

 - name: JobB
   type: command
   dependsOn:
     - JobA
   config:
     command: echo "This is JobB."
   condition: ${JobA:param1} == "BBB"

 - name: JobC
   type: command
   dependsOn:
     - JobA
   config:
     command: echo "This is JobC."
   condition: ${JobA:param1} == "CCC"

(2)新建write_to_ parameter.sh,内容为:
echo ‘{“param1”:“BBB”}’ > $ JOB_OUTPUT_PROP_FILE
(3)将write_to_ parameter.sh、basic.flow和azkaban.project打包成parameter.zip

(4)按照我们设定的条件,由于JobA输出为BBB,所以会执行JobB分支。上传执行,注意观察分支条件:

1.2.2 预定义宏案例
预定义宏将会在所有父作业上评估,即YAML文件中的dependsOn部分。可用的预定义宏如下:
(1)all_success: 全部成功(默认)
(2)all_done:全部完成
(3)all_failed:全部失败
(4)one_success:至少一个成功
(5)one_failed:至少一个失败
1)案例
需求:
JobA执行一个shell脚本;
JobB条件依赖于JobA,当JobA中param1的值为“BBB”,执行JobB;
JobC也条件依赖于JobA,当JobA中param1的值为“CCC”,执行JobC
JobD依赖于JobB、JobC,JobB和JobC有任何一个执行成功后,执行JobD。
JobE依赖于JobB、JobC,JobB和JobC都执行成功,执行JobE。
JobF依赖于JobB、JobC、JobD、JobE。JobB、JobC、JobD、JobE都执行完了,执行JobF。
(1)修改上个案例的basic.flow
nodes:

  • name: JobA
    type: command
    config:
    command: sh write_to_parameter.sh

  • name: JobB
    type: command
    dependsOn:

    • JobA
      config:
      command: echo “This is JobB.”
      condition: ${JobA:param1} == “BBB”
  • name: JobC
    type: command
    dependsOn:

    • JobA
      config:
      command: echo “This is JobC.”
      condition: ${JobA:param1} == “CCC”
  • name: JobD
    type: command
    dependsOn:

    • JobB
    • JobC
      config:
      command: echo “This is JobD.”
      condition: one_success
  • name: JobE
    type: command
    dependsOn:

    • JobB
    • JobC
      config:
      command: echo “This is JobE.”
      condition: all_success
  • name: JobF
    type: command
    dependsOn:

    • JobB
    • JobC
    • JobD
    • JobE
      config:
      command: echo “This is JobF.”
      condition: all_done
      (2)basic.flow、azkaban.project和write_to_parameter.sh文件,打包成condition.zip。
      (3)创建condition项目=>上传condition.zip文件=>执行作业=>观察结果

1.3 定时执行案例
需求:JobA每间隔1分钟执行一次;
具体步骤:
1)Azkaban可以定时执行工作流。在执行工作流时候,选择左下角Schedule

2)右上角注意时区是上海,然后在左面填写具体执行事件,填写的方法和crontab配置定时任务规则一致。

3)观察结果

4)删除定时调度
点击remove Schedule即可删除当前任务的调度规则。

1.4 邮件报警案例
1.4.1 注册邮箱
1)申请注册一个126邮箱
2)点击邮箱账号=>账号管理

3)开启SMTP服务

4)一定要记住授权码

1.4.2 默认邮件报警案例
Azkaban默认支持通过邮件对失败的任务进行报警,配置方法如下:
1)在azkaban-web节点hadoop12上,编辑/data/module/azkaban/azkaban-web/conf/azkaban.properties,修改如下内容:
[ ningzhen@hadoop12 azkaban-web]$ vim /data/module/azkaban/azkaban-web/conf/azkaban.properties
添加如下内容:
#这里设置邮件发送服务器,需要 申请邮箱,切开通stmp服务,以下只是例子
mail.sender= ningzhen@126.com
mail.host=smtp.126.com
mail.user= ningzhen@126.com
mail.password=用邮箱的授权码

#这里设置工作流成功或者失败默认向哪里发送服务
job.failure.email= ningzhen@126.com
job.success.email= ningzhen@126.com
2)保存并重启web-server。
[ ningzhen@hadoop12 azkaban-web]$ bin/shutdown-web.sh
[ ningzhen@hadoop12 azkaban-web]$ bin/start-web.sh
3)编辑basic.flow,加入如下属性:
nodes:

  • name: jobA
    type: command
    config:
    command: echo “This is an email test.”
    failure.emails: ningzhen@126.com
    success.emails: ningzhen@126.com
    notify.emails: ningzhen@126.com
    4)将azkaban.project和basic.flow压缩成email.zip
    5)创建工程=>上传文件=>执行作业=>查看结果

default.timezone.id=Asia/Shanghai

database.type=mysql
mysql.port=3306
mysql.host=hadoop12
mysql.database=azkaban
mysql.user=azkaban
mysql.password=root
mysql.numconnections=100

azkaban.executorselector.filters=StaticRemainingFlowSize,CpuStatus
说明:
azkaban.executorselector.filters: 当有多个Executor同时启动的时候,需要从中选择一个Executor去执行任务,这里设置一组过滤器的种类,不满足要求的Executor就不会被分配任务
#StaticRemainingFlowSize:正在排队的任务数;
#CpuStatus:CPU占用情况
#MinimumFreeMemory:内存占用情况。测试环境,必须将MinimumFreeMemory删除掉,否则它会认为集群资源不够,不执行。
2)修改azkaban-users.xml文件,添加 ningzhen用户
[ ningzhen@hadoop12 azkaban-web]$ vim /data/module/azkaban/azkaban-web/conf/azkaban-users.xml

3)必须进入到hadoop102的/data/module/azkaban/azkaban-web路径,启动web server [ ningzhen@hadoop12 azkaban-web]$ bin/start-web.sh 4)访问http://hadoop12:8081,并用 ningzhen用户登陆

努力加油

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值