工作流调度 Azkaban 工作流 Flow2.0入门

Azkaban使用

  • azkaban 4.x目前同时支持flow1.0与flow 2.0;

  • 官网说flow 1.0将来会被淘汰,所以本文档使用flow 2.0

  • 如果对flow 1.0感兴趣的同学,可以参考文章自行学习体验

  • Azkaba内置的任务类型支持command、java

1. Flow 2.0

1. 入门例子Hello World
  • windowsmac中,创建文件flow20.project,内容如下

  • 创建basic.flow文件,内容如下

文件中要有nodes的部分,包含所有你想要运行的job

需要为每个job指定nametype

大多的job需要config

  • 将两个文件压缩成一个zip包,比如起名叫Archive.zip
  • 使用如下账号信息登录azkaban

  • 创建工程

image-20210322141552889

image-20210322142018917

  • 上传项目zip文件

image-20210322142113861

image-20210322142341264

  • 执行flow

image-20210322142430994

  • 弹出如下界面

image-20210322142502178

  • 下图Execution queued successfully with exec id 8表示,web server选择id是8的exec server执行此流

image-20210322143339338

  • 绿色表示执行成功;查看Job List

image-20210322143630353

  • 查看日志

image-20210322143732983

image-20210322144617008

2. 单job有多个command
  • flow中的一个job有多个command

第一个command用command表示

第二个用command.1表示

第三个用command.2表示,以此类推

  • 剩余步骤(图略)
    • 生成项目zip文件
    • web ui创建项目
    • 上传zip文件
    • 执行flow
    • 查看日志
3. 包含多个有依赖关系job的flow
  • job间可以相互依赖,创建flow文件dependon.flow,内容如下

jobC依赖jobA、jobB

Noop: A job that takes no parameters and is essentially a null operation. Used for organizing your graph

  • 以下操作跟上边的例子入门例子Hello World相似
  • dependon.flowflow20.project压缩生成zip文件dependon.zip
  • web server ui界面创建项目,然后上传项目zip文件,然后执行,并查看Job List及job日志

image-20210322150017462

image-20210322150045710

image-20210322150208386

image-20210322150248203

image-20210322150336657

image-20210322150354472

image-20210322163440111

image-20210322163511445

  • 以下是jobA日志

image-20210322163624172

  • 以下是jobB日志

image-20210322163705334

4. 自动失败重试案例
  • 如果job执行失败,可以配置成自动重试若干次,每次重试时间间隔一定时长

说明:

/a_non_exists.sh是一个不存在的sh脚本

retries重试次数

retry.backoff每次重试的时间间隔,单位毫秒

  • 以下操作跟上边的例子入门例子Hello World相似

  • retry.flowflow20.project压缩生成zip文件retry.zip

  • web server ui界面创建项目,然后上传项目zip文件,然后执行,并查看Job List及job日志

  • 部分截图略

image-20210322174226194

image-20210322174355462

image-20210322174542414

  • 日志

image-20210322174714763

  • 也可以在flow文件中,加入全局重试次数,此重试配置对flow文件中的所有job都生效;内容如下

5. 手动失败重试案例
  • 手动失败重试场景:

    • 对于某些flow中的失败job,不能通过自动重试解决的,比如并非一些系统短时的问题,比如暂时的网络故障导致的超时、暂时的资源不足导致的执行失败
    • 此时需要手动的做些处理后,然后再进行重新执行flow中job
    • 跳过成功的job
    • 从失败的job开始执行
  • 一个flow中,有5个job,有依赖关系如下

    • jobE依赖jobD;
    • jobD依赖jobC;
    • jobC依赖jobB
    • jobB依赖jobA
  • 创建flow文件manulretry.flow内容如下

  • 压缩生成zip包、web ui创建项目、上传zip、执行flow

image-20210322180735005

image-20210322182526429

image-20210322182828579

  • 查看jobC的日志

image-20210322182857657

  • 原因是没有找到下图的sh脚本文件

image-20210322182934940

  • 那么在对应的exec server的对应目录下创建此sh脚本文件

    • 由于不确定,flow重试时,web选择哪个exec执行flow,所以保险起见,有两个方法
    • 方法一:在3个exec节点中都创建tmp.sh脚本

    • 脚本内容如下

    • 方法二:重试flow时,指定执行的executor(此处暂略,下文会提到用法)

image-20210322183719073

image-20210322183757554

  • 手动重试有两个方案
1、方案一

image-20210322183920014

image-20210322183949180

image-20210322184055962

image-20210322192509377

2、方案二

image-20210322192854089

image-20210322192916054

image-20210322193840468

image-20210322193906255

image-20210322194000248

Enable 和 Disable 下面都分别有如下参数:
Parents:该作业的上一个job
Ancestors:该作业前的所有job
Children:该作业后的一个job
Descendents:该作业后的所有job
Enable All: 所有的job

  • 可以根据实际情况选择enable方案
6. 操作HDFS
  • node01节点用root用户启动hadoop集群

  • 编写flow文件operateHdfs.flow,内容如下

  • 生成zip项目文件、web ui上传zip、执行flow
  • 查看HDFS结果

image-20210322230044128

7. MR任务
  • 记得启动hadoop的historyserver,否则执行mr项目时,job的日志会报如下类似错误日志

192.168.77.30:10020 应该是hadoop集群的historyserver服务

  • 编写flow文件mr.flow,内容如下

  • 为了避免执行mr过程中,对hdfs操作的一些权限问题

  • 生成zip项目文件、web ui上传zip、执行flow
  • 查看结果

image-20210322232740822

  • 可以去yarn界面看看此job的执行情况

image-20210322233043321

8. Hive任务
  • 编写hive脚本文件hive.sql,内容如下

  • flow文件hive.flow内容如下

  • 利用hive.sqlhive.flowflow20.project生成zip项目文件、web ui上传zip、执行flow
1、自动选择exec执行失败
  • 部分截图如下

image-20210323093745783

image-20210323093810080

  • 执行失败
  • 查看Flow Log,发现选择的executor是node02;而node02上没有安装hive

image-20210323094018204

image-20210323094047720

image-20210323094139431

  • 所以最终执行失败
2、解决方案:指定executor
  • 官网提供说明:要指定执行flow的executor的话,azkaban用户必须拥有admin权限
  • 我们在安装azkaban web服务时,在文件中指定创建了拥有ADMIN权限的用户kkbadmin

image-20210325141446647

  • 接下来我们想用kkbadmin登录azkaban,并指定执行executor是node03(安装了hive的机器)
  • 那么,在此之前,得在node03创建用户kkbadmin,并且此用户属于node03的linux用户组myazkaban(参考创建kkbrwe的做法即可)

  • 如何解决?
    • 运行前,因为kkbrwe没有ADMIN权限,所以先退出登录web ui界面
    • 使用kkbadmin登录web ui界面
    • 创建项目、上传zip、执行flow并指定executor服务器是node03节点(安装了hive的节点)

image-20210325144925406

  • 指定flow参数

image-20210325145017038

image-20210323094813337

  • node03节点登录mysql查看executor都有哪些?

  • 比如此时发现noded 03的id是9(根据自己的实际情况填写executor id)

  • 上边azkaban界面输入参数如下,然后执行

image-20210325145140803

image-20210325145224395

image-20210325145407014

  • 刷新页面,发现执行成功

image-20210325145551616

image-20210325145627876

Views: 10