2.2.3 自动失败重试案例
需求:如果执行任务失败,需要重试 3 次,重试的时间间隔 10000ms
具体步骤:
- 编译配置流
参数说明:
- retries:重试次数
- retry.backoff:重试的时间间隔
2)将修改后的 basic.flow 和 azkaban.project 压缩成 four.zip 文件
3)重复 2.3.1 节 HelloWorld 后续步骤。
4)执行并观察到一次失败+三次重试
5)也可以点击上图中的 Log,在任务日志中看到,总共执行了 4 次。
6)也可以在 Flow 全局配置中添加任务失败重试配置,此时重试配置会应用到所有 Job。
案例如下:
2.2.4 手动失败重试案例
需求:JobA=》JobB(依赖于 A)=》JobC=》JobD=》JobE=》JobF。生产环境,任何 Job 都
有可能挂掉,可以根据需求执行想要执行的 Job。
具体步骤:
1)编译配置流
2)将修改后的 basic.flow 和 azkaban.project 压缩成 five.zip 文件
3)重复 2.3.1 节 HelloWorld 后续步骤。
Enable 和 Disable 下面都分别有如下参数:
Parents:该作业的上一个任务
Ancestors:该作业前的所有任务
Children:该作业后的一个任务
Descendents:该作业后的所有任务
Enable All:所有的任务
4)可以根据需求选择性执行对应的任务。
第 3 章 Azkaban 进阶
3.1 JavaProcess 作业类型案例
JavaProcess 类型可以运行一个自定义主类方法,type 类型为 javaprocess,可用的配置为:
Xms:最小堆
Xmx:最大堆
classpath:类路径
java.class:要运行的 Java 对象,其中必须包含 Main 方法
main.args:main 方法的参数(可以传多个值,空格分隔)
案例:
1)新建一个 azkaban 的 maven 工程
2)创建包名:com.atguigu
3)创建 AzTest 类
package com.atguigu; 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
骚戴理解:在Azkaban中,如果在使用JavaProcess类型的作业时没有指定classpath,将默认使用系统变量CLASSPATH的值作为classpath。如果系统变量CLASSPATH未设置,则默认使用当前目录作为classpath。
6)将 Jar 包、flow 文件和 project 文件打包成 javatest.zip
7)创建项目=》上传 javatest.zip =》执行作业=》观察结果
3.2 条件工作流案例
条件工作流功能允许用户自定义执行条件来决定是否运行某些Job。
条件可以由当前Job的父 Job 输出的运行时参数构成
条件可以使用预定义宏。
在这些条件下,用户可以在确定 Job执行逻辑时获得更大的灵活性,例如,只要父 Job 之一成功,就可以运行当前 Job。
骚戴理解:例如有三个job,分别是jobA,jobB,jobC,其中jobC依赖于jobA和jobB,默认jobC运行的条件就是jobA和jobB都执行完了,才会执行jobC。但是通过条件工作流功能就可以实现只要jobA和jobB有一个执行完就执行jobC的效果。
预定义宏指的是一些预先定义好的变量,在Azkaban中被用来传递信息和简化工作流的配置。这些预定义宏可以用于工作流文件的各个部分(例如任务命令行中的参数、电子邮件通知模板等),以便在运行时根据需要进行替换。使用预定义宏可以减少重复编码,提高可维护性和灵活性。Azkaban自带了一些预定义宏(例如${jobId}表示当前任务的ID、${startTime}表示任务开始时间等),用户还可以自定义自己的预定义宏。
3.2.1 运行时参数案例
1)基本原理
(1)父 Job 将参数写入 JOB_OUTPUT_PROP_FILE 环境变量所指向的文件
(2)子 Job 使用 ${jobName:param}来获取父 Job 输出的参数并定义执行条件
2)支持的条件运算符:
(1)== 等于
(2)!= 不等于
(3)> 大于
(4)>= 大于等于
(5)< 小于
(6)<= 小于等于
(7)&& 与
(8)|| 或
(9)! 非
3)案例:
需求:
JobA 执行一个 shell 脚本。
JobB 执行一个 shell 脚本,但 JobB 不需要每天都执行,而只需要每个周一执行。
(1)新建 JobA.sh
#!/bin/bash echo "do JobA" wk=`date +%w` echo "{\"wk\":$wk}" > $JOB_OUTPUT_PROP_FILE
骚戴理解:这里date +%w是获取当前是星期几,返回数据,其中周日返回0,其他1-6。然后用梵引`把值赋予给wk变量,最后通过josn的格式把wk写到JOB_OUTPUT_PROP_FILE环境变量里,其中\"是转义后的双引号。这里的思路是jobA获取当前日期然后写到JOB_OUTPUT_PROP_FILE中,jobB去获取jobA传过来的日期,然后进行判断,注意jobA的日期和jobB的日期是同一天
(2)新建 JobB.sh
1. #!/bin/bash 2. echo "do JobB
(3)新建 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
(4)将 JobA.sh、JobB.sh、condition.flow 和 azkaban.project 打包成 condition.zip
(5)创建 condition 项目=》上传 condition.zip 文件=》执行作业=》观察结果
(6)按照我们设定的条件,JobB 会根据当日日期决定是否执行。
3.2.2 预定义宏案例
Azkaban 中预置了几个特殊的判断条件,称为预定义宏。
预定义宏会根据所有父 Job 的完成情况进行判断,再决定是否执行。可用的预定义宏如下:
(1)all_success: 表示父 Job 全部成功才执行(默认)
(2)all_done:表示父 Job 全部完成才执行
(3)all_failed:表示父 Job 全部失败才执行
(4)one_success:表示父 Job 至少一个成功才执行
(5)one_failed:表示父 Job 至少一个失败才执行
1)案例
需求:
JobA 执行一个 shell 脚本
JobB 执行一个 shell 脚本
JobC 执行一个 shell 脚本,要求 JobA、JobB 中有一个成功即可执行
(1)新建 JobA.sh
#!/bin/bash echo "do JobA"
(2)新建 JobC.sh
1. #!/bin/bash 2. echo "do JobC"
(3)新建 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
(4)JobA.sh、JobC.sh、macro.flow、azkaban.project 文件,打包成 macro.zip。
注意:没有 JobB.sh。
(5)创建 macro 项目=》上传 macro.zip 文件=》执行作业=》观察结果