之前已经介绍过了 Azkaban,也介绍了怎么安装 Azkaban。下面讲讲怎么使用 Azkaban。

Azkaban使用

创建项目

进入 Azkaban 后,你会看到"项目"页面。此页面将显示你具有读取权限的所有项目的列表。只有组权限或具有 READ 或 ADMIN 角色的项目不会出现。
emptyprojectpage
如果刚刚开始,项目页面可能为空。但是,你可以通过单击所有项目来查看所有现有项目。

单击创建项目将弹出一个对话框。输入项目的唯一项目名称和说明,项目名称必须以英文字母开头,只能包含数字、英文字母、下划线、横线。以后可以更改说明,但项目名称不能。如果你没有看到此按钮,除了具有适当权限的用户之外,创建的新项目可能已被锁定。
createproject
创建项目后,将显示一个空的项目页面。你将自动获得该项目的 ADMIN 状态。通过单击权限按钮添加和删​​除权限。
newprojectpage
如果你具有适当的权限,您可以从该页面删除项目,更新描述,上传文件和查看项目日志。

上传项目

点击上传按钮。您将看到以下对话框。
uploadprojects
选择要上传的工作流文件的存档文件。目前,Azkaban 只支持 xxx.zip 文件。zip 应包含 xxx.job 运行任务所需的文件和任何文件。任务名称在项目中必须是唯一的。

Azkaban 将验证 zip 的内容,以确保满足依赖关系,并且没有检测到循环依赖。如果发现任何无效的工作流,上传将失败。
上传覆盖项目中的所有文件。在上传新的 zip 文件后,对任务所做的任何更改都将被清除。

工作流视图

通过点击流程链接,你可以转到流程视图页面。从这里,您将看到流程的图形表示。左侧面板包含流程中的任务列表。

右键单击右侧面板中的任务或图形中的节点将允许你打开单个任务。你还可以从此页面计划和执行流程。
flowview
单击"执行"选项卡将显示此流程的所有执行记录。
flowviewexecutions

项目权限

创建项目时,创建者将自动在项目上给予 ADMIN 状态。这允许创建者查看,上传,更改任务,运行流程,删除并向项目添加用户权限。管理员可以删除其他管理员,但不能删除自己。除非管理员被管理角色的用户删除。

权限页面可从项目页面访问。在权限页面上,管理员可以将其他用户,组或代理用户添加到项目中。
permission

  • 添加用户权限为这些用户赋予项目所指定的权限。通过取消选中所有权限来删除用户权限。
  • 组权限允许特定组中的每个人指定的权限。通过取消选中所有组权限来删除组权限。
  • 如果代理用户已打开,则允许项目工作流作为这些代理用户运行。这有助于锁定哪些代理帐户可以执行任务。添加后,点击"删除"按钮即可将其删除。
  • 每个用户都通过 UserManager 进行验证,以防止添加无效用户。组和代理用户也将检查以确保它们是有效的,并查看是否允许管理员将其添加到项目中。

执行流程视图

从流程视图面板中,你可以右键单击图形并禁用或启用任务。在执行期间将禁用残留任务,就像它们的依赖关系一样。残障任务将显示半透明。
executeflowpanel

通知选项

通知选项允许用户更改流程的成功或失败通知行为。

通知失败

  • 第一个故障 - 检测到第一个故障后发送故障电子邮件。
  • 流程完成 - 如果流程的任务失败,它将在流程中的所有任务完成后发送故障电子邮件。

电子邮件覆盖

Azkaban 将使用流中最终任务中设置的默认通知电子邮件。如果被覆盖,用户可以更改发送失败或成功发送电子邮件的电子邮件地址。列表可以用逗号,空格或分号分隔。
executeflownotify

故障选项

当流程中的任务失败时,您可以控制其余的流程如何成功。

  • 完成当前运行 - 将完成当前运行的任务,但不会启动新任务。FAILED FINISHING 一旦完成,流程将被置于状态并设置为失败。
  • 取消全部 - 将立即终止所有正在运行的任务,并将执行流程的状态设置为 FAILED。
  • 完成所有 - 可能会在流程中继续执行任务,只要其依赖性得到满足即可。FAILED FINISHING 一旦完成,流程将被置于状态并设置为失败。

并发选项

如果流同时执行时调用流执行,则可以设置多个选项。

  • 如果"执行"选项已经运行,则不会运行该流。
  • 运行并发选项将运行流程,无论它是否运行。执行不同的工作目录。
  • 管道以新执行方式不会超过并发执行的方式运行流程。

    • 级别1:执行任务A的块,直到上一个流程的任务A完成。
    • 级别2:执行任务A的块,直到上一个流程的任务A的子任务已经完成。如果您需要在已执行流程后面运行流程,这将非常有用。

executeflowconcurrent

工作流选项

允许用户覆盖工作流参数。工作流参数覆盖任务的全局属性,而不是任务本身的属性。
executeflowparameters

执行

你将提交执行流程页面。或者,你可以从"流程视图"页面的"执行"选项卡,"历史记录"页面或"执行"页面访问这些流程。

此页面类似于"流程视图"页面,但显示运行任务的状态。
executingflowpage
选择工作列表将给出执行工作的时间表。你可以直接从此列表中访问任务和任务日志。
executingflowpagejobslist
只要执行没有完成,该页面将自动更新。
你可以在执行流程上执行的一些选项包括:

  • 取消 - 杀死所有正在运行的任务,并立即失败。流动状态将被杀死。
  • 暂停 - 阻止新任务运行。目前运行的任务照常进行。
  • 恢复 - 恢复暂停执行。
  • 重试失败 - 仅当流程处于FAILED FINISHING状态时可用。当流程仍然活动时,重试将重新启动所有 FAILED 任务。"尝试"将显示在"任务列表"页面中。
  • 准备执行 - 仅在完成的流程中可用,无论成功或失败。这将自动禁用成功完成的任务。

执行页面

单击标题中的"执行"选项卡将显示"执行"页面。此页面将显示当前运行的执行以及最近完成的流程。
executingflowspage

历史页

当前正在执行的流程以及完成的执行程序将显示在"历史记录"页面中。提供搜索选项来查找你要查找的执行。或者,你可以在" 流视图执行"选项卡上查看先前执行的流程。
historypage

计划流程

在用于执行流程的同一个面板中,流程可以通过点击 Schedule 按钮进行排定。
flexible-scheduling
将为预定流保留任何流选项集。例如,如果任务被禁用,则预定流程的任务也将被禁用。

使用 Azkaban 3.3 中的新的灵活调度功能,用户可以在 Quartz 语法之后定义一个 cron 任务。与 Quartz 或 cron 不同的一个重要变化是 Azkaban 以最小的粒度运作。因此,UI中的第二个字段被标记为静态"0"。该灵活的时间表相信用过crontab的都知道如何使用。
安排后,它应该出现在计划页面上,你可以在其中删除计划任务或设置 SLA 选项。
schedulepage

SLA

要添加 SLA 通知或抢占,请单击 SLA 按钮。从这里你可以设置 SLA 警报电子邮件。规则可以添加并应用于单个任务或流程本身。如果超过持续时间阈值,则可以设置警报电子邮件,否则流程可能会被自动杀死。
slapanel

任务页面

在此页面中,你可以查看任务的依赖关系以及任务将使用的全局属性。
jobpage

任务编辑

单击任务编辑将允许你编辑除特定保留参数(例如type)以外的所有任务属性 dependencies。只有当任务尚未开始运行时,对参数的更改才会影响执行流程。这些覆盖任务属性将被下一个项目上传覆盖。
jobedit

任务历史

任何任务的重试将显示为 executionid.attempt 数字。
jobhistorypage

任务日志

任务日志存储在数据库中。它们包含所有 stdout 和 stderr 任务的输出。
joblogs

任务总结

该任务摘要选项卡包含在任务日志信息的摘要。这包括:

  • 任务类型 - 任务类型
  • 命令摘要 - 启动任务进程的命令,以及单独显示的类路径和内存设置等字段
  • Pig / Hive任务摘要 - Pig 和 Hive 任务的特定定制
  • 地图缩小任务- 将 Map-Reduce 任务的任务ID列表与已启动的任务链接到其任务跟踪页面

jobsummary

Azkaban Job

串行定时任务工作流

zip 目录结构

<code style="font-family:Menlo, 'Liberation Mono', Consolas, 'DejaVu Sans Mono', 'Ubuntu Mono', 
'Courier New', 'andale mono', 'lucida console', monospace;padding:0px;color:inherit;background- 
color:transparent;white-space:pre;margin-top:0px;" class="hljs">|--start.job
|--finish.job
</code>

start.job

type=command
command=echo "this is start.job"

finish.job

type=command
dependencies=start
command=echo "this is finish.job"
successEmail=test@example.com
failureEmail=test@example.com

并行定时任务工作流

zip 目录结构

<code style="font-family:Menlo, 'Liberation Mono', Consolas, 'DejaVu Sans Mono', 'Ubuntu Mono', 
'Courier New', 'andale mono', 'lucida console', monospace;padding:0px;color:inherit;background- 
color:transparent;white-space:pre;margin-top:0px;" class="hljs">|--start.job
|--step1.job
|--step2.job
|--step3.job
</code>

step1.job

type=command
dependencies=start
command=echo "this is step1.job"

step2.job

type=command
dependencies=start
command=echo "this is step2.job"

step3.job

type=command
dependencies=step1,step2
command=echo "this is step3.job"

java定时任务工作流

zip 目录结构

<code style="font-family:Menlo, 'Liberation Mono', Consolas, 'DejaVu Sans Mono', 'Ubuntu Mono', 
'Courier New', 'andale mono', 'lucida console', monospace;padding:0px;color:inherit;background- 
color:transparent;white-space:pre;margin-top:0px;" class="hljs">|--lib
|  |--AzkabanJob.jar
|--azkabanJava.job
</code>

AzkabanJob.java

package com.example;

public class AzkabanJob {
 
    public void run() {
        // 根据需求编写具体代码
    }

    public static void main(String[] args) {
        AzkabanJob azkabanJob = new AzkabanJob();
        azkabanJob.run();
    }
}

azkabanJava.job

<code style="font-family:Menlo, 'Liberation Mono', Consolas, 'DejaVu Sans Mono', 'Ubuntu Mono',         
'Courier New', 'andale mono', 'lucida console', monospace;padding:0px;color:inherit;background-    
color:transparent;white-space:pre;margin-top:0px;" class="hljs"># azkabanJob.job
type=javaprocess
java.class=com.example.AzkabanJob
classpath=lib/*
</code>

嵌入式定时任务工作流

也可以将工作流作为其他工作流程中的节点包含为嵌入流。要创建一个嵌入式流,只需创建一个.job 文件,type=flow 并将其 flow.name 设置为嵌入式工作流的名称。并且嵌入式的工作流是可以单独配置定时任务的,例如:
zip 目录结构

<code style="font-family:Menlo, 'Liberation Mono', Consolas, 'DejaVu Sans Mono', 'Ubuntu Mono',     
'Courier New', 'andale mono', 'lucida console', monospace;padding:0px;color:inherit;background- 
color:transparent;white-space:pre;margin-top:0px;" class="hljs">|--bin
|  |--flow1.sh
|  |--flow2.sh
|  |--flow3.sh
|
|--start.job
|--step1.job
|--step2.job
|--flow1.job
|--flow2.job
|--flow3.job
|--subflow1.job
|--subflow2.job
</code>

subflow1.job

type=flow
flow.name=flow1
dependencies=start

subflow2.job

type=flow
flow.name=flow2
dependencies=start

flow1.job

type=command
dependencies=step1
command=sh ./bin/flow1.sh

flow2.job

type=command
dependencies=step2
command=sh ./bin/flow2.sh

flow3.job

type=command
dependencies=subflow1,subflow2
command=sh ./bin/flow3.sh

注意:这里的bin目录和所有的.job 位于同级目录下,./bin/flow.sh 其中的.表示当前目录。

全局变量

后戳名为 .properties 的文件将会作为参数文件加载,并且在 flow 中每个 job 共享,属性文件通过目录的分层结构继承。
zip 目录结构

<code style="font-family:Menlo, 'Liberation Mono', Consolas, 'DejaVu Sans Mono', 'Ubuntu Mono', 
'Courier New', 'andale mono', 'lucida console', monospace;padding:0px;color:inherit;background- 
color:transparent;white-space:pre;margin-top:0px;" class="hljs">|--common.properties
|--bin
|  |--start.sh
|  |--finish.sh
|--start.job
|--finish.job
|--flow
|  |flow.properties
|  |step1
</code>

common.properties

start.nofity.email=start@example.com
finish.nofity.email=finish@example.com
step.nofity.email=step@example.com

start.job

type=command
command=sh ./bin/start.sh
notify.emails=${start.nofity.email}

finish.job

type=command
command=sh ./bin/finish.sh
dependencies=start
notify.emails=${finish.nofity.email}

flow.properties

success.email=success@example.com

step.job

type=command
command=echo "this is step"
notify.emails=${step.nofity.email}
success.email=${success.email}

common.properties 是全局属性,将会被 start.job、finish.job 以及 flow 下的 step.job 使用,但是 start.job 和finish.job 不能继承 flow .properties 的属性,因为他是在其下层,而 step.job 是可以继承 flow.properties 的。

注意:xxx.properties 中声明的属性名不能包含空格,比如 ${success email}

Hive Job

hive.job

type=hive
user.to.proxy=Azkaban
azk.hive.action=execute.query
hive.query.01=drop table words;
hive.query.02=create table words (freq int, word string) row format delimited fields terminated by     '\t' stored as textfile;
hive.query.03=describe words;
hive.query.04=load data local inpath "res/input" into table words;
hive.query.05=select * from words limit 10;
hive.query.06=select freq, count(1) as f2 from words group by freq sort by f2 desc limit 10;

Hadoop Job

zip 目录结构

<code style="font-family:Menlo, 'Liberation Mono', Consolas, 'DejaVu Sans Mono', 'Ubuntu Mono', 
'Courier New', 'andale mono', 'lucida console', monospace;padding:0px;color:inherit;background- 
color:transparent;white-space:pre;margin-top:0px;" class="hljs">|--system.properties
|--pig.job
|--hadoop.job
</code>

system.properties

user.to.proxy=Azkaban
HDFSRoot=/tmp
param.inDataLocal=res/rpfarewell
param.inData=${HDFSRoot}/${user.to.proxy}/wordcountjavain
param.outData=${HDFSRoot}/${user.to.proxy}/wordcountjavaout

pig.job

type=pig
pig.script=src/wordcountpig.pig
user.to.proxy=azkabanHDFS
Root=/tmp
param.inDataLocal=res/rpfarewell
param.inData=${HDFSRoot}/${user.to.proxy}/wordcountpigin
param.outData=${HDFSRoot}/${user.to.proxy}/wordcountpigout

hadoop.job

type=hadoopJava
job.class=azkaban.jobtype.examples.java.WordCount
classpath=./lib/*,${hadoop.home}/lib/*
main.args=${param.inData} ${param.outData}
force.output.overwrite=true
input.path=${param.inData}
output.path=${param.outData}
dependencies=pig

Azkaban 的 GitHub 地址:https://github.com/azkaban/azkaban

最后修改:2020 年 04 月 15 日 04 : 02 PM
如果觉得我的文章对你有用,请随意赞赏