1. Azkaban是什么?
Azkaban是由Linkedin公司推出的一个批量工作流任务调度器,主要用于在一个工作流内以一个特定的顺序运行一组工作和流程,它的配置是通过简单的key:value对的方式,通过配置中的dependencies 来设置依赖关系,这个依赖关系必须是无环的,否则会被视为无效的工作流。Azkaban使用job配置文件建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。
在介绍Azkaban之前,我们先来看一下现有的两个工作流任务调度系统。知名度比较高的应该是Apache Oozie,但是其配置工作流的过程是编写大量的XML配置,而且代码复杂度比较高,不易于二次开发。另外一个应用也比较广泛的调度系统是Airflow,但是其开发语言是Python。由于我们团队内部使用Java作为主流开发语言,所以选型的时候就被淘汰掉了。我们选择Azkaban的原因基于以下几点:
提供功能清晰,简单易用的Web UI界面
提供job配置文件快速建立任务和任务之间的依赖关系
提供模块化和可插拔的插件机制,原生支持command、Java、Hive、Pig、Hadoop
基于Java开发,代码结构清晰,易于二次开发
2. Azkaban的适用场景
实际项目中经常有这些场景:每天有一个大任务,这个大任务可以分成A,B,C,D四个小任务,A,B任务之间没有依赖关系,C任务依赖A,B任务的结果,D任务依赖C任务的结果。一般的做法是,开两个终端同时执行A,B,两个都执行完了再执行C,最后再执行D。这样的话,整个的执行过程都需要人工参加,并且得盯着各任务的进度。但是我们的很多任务都是在深更半夜执行的,通过写脚本设置crontab执行。其实,整个过程类似于一个有向无环图(DAG)。每个子任务相当于大任务中的一个流,任务的起点可以从没有度的节点开始执行,任何没有通路的节点之间可以同时执行,比如上述的A,B。总结起来的话,我们需要的就是一个工作流的调度器,而Azkaban就是能解决上述问题的一个调度器。
3. Azkaban架构
Azkaban在LinkedIn上实施,以解决Hadoop作业依赖问题。我们有工作需要按顺序运行,从ETL工作到数据分析产品。最初是单一服务器解决方案,随着多年来Hadoop用户数量的增加,Azkaban 已经发展成为一个更强大的解决方案。
Azkaban由三个关键组件构成:
关系型数据库(MySQL)
AzkabanWebServer
AzkabanExecutorServer
3.1 关系型数据库(MySQL)
Azkaban使用数据库存储大部分状态,AzkabanWebServer和AzkabanExecutorServer都需要访问数据库。
AzkabanWebServer使用数据库的原因如下:
项目管理:项目、项目权限以及上传的文件。
执行流状态:跟踪执行流程以及执行程序正在运行的流程。
以前的流程/作业:通过以前的作业和流程执行以及访问其日志文件进行搜索。
计划程序:保留计划作业的状态。
SLA:保持所有的SLA规则
AzkabanExecutorServer使用数据库的原因如下:
访问项目:从数据库检索项目文件。
执行流程/作业:检索和更新正在执行的作业流的数据
日志:将作业和工作流的输出日志存储到数据库中。
交互依赖关系:如果一个工作流在不同的执行器上运行,它将从数据库中获取状态。
3.2 AzkabanWebServer
AzkabanWebServer是整个Azkaban工作流系统的主要管理者,它负责project管理、用户登录认证、定时执行工作流、跟踪工作流执行进度等一系列任务。同时,它还提供Web服务操作的接口,利用该接口,用户可以使用curl或其他ajax的方式,来执行azkaban的相关操作。操作包括:用户登录、创建project、上传workflow、执行workflow、查询workflow的执行进度、杀掉workflow等一系列操作,且这些操作的返回结果均是json的格式。并且Azkaban使用方便,Azkaban使用以.job为后缀名的键值属性文件来定义工作流中的各个任务,以及使用dependencies属性来定义作业间的依赖关系链。这些作业文件和关联的代码最终以*.zip的方式通过Azkaban UI上传到Web服务器上。
3.3 AzkabanExecutorServer
以前版本的Azkaban在单个服务中具有AzkabanWebServer和AzkabanExecutorServer功能,目前Azkaban已将AzkabanExecutorServer分离成独立的服务器,拆分AzkabanExecutorServer的原因有如下几点:
某个任务流失败后,可以更方便的将其重新执行
便于Azkaban升级
AzkabanExecutorServer主要负责具体的工作流的提交、执行,可以启动多个执行服务器,它们通过mysql数据库来协调任务的执行。
4. Azkaban作业流执行过程
Webserver根据内存中缓存的各Executor的资源状态(Webserver有一个线程会遍历各个active executor,去发送http请求获取其资源状态信息缓存到内存中),按照选择策略(包括executor资源状态、最近执行流个数等)选择一个executor下发作业流;
executor判断是否设置作业粒度分配,如果未设置作业粒度分配,则在当前executor执行所有作业;如果设置了作业粒度分配,则当前节点会成为作业分配的决策者,即分配节点;
分配节点从zookeeper获取各个executor的资源状态信息,然后根据策略选择一个executor分配作业;
被分配到作业的executor即成为执行节点,执行作业,然后更新数据库。
5. Azkaban架构的三种运行模式
在版本3.0中,Azkaban提供了以下三种模式:
solo server mode:最简单的模式,数据库内置的H2数据库,AzkabanWebServer和AzkabanExecutorServer都在一个进程中运行,任务量不大项目可以采用此模式。
two server mode:数据库为MySQL,管理服务器和执行服务器在不同进程,这种模式下,AzkabanWebServer和AzkabanExecutorServer互不影响。
multiple executor mode:该模式下,AzkabanWebServer和AzkabanExecutorServer运行在不同主机上,且AzkabanExecutorServer可以有多个。
目前我们采用的是multiple executor mode方式,分别在不同的主机上部署多个AzkabanExecutorServer以应对高并发定时任务执行的情况,从而减轻单个服务器的压力。
WebServer和ExecutorServer同步solo配置
分别编辑build.gradle 添加如果代码块
from('../azkaban-solo-server/build/resources/main/conf') {
into 'conf'
}
from('../azkaban-solo-server/src/main/resources/commonprivate.properties') {
into 'plugins/jobtypes'
}
from('../azkaban-solo-server/src/main/resources/log4j.properties') {
into ''
}
from('../azkaban-solo-server/src/main/resources/commonprivate.properties') {
into ''
}
# Build and install distributions
./gradlew installDist
6. Azkaban使用
6.1 创建项目
进入Azkaban后,您将看到“项目”页面。此页面将显示您具有读取权限的所有项目的列表。只有组权限或具有READ或ADMIN角色的项目不会出现。
如果刚刚开始,项目页面可能为空。但是,您可以通过单击所有项目来查看所有现有项目。
单击创建项目将弹出一个对话框。输入项目的唯一项目名称和说明,项目名称必须以英文字母开头,只能包含数字、英文字母、下划线、横线 。以后可以更改说明,但项目名称不能。如果您没有看到此按钮,除了具有适当权限的用户之外,创建新项目的可能性已被锁定。
创建项目后,将显示一个空的项目页面。您将自动获得该项目的ADMIN状态。通过单击权限按钮添加和删除权限。
如果您具有适当的权限(如果您创建项目,则应该该权限),您可以从该页面删除项目,更新描述,上传文件和查看项目日志
6.2 上传项目
点击上传按钮。您将看到以下对话框。
选择要上传的工作流文件的存档文件。目前,Azkaban只支持xxx.zip文件。zip应包含xxx.job运行作业所需的文件和任何文件。作业名称在项目中必须是唯一的。
Azkaban将验证zip的内容,以确保满足依赖关系,并且没有检测到循环依赖。如果发现任何无效的工作流,上传将失败。
上传覆盖项目中的所有文件。在上传新的zip文件后,对作业所做的任何更改都将被清除。
6.3 工作流视图
通过点击流程链接,您可以转到流程视图页面。从这里,您将看到流程的图形表示。左侧面板包含流程中的作业列表。
右键单击右侧面板中的作业或图形中的节点将允许您打开单个作业。您还可以从此页面计划和执行流程。
6.4 项目权限
创建项目时,创建者将自动在项目上给予ADMIN状态。这允许创建者查看,上传,更改作业,运行流程,删除并向项目添加用户权限。管理员可以删除其他管理员,但不能删除自己。除非管理员被管理角色的用户删除,否则这会阻止项目成为管理员。
权限页面可从项目页面访问。在权限页面上,管理员可以将其他用户,组或代理用户添加到项目中。
添加用户权限为这些用户赋予项目所指定的权限。通过取消选中所有权限来删除用户权限
组权限允许特定组中的每个人指定的权限。通过取消选中所有组权限来删除组权限。
如果代理用户已打开,则代理用户允许项目工作流作为这些用户运行。这有助于锁定哪些无头帐户作业可以代理。添加后,点击“删除”按钮即可将其删除。
每个用户都通过UserManager进行验证,以防止添加无效用户。组和代理用户也将检查以确保它们是有效的,并查看是否允许管理员将其添加到项目中。
可以为用户和组设置以下权限:
Permissions |
Values |
ADMIN |
最高权限,包括给其他用户添加、修改权限 |
READ |
只能访问每一个project的内容和日志信息 |
WRITE |
可以在已创建的project上传、修改任务的属性,可以删除任何的project |
EXECUTE |
允许用户执行任何的工作流 |
SCHEDULE |
允许用户添加、删除任何工作流的调度信息 |
CREATEPROJECTS |
如果项目创建被锁定,则允许用户创建新项目 |
6.5 执行流程视图
从流程视图面板中,您可以右键单击图形并禁用或启用作业。在执行期间将禁用残留作业,就像它们的依赖关系一样。残障作业将显示半透明。
通知选项 通知选项允许用户更改流程的成功或失败通知行为。
通知失败
第一个故障 - 检测到第一个故障后发送故障电子邮件。
流程完成 - 如果流程的作业失败,它将在流程中的所有作业完成后发送故障电子邮件。
电子邮件覆盖
Azkaban将使用流中最终作业中设置的默认通知电子邮件。如果被覆盖,用户可以更改发送失败或成功发送电子邮件的电子邮件地址。列表可以用逗号,空格或分号分隔。
故障选项
当流程中的作业失败时,您可以控制其余的流程如何成功。
完成当前运行将完成当前运行的作业,但不会启动新作业。FAILED FINISHING一旦完成,流程将被置于状态并设置为失败。
取消全部将立即终止所有正在运行的作业,并将执行流程的状态设置为FAILED。
完成所有可能会在流程中继续执行作业,只要其依赖性得到满足即可。FAILED FINISHING一旦完成,流程将被置于状态并设置为失败。
并发选项
如果流同时执行时调用流执行,则可以设置多个选项。
如果“ 执行”选项已经运行,则不会运行该流。
运行并发选项将运行流程,无论它是否运行。执行不同的工作目录。
管道以新执行方式不会超过并发执行的方式运行流程。
级别1:执行作业A的块,直到上一个流程的作业A完成。
级别2:执行作业A的块,直到上一个流程的作业A的孩子已经完成。如果您需要在已执行流程后面运行流程,这将非常有用。
工作流选项
允许用户覆盖工作流参数。工作流参数覆盖作业的全局属性,而不是作业本身的属性
6.6 执行
后执行流程,你将提交执行流程页面。或者,您可以从“ 流程视图”页面的“执行”选项卡,“历史记录”页面或“执行”页面访问这些流程。
此页面类似于“流程视图”页面,但显示运行作业的状态。
选择工作列表将给出执行工作的时间表。您可以直接从此列表中访问作业和作业日志。
只要执行没有完成,该页面将自动更新。
您可以在执行流程上执行的一些选项包括:
取消 - 杀死所有正在运行的作业,并立即失败。流动状态将被杀死。
暂停 - 阻止新作业运行。目前运行的作业照常进行。
恢复 - 恢复暂停执行。
重试失败 - 仅当流程处于FAILED FINISHING状态时可用。当流程仍然活动时,重试将重新启动所有FAILED作业。“尝试”将显示在“作业列表”页面中。
准备执行 - 仅在完成的流程中可用,无论成功或失败。这将自动禁用成功完成的作业。
6.7 执行页面
单击标题中的“执行”选项卡将显示“执行”页面。此页面将显示当前运行的执行以及最近完成的流程。
6.8 历史页
当前正在执行的流程以及完成的执行程序将显示在“历史记录”页面中。提供搜索选项来查找您要查找的执行。或者,您可以在“ 流视图执行”选项卡上查看先前执行的流程。
6.9 计划流程
从用于执行流程的同一个面板中,流程可以通过点击* Schedule *按钮进行排定。
将为预定流保留任何流选项集。例如,如果作业被禁用,则预定流程的作业也将被禁用。
使用Azkaban 3.3中的新的灵活调度功能,用户可以在Quartz语法之后定义一个cron作业。与Quartz或cron不同的一个重要变化是Azkaban最多以最小的粒度运作。因此,UI中的第二个字段被标记为静态“0”。该灵活的时间表百科解释了细节如何使用。
安排后,它应该出现在计划页面上,您可以在其中删除计划作业或设置SLA选项。
6.10 SLA
要添加SLA通知或抢占,请单击SLA按钮。从这里您可以设置SLA警报电子邮件。规则可以添加并应用于单个作业或流程本身。如果超过持续时间阈值,则可以设置警报电子邮件,否则流程可能会被自动杀死。
工作页面 工作组成一个流程的各个任务。要访问作业页面,您可以右键单击流程视图,执行流程视图或项目页面中的作业。
6.11 任务页面
在此页面中,您可以查看作业的依赖关系和依赖关系以及作业将使用的全局属性。
6.12 任务编辑
单击作业编辑将允许您编辑除特定保留参数(例如type和)以外的所有作业属性dependencies。只有当作业尚未开始运行时,对参数的更改才会影响执行流程。这些覆盖作业属性将被下一个项目上传覆盖。
6.13 工作历史
任何工作的重试将显示为executionid.attempt数字。
6.14 工作日志
作业日志存储在数据库中。它们包含所有stdout和stderr作业的输出。
工作总结
该作业摘要选项卡包含在作业日志信息的摘要。这包括:
作业类型 - 作业的作业类型
命令摘要 - 启动作业进程的命令,以及单独显示的类路径和内存设置等字段
Pig / Hive作业摘要 - Pig和Hive作业的特定定制
地图缩小作业 - 将Map-Reduce作业的作业ID列表与已启动的作业链接到其作业跟踪页面
更多详细内容,请:https://azkaban.github.io/azkaban/docs/latest/