为什么需要工作流调度系统?

Azkaban是为了很好的组织起复杂执行计划,起到了工作调度系统的作用,通过调度保证程序有序执行

如图:
常见工作流调度系统

1)简单的任务调度:直接使用LinuxCrontab来定义;

2)复杂的任务调度:开发调度平台或使用现成的开源调度系统,比如OoizeAzkaban AirflowDolphinScheduler等。

Azkaban配置

azkaban 2.0, 对应的是azkaban project 1.0 azkaban支持 properties配置文件,也支持yml配置文件!

azkaban3.0 , 对应的是azkaban project 2.0 azkaban默认支持yml配置文件!

1.上传tar包

2.配置MySQL

2.1启动MySQL

mysql -u root -p 

2.2创建Azkaban数据库

Azkaban Executor Server处理工作流和作业的实际执行。

3.配置Executor Server

修改conf目录下的azkaban.properties文件
作如下修改:
#设置时区
default.timezone.id=Asia/Shanghai
#...
azkaban.webserver.url=http://hadoop102:8081

#...
database.type=mysql
mysql.port=3306
mysql.host=主机名
mysql.database=mysql数据库名
mysql.user=使用者user
mysql.password=mysql密码
mysql.numconnections=100
executor.port=12321

3.1同步azkaban-exec到所有节点

xsync /opt/module/azkaban/azkaban-exec
必须进入到/opt/module/azkaban/azkaban-exec路径,分别在三台机器上,启动executor server

注意事项:

        启动azkaban时,必须来到 azkaban的家目录,执行启动命令!

        为什么?

                在配置文件中,有大量的 相对路径,例如

user.manager.xml.file=conf/azkaban-users.xml

相对的是,当前你所在的目录,也就是执行start-exec.sh命令时,所在的目录

举例: 在 /home/user   启动azkaban
此时:   user.manager.xml.file=/home/user/conf/azkaban-users.xml
报错,找不到此文件

如果在 azkaban的家目录启动:
user.manager.xml.file=/opt/module/azkaban/azkaban-exec/conf/azkaban-users.xml


4.激活executor

在各个节点上分别发送请求
curl -G "hadoop102:12321/executor?action=activate" && echo

发送成功!
{"status":"success"}

5.配置Web Server

Azkaban Web Server处理项目管理,身份验证,计划和执行触发。

5.1编辑conf目录下的azkaban.properties

做如下修改:
				
				

...

default.timezone.id=Asia/Shanghai

#配置同上:

database.type=mysql

mysql.port=3306

mysql.host=

mysql.database=

mysql.user=

mysql.password=

mysql.numconnections=100

...


azkaban.executorselector.filters=StaticRemainingFlowSize,CpuStatus


说明:

#StaticRemainingFlowSize:正在排队的任务数;

#CpuStatus:CPU占用情况

#MinimumFreeMemory:内存占用情况。测试环境,必须将MinimumFreeMemory删除掉,否则它会认为集群资源不够,不执行

5.2 修改azkaban-users.xml文件,添加用户

<azkaban-users>
  <user groups="azkaban" password="azkaban" roles="admin" username="azkaban"/>
  <user password="metrics" roles="metrics" username="metrics"/>
  <user password="mysqlpassword" roles="metrics,admin" username="mysql_user"/>

  <role name="admin" permissions="ADMIN"/>
  <role name="metrics" permissions="METRICS"/>
</azkaban-users>

5.3启动azkaban-web

必须进入到hadoop102的/opt/module/azkaban/azkaban-web路径,启动web server
访问http://hadoop102:8081,并用添加用户登陆


Azkaban使用

 HelloWorld案例

1.在windows环境,新建azkaban.project文件,编辑内容如下
azkaban-flow-version: 2.0

注意:该文件作用,是采用新的Flow-API方式解析flow文件。

2.新建basic.flow文件,内容如下
nodes:
  - name: jobA
    type: command
    config:
      command: echo "Hello World"

1Namejob名称

2Typejob类型。command表示你要执行作业的方式为命令

3Configjob配置

3.将azkaban.project、basic.flow文件压缩到一个zip文件,文件名称必须是英文
4.在WebServer新建项目:http://hadoop102:8081/index
5.给项目名称命名和添加项目描述
6.上传项目文件
7.执行任务流
可以在log中查看运行结果

作业依赖案例

1.修改basic.flow为如下内容

nodes:
  - name: jobC
    type: command
    # jobC 依赖 JobA和JobB
    dependsOn:
      - jobA
      - jobB
    config:
      command: echo "I’m JobC"

  - name: jobA
    type: command
    config:
      command: echo "I’m JobA"

  - name: jobB
    type: command
    config:
      command: echo "I’m JobB"

自动失败重试案例

需求:如果执行任务失败,需要重试3次,重试的时间间隔10000ms

1)编译配置流

nodes:
  - name: JobA
    type: command
    config:
      command: sh /not_exists.sh
      retries: 3
      retry.backoff: 10000

参数说明:

retries:重试次数

retry.backoff:重试的时间间隔

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

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

 手动失败重试案例

需求:JobA=JobB(依赖于A=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."

EnableDisable下面都分别有如下参数:

       Parents:该作业的上一个任务

       Ancestors:该作业前的所有任务

       Children:该作业后的一个任务

       Descendents:该作业后的所有任务

       Enable All:所有的任务

可以根据需求选择性执行对应的任务。

定时执行案例

需求:JobA每间隔1分钟执行一次;

具体步骤:

1Azkaban可以定时执行工作流。在执行工作流时候,选择左下角Schedule

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


邮件报警案例

需要注册一个126邮箱
1.开启SMTP服务
2.一定要记住授权码
Azkaban默认支持通过邮件对失败的任务进行报警,配置方法如下:
2.1修改配置文件:azkaban-web/conf/azkaban.properties
#这里设置邮件发送服务器,需要 申请邮箱,切开通stmp服务,以下只是例子
mail.sender=yinbiaohuau@126.com
mail.host=smtp.126.com
mail.user=yinbiaohua@126.com
mail.password=用邮箱的授权码
2.2保存并重启web-server
2.3编辑basic.flow,加入如下属性:
nodes:
  - name: jobA
    type: command
    config:
      command: echo "This is an email test."
2.4压缩打包上传
3.观察邮箱,就可以发现执行成功或者失败的邮件

第4章 参考资料

4.1 Azkaban完整配置

见官网文档:https://azkaban.readthedocs.io/en/latest/configuration.html

4.2 YAML语法

Azkaban2.0工作流文件是用YAML语法写的,相关教程如下:

YAML语法入门_牛客博客 (nowcoder.net)