Java大作业致谢 javawab大作业_hadoop


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