Azkaban:Flow2.0 与报警机制超实用用法大揭秘,启动脚本优化让效率飙升

在大数据时代,数据处理和任务调度变得越来越复杂。为了高效地管理和执行各种任务,我们需要强大的工具来进行任务编排和调度。Azkaban 就是这样一个强大的任务调度和编排工具,它可以帮助我们轻松地管理和执行各种复杂的任务。本文将深入探讨 Azkaban 的 Flow 2.0 用法、报警机制以及脚本优化问题,并通过实际案例和代码演示来帮助读者更好地理解和应用 Azkaban。

一、Azkaban 简介

(一)什么是 Azkaban

Azkaban 是一个开源的工作流调度系统,用于在分布式环境中管理和执行复杂的任务流。它提供了一个可视化的界面,方便用户创建、调度和监控任务流。Azkaban 支持多种任务类型,包括 shell 脚本、Java 程序、Hive 脚本、Spark 任务等。

(二)Azkaban 的特点

1.简单易用:Azkaban 提供了一个直观的可视化界面,方便用户创建、调度和监控任务流。用户可以通过拖拽的方式创建任务流,无需编写复杂的代码。

2.强大的任务调度功能:Azkaban 支持多种任务调度方式,包括定时调度、依赖调度等。用户可以根据自己的需求设置任务的执行时间和依赖关系,确保任务按照正确的顺序执行。

3.高可靠性:Azkaban 采用了分布式架构,具有高可靠性和容错性。即使某个节点出现故障,任务也能够继续执行,不会影响整个系统的运行。

4.易于扩展:Azkaban 提供了丰富的插件机制,用户可以根据自己的需求扩展系统的功能。例如,用户可以开发自己的任务类型插件,实现对特定任务的支持。

二、Flow 2.0 的用法

(一)小试牛刀

需要创建两个文件 JobA.flow JobA.project

在JobA.project中编写一句话:

azkaban-flow-version: 2.0

在JobA.flow中,编写任务,需要注意YAML语句:

nodes:
   - name: jobA
     type: command
     config:
        command: echo "this is a simple test"

注意事项:

如果是如下界面,选择如图所示:

打包两个文件到一个zip中:

 (二)YAML格式的数据 

听说过JSON、XML,后来出现YAML,作用跟json和xml是一样的都是一种文件,可以传递信息。

JSON  和  XML 都是用来存储和传输数据的。
JSON  存储数据,比如 datax中大量使用了json
        "reader": {
          "name": "mysqlreader",
          "parameter": {
            "username": "root",
            "password": "123456",
            "column": [
              "id",
              "age"
            ],
            "splitPk": "id",
            "connection": [
              {
                "table": [
                  "user"
                ],
                "jdbcUrl": [
                  "jdbc:mysql://192.168.52.12:3306/sqoop"
                ]
              }
            ]
          }
        }
编写好了一个json ,里面含有大量的信息,肯定是有人用了。用的人肯定解析了这个文件。
JSON 传输数据:   html --> Java(SSM SSH SpringBoot)
xml 也可以做到。但是慢慢的淘汰了。
这三类文件格式都可以充当配置文件(存储数据)
JSON:  core.json
XML : hdfs-site.xml
YAML : 即将开始

比如SpringBoot 里面支持两种配置文件:application.properties 和 application.yaml

1. 大小写敏感
2. 使用缩进表示层级关系 ;
3. 缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级;
4. 使用#表示注释 ;
5. 字符串默认不用加单双引号,但单引号和双引号都可以使用,双引号表示不需要对特殊字符进行转义;
6. YAML 中提供了多种常量结构,包括:整数,浮点数,字符串,NULL,日期,布尔,时间。
7、缩进不允许使用tab,只允许空格

语法格式:

表示对象:

# value 与 : 符号之间必须要有一个空格
key: value

map的写法: 

# 写法一 同一缩进的所有键值对属于一个map
key: 
      key1: value1
      key2: value2

# 写法二
{key1: value1, key2: value2}

数组的表示方式: 

# 写法一 使用一个短横线加一个空格代表一个数组项
- a
- b
- c

# 写法二
[a,b,c]

关于单双引号:

s1: '内容\n 字符串'
s2: "内容\n 字符串"

转换后:
{ s1: '内容\\n 字符串', s2: "内容\n 字符串" }

如果你想表示一个换行:
s1: "内容\n 字符串"
Flow 2.0 建议将公共参数定义在 `config` 下,并通过 `${}` 进行引用。
(三)多任务依赖

many.flow文件: 

nodes:
  - name: jobE
    type: command
    config:
      command: echo "This is job E"
    # jobE depends on jobD
    dependsOn: 
      - jobD
    
  - name: jobD
    type: command
    config:
      command: echo "This is job D"
    # jobD depends on jobA、jobB、jobC
    dependsOn:
      - jobA
      - jobB
      - jobC

  - name: jobA
    type: command
    config:
      command: echo "This is job A"

  - name: jobB
    type: command
    config:
      command: echo "This is job B"

  - name: jobC
    type: command
    config:
      command: echo "This is job C"

many.project文件:

azkaban-flow-version: 2.0

总结: 

 可以一次执行多个任务,也可以单独执行某个任务:

 总结:多任务编排,靠dependsOn 这个属性。

定时任务:

实战:将我们刚才的多任务的job,定时执行:

 (四)内嵌流(嵌套流)案例

Azkaban中一个流可以包含其他的流,方便分组和排序,也方便协作
因为在工作过程中不一定azkaban是你一个人在用,假如你的同事已经写好了好几个流,你需要放入到你的流文件中,可以直接copy,不需要修改其他的。

 不带参数传递的内嵌流的使用:、

neiqianflow.flow:

nodes:
  - name: jobC
    type: command
    config:
      command: echo "This is job C"
    dependsOn:
      - embedded_flow
  - name: embedded_flow
    type: flow
    nodes:
      - name: jobB
        type: command
        config:
          command: echo "This is job B"
        dependsOn:
          - jobA
      - name: jobA
        type: command
        config:
          command: echo "This is job A"

带有参数的内嵌流:

neiqianflow.flow:

nodes:
  - name: jobC
    type: command
    config:
      command: echo "This is job C"
    dependsOn:
      - embedded_flow

  - name: embedded_flow
    type: flow
    config:
      name: zhangsan
    nodes:
      - name: jobB
        type: command
        config:
          command: echo "This is job B ${name}"
        dependsOn:
          - jobA

      - name: jobA
        type: command
        config:
          command: echo "This is job A"

neiqianflow.project: 

azkaban-flow-version: 2.0

一定注意字符集,使用utf-8的无bom格式

(五)动态传参

代码演示:

nodes:
  - name: jobC
    type: command
    config:
      command: echo "This is job C"
    dependsOn:
      - test_flow
  - name: test_flow
    #此处是type=flow
    type: flow
    config:
      prop: ${canshu}
    #此处有nodes
    nodes:
      - name: jobB
        type: command
        config:
          command: echo "This is job B ${prop}"
        dependsOn:
          - jobA
      - name: jobA
        type: command
        config:
          command: echo "This is job A"

打包,上传

 

 三、Azkaban的报警机制

1)邮箱通知

必须有一个邮箱服务器,你想接受一个邮件,肯定是另一个邮箱给你发送的。

 

会获得一个码(在这里就不给大家展示了)

接着进行配置:在azkaban的 web-server 端,进行邮箱的配置:

mail.sender=18*******@163.com
mail.host=smtp.163.com
mail.user=186********@163.com
mail.password=MAGBDQDGKEHCBVQA

重启web-server服务。

执行一个任务的时候,就可以设置要接受的邮箱地址了。

 

 2)电话报警机制

睿象云-智能运维管理平台-智能运维系统-自动化运维性能监控平台

 

会生成一个appKey:

 

 

 

最后一个Azkaban的重试机制:

# 重试次数
retries: 3
# 每次重试时间间隔
retry.backoff: 10000


案例:
nodes:
   - name: jobA
     type: command
     config:
        command: echo "this is a simple test"
        retries: 3
        retry.backoff: 10000

 四、关于azkaban脚本优化的问题

目前遇到的问题:
1、启动azkaban的时候,需要启动两个甚至多个脚本,比较麻烦
    start-web.sh  start-exec.sh
2、日志查看没有放在一块,需要切换目录比较麻烦

优化方案:
编写一个脚本  azkaban.sh

源码如下:

#!/bin/bash
# 参数个数一个或者两个 not equal to --> ne
if  [ $# -lt 1 ] && [ $# -gt 2 ] 
then
echo -e  "\033[32mUsage1:\033[0m azkaban.sh 1 \033[32mor\033[0m azkaban.sh 0"
echo -e  "\033[32mUsage2:\033[0m azkaban.sh 1 w \033[32mor\033[0m azkaban.sh 0 w"
exit;
fi


# 输入 1 为启动, 输入 0 为关闭
v1="web"
v2="exec"

if [ $1 -eq 1 ]
then
stat="start-"
elif [ $1 -eq 0 ]
then
stat="shutdown-"
else
echo -e "\033[32mUsage:\033[0m azkaban.sh 1 \033[32mor\033[0m azkaban.sh 0"
exit;
fi

cd /opt/installs/azkaban/logs
# 传入第二个参数 w 代表 web-server , e 代表 exec-server 不传第二个默认全部启动/停止
if [ "$2" = 'w' ]
then
path1=/opt/installs/azkaban/${v1}-server/bin/${stat}${v1}.sh
echo -e "\033[32m${stat}${v1}.sh\033[0m"
sh  ${path1}
elif [ "$2" = 'e' ]
then
path2=/opt/installs/azkaban/${v2}-server/bin/${stat}${v2}.sh
echo -e "\033[32m${stat}${v2}.sh\033[0m"
sh  ${path2}
elif [ 'a'"$2"'a' = 'aa' ]
then
path1=/opt/installs/azkaban/${v1}-server/bin/${stat}${v1}.sh
echo -e "\033[32m${stat}${v1}.sh\033[0m"
sh  ${path1}
sleep 2
path2=/opt/installs/azkaban/${v2}-server/bin/${stat}${v2}.sh
echo -e "\033[32m${stat}${v2}.sh\033[0m"
sh  ${path2}
else
echo -e "\033[32mUsage1:\033[0m azkaban.sh 1 w \033[32mor\033[0m azkaban.sh 0 w"
echo -e "\033[32mUsage2:\033[0m azkaban.sh 1 e \033[32mor\033[0m azkaban.sh 0 e"
exit;
fi


sleep 2
echo -e "\033[32m-------------------jps--------------------\033[0m"
jps

配置脚本: 

cd /usr/local/bin
将脚本放入进去

chmod 777 azkaban.sh

创建logs目录:

cd /opt/installs/azkaban/
用于存储两个服务的日志
mkdir logs 

使用:

# 使用方法
# 1.启动azkaban
[root@hadoop10 ~]# azkaban.sh 1
# 单独启动Web
[root@hadoop10 ~]# azkaban.sh 1 w
# 单独启动exec
[root@hadoop10 ~]# azkaban.sh 1 e

# 2.关闭azkaban
[root@hadoop10 ~]# azkaban.sh 0
# 单独关闭Web
[root@hadoop10 ~]# azkaban.sh 0 w
# 单独关闭exec
[root@hadoop10 ~]# azkaban.sh 0 e
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值