1 JavaProcess作业类型案例
JavaProcess类型可以运行一个自定义主类方法,type类型为javaprocess,可用的配置为:
Xms:最小堆
Xmx:最大堆
java.class:要运行的Java对象,其中必须包含Main方法
案例:
1)新建一个azkaban的maven工程
2)创建包名:com.bigdata
3)创建AzTest类
package com.bigdata;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.bigdata.AzTest
6)将Jar包、flow文件和project文件打包成javatest.zip
7)创建项目=》上传javatest.zip =》执行作业=》观察结果
2 条件工作流案例
条件工作流功能允许用户根据条件指定是否运行某些作业。条件由先前作业的运行时参数(例如输出)和预定义宏组成。在这些条件下,用户可以在确定作业执行逻辑时获得更大的灵活性。例如,只要父作业之一成功,他们就可以运行当前作业。他们可以在工作流内部实现分支逻辑。
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分支。上传执行,注意观察分支条件:
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文件=》执行作业=》观察结果
3 定时执行案例
需求:JobA每间隔1分钟执行一次;
具体步骤:
1)Azkaban可以定时执行工作流。在执行工作流时候,选择左下角Schedule
2)右上角注意时区是上海,然后在左面填写具体执行事件,填写的方法和crontab配置定时任务规则一致。
3)观察结果
4)删除定时调度
点击remove Schedule即可删除当前任务的调度规则。
4 邮件报警案例
4.1 注册邮箱
1)申请注册一个126邮箱
2)点击邮箱账号=》账号管理
3)开启SMTP服务
4)一定要记住授权码
4.2 默认邮件报警案例
Azkaban默认支持通过邮件对失败的任务进行报警,配置方法如下:
1)在azkaban-web节点hadoop102上,编辑/opt/module/azkaban/azkaban-web/conf/azkaban.properties,修改如下内容:
[bigdata@hadoop102 azkaban-web]$ vim /opt/module/azkaban/azkaban-web/conf/azkaban.properties
添加如下内容:
#这里设置邮件发送服务器,需要 申请邮箱,切开通stmp服务,以下只是例子mail.sender=bigdata@126.commail.host=smtp.126.commail.user=bigdata@126.commail.password=用邮箱的授权码#这里设置工作流成功或者失败默认向哪里发送服务job.failure.email=bigdata@126.comjob.success.email=bigdata@126.com
2)保存并重启web-server。
[bigdata@hadoop102 azkaban-web]$ bin/shutdown-web.sh
[bigdata@hadoop102 azkaban-web]$ bin/start-web.sh
3)编辑basic.flow,加入如下属性:
nodes: - name: jobA type: command config: command: echo "This is an email test." failure.emails: bigdata@126.com success.emails: bigdata@126.com notify.emails: bigdata@126.com
4)将azkaban.project和basic.flow压缩成email.zip
5)创建工程=》上传文件=》执行作业=》查看结果
6)观察邮箱,发现执行成功或者失败的邮件
5 自定义报警案例
5.1 第三方告警平台集成
有时任务执行失败后邮件报警接收不及时,需要自定义报警装置,比如电话报警。此时需要首先找一个电话通知服务商,比如http://www.onealert.com/,购买相应服务后,获取通知API。然后进行MailAlter二次开发。
1)onealert官网注册账号
2)配置告警RestAPI
3)获取密钥key和API 地址
4)配置分派策略
5)配置通知策略
5.2 自定义告警插件代码开发
1)新建一个普通的Java项目,alerter
2)创建包名:com.bigdata
3)在项目的lib里添加4个Jar包:
4)复制以上4个Jar包到lib包下,并添加到工程
5)新建com.bigdata.PhoneAlter类,并实现azkaban.alert.Alerter接口
package com.bigdata;import azkaban.alert.Alerter;import azkaban.executor.ExecutableFlow;import azkaban.executor.Executor;import azkaban.executor.ExecutorManagerException;import azkaban.sla.SlaOption;import azkaban.utils.Props;import com.google.gson.JsonObject;import org.apache.log4j.Logger;import java.util.List;public class PhoneAlterter implements Alerter { private static final Logger logger = Logger.getLogger(PhoneAlterter.class); private String appKey; private String url; public PhoneAlterter(Props props) { appKey = props.getString("my.alert.appKey", ""); url = props.getString("my.alert.url", ""); logger.info("Appkey: " + appKey); logger.info("URL: " + url); } /** * 成功的通知 * * @param exflow * @throws Exception */ @Override public void alertOnSuccess(ExecutableFlow exflow) throws Exception { } /** * 出现问题的通知 * * @param exflow * @param extraReasons * @throws Exception */ @Override public void alertOnError(ExecutableFlow exflow, String... extraReasons) throws Exception { //一般来说网络电话服务都是通过HTTP请求发送的,这里可以调用shell发送HTTP请求 JsonObject alert = new JsonObject(); alert.addProperty("app", appKey); alert.addProperty("eventId", exflow.getId()); alert.addProperty("eventType", "trigger"); alert.addProperty("alarmContent", exflow.getId() + " fails!"); alert.addProperty("priority", "2"); String[] cmd = new String[8]; cmd[0] = "curl"; cmd[1] = "-H"; cmd[2] = "Content-type: application/json"; cmd[3] = "-X"; cmd[4] = "POST"; cmd[5] = "-d"; cmd[6] = alert.toString(); cmd[7] = url; logger.info("Sending phone alert!"); Runtime.getRuntime().exec(cmd); } /** * 首次出现问题的通知 * * @param exflow * @throws Exception */ @Override public void alertOnFirstError(ExecutableFlow exflow) throws Exception { } @Override public void alertOnSla(SlaOption slaOption, String slaMessage) throws Exception { } @Override public void alertOnFailedUpdate(Executor executor, List executions, ExecutorManagerException e) { }}
6)打包
在out/artifacts目录下找到alerter.jar。
7)新建/opt/module/azkaban/azkaban-web/plugin/alerter/phone-alerter文件夹,并在内部新建conf和lib两个目录
[bigdata@hadoop102 azkaban-web]$ mkdir -p /opt/module/azkaban/azkaban-web/plugins/alerter/phone-alerter/conf
[bigdata@hadoop102 azkaban-web]$ mkdir -p /opt/module/azkaban/azkaban-web/plugins/alerter/phone-alerter/lib
8)在新建的conf目录里,新建plugin.properties
[bigdata@hadoop102 conf]$ vim plugin.properties
添加如下内容
#name一定要设置email,用以覆盖默认的邮件报警alerter.name=emailalerter.external.classpaths=libalerter.class=com.bigdata.PhoneAlterter#这两个参数和你使用的AlertAPI有关系my.alert.appKey=cf3e2ce2-40ba-c3cd-1c74-xxxxxxxxxxxxmy.alert.url=http://api.aiops.com/alert/api/event
9)将代码打包,并将alerter.jar上传到/opt/module/azkaban/azkaban-web/lib文件夹,并重启web服务。
[bigdata@hadoop102 azkaban-web]$ bin/shutdown-web.sh
[bigdata@hadoop102 azkaban-web]$ bin/start-web.sh