Azkaban基础篇
工作流概述
工作流是将一组任务组织起来以完成某个经营过程:定义了任务的触发顺序和触发条件,每个任务可以由一个或多个软件系统完成,也可以由一个或一组人完成,还可以由一个或多个人与软件系统协作完成。
例:请假--》1天:部门经理审批
3天:部门经理审批---》hr
5天:部门经理审批----》hr---》老大
1)一个完整的数据分析系统通常都是由大量任务单元组成: shell 脚本程序,java 程序,mapreduce 程序、hive 脚本等。
2)各任务单元之间存在时间先后及前后依赖关系。
3)为了很好地组织起这样的复杂执行计划,需要一个工作流调度系统来调度执行。
例如,我们可能有这样一个需求,某个业务系统每天产生 20G 原始数据,我们每天都要对其进行处理,处理步骤如下所示: (1)通过 Hadoop 先将原始数据同步到 HDFS 上;
(2)借助 MapReduce 计算框架对原始数据进行计算,生成的数据以分区表的形式存储到多张 Hive 表中;
(3)需要对 Hive 中多个表的数据进行 JOIN 处理,得到一个明细数据 Hive 大表;
(4)将明细数据进行复杂的统计分析,得到结果报表信息;
(5)需要将统计分析得到的结果数据同步到业务系统中,供业务调用使用。 如下图所示:
为了更好的组织这样的复杂执行计算的关系==》这就需要一个工作流调度系统来进行依赖关系作业的调度
常见工作流调度系统
1)简单的任务调度:直接使用 linux 的 crontab 来定义。
2)复杂的任务调度:开发调度平台或使用现成的开源调度系统,比如 Ooize、Azkaban、Cascading、Hamake、宙斯(Zeus) 等。
Linux crontab +shell :
优点:简单、易用
缺点:难维护 难依赖,资源利用率低,没有可视化界面
复杂的任务调度:
定时调度
依赖调度
下面的表格对上述四种 hadoop 工作流调度器的关键特性进行了比较,尽管这些工作流调度器能够解决的需求场景基本一致,但在设计理念,目标用户,应用场景等方面还是存在显著的区别,在做技术选型的时候,可以提供参考。
对市面上最流行的两种调度器,给出以下详细对比,以供技术选型参考。总体来说,Ooize 相比 Azkaban 是一个重量级的任务调度系统,功能全面,但配置使用也更复杂。如果可以不在意某些功能的缺失,轻量级调度器 Azkaban 是很不错的候选对象。 详情如下:
1)功能 两者均可以调度 mapreduce,pig,java,脚本工作流任务 两者均可以定时执行工作流任务
2)工作流定义 Azkaban 使用 Properties 文件定义工作流 Oozie 使用 XML 文件定义工作流
3)工作流传参 Azkaban 支持直接传参,例如${input}
Oozie 支持参数和 EL 表达式,例如${fs:dirSize(myInputDir)}
4)定时执行 Azkaban 的定时执行任务是基于时间的 Oozie 的定时执行任务基于时间和输入数据
5)资源管理 Azkaban 有较严格的权限控制,如用户对工作流进行读/写/执行等操作 Oozie 暂无严格的权限控制
6)工作流执行 Azkaban 有两种运行模式,分别是 solo server mode(executor server 和 web server 部署在同一台节点)和 multi server mode(executor server 和 web server 可以部署在不同节点) Oozie作为工作流服务器运行,支持多用户和多工作流
7)工作流管理 Azkaban 支持浏览器以及 ajax 方式操作工作流 Oozie 支持命令行、HTTP REST、Java API、浏览器操作工作流
Azkaban概述
Azkaban 是由 Linkedin 开源的一个批量工作流任务调度器。用于跑Hadoop的job。Azkaban 定义了一种 KV 文件格式来建立任务之间的依赖关系,并提供一个易于使用的 web 用户界面维护和跟踪你的工作流。
下载地址:http://azkaban.github.io/downloads.html
Azkaban的架构
Azkaban是一种类似于Oozie的工作流控制引擎,可以用来解决多个Hadoop(或Spark等)离线计算任务之间的依赖关系问题。
也可以用其代替crontab来对周期性任务进行调度,并且更为直观,可靠,同时提供了美观的可视化管理界面。
Azkaban由三部分构成:
1、Relational Database(Mysql)
azkaban将大多数状态信息都存于MySQL中,Azkaban Web Server 和 Azkaban Executor Server也需要访问DB。
2、Azkaban Web Server
提供了Web UI,是azkaban的主要管理者,包括 project 的管理,认证,调度,对工作流执行过程的监控等。
3、Azkaban Executor Server
调度工作流和任务,纪录工作流活任务的日志,之所以将AzkabanWebServer和AzkabanExecutorServer分
开, 主要是因为在某个任务流失败后,可以更方便的将重新执行。而且也更有利于Azkaban系统的升级
MySQL实例:Azkaban使用MySQL来存储项目和执行。
Azkaban Web服务器:Azkaban使用Jetty作为Web服务器,用作控制器以及提供Web界面
Azkaban执行服务器:Azkaban执行服务器执行提交工作流。
Azkaban架构的三种运行模式
1、solo server mode
数据信息存储在H2数据库,web server 和 executor server运行在一个进程里
最简单的模式,数据库内置的H2数据库,管理服务器和执行服务器都在一个进程中运行,任务量不大项目可以采用此模式。
2、two server mode
MySQL(主从结构),web server 和 executor server运行在不同的进程
数据库为mysql,管理服务器和执行服务器在不同进程,这种模式下,管理服务器和执行服务器互不影响
3、multiple executor mode
MySQL(主从结构),web server 和 executor server运行在不同的进程,且executor server有多个
该模式下,执行服务器和管理服务器在不同主机上,且执行服务器可以有多个。
注意:我这次采用第二种模式,管理服务器、执行服务器分进程,但在同一台主机上。
Azkaban架构 转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/6296214.html,如需转载请自行联系原作者
感谢各位前辈的总结,受用了
记一次很坑很坑很坑的azkaban的安装过程
LINUX 下安装git 超详细
linux下azkaban的安装
Azkaban 3.x 编译及部署
1.1 下载并解压
Azkaban 在 3.0 版本之后就不提供对应的安装包,需要自己下载源码进行编译。
下载所需版本的源码,Azkaban 的源码托管在 GitHub 上,地址为 https://github.com/azkaban/azkaban 。可以使用
git clone
的方式获取源码,也可以使用wget
直接下载对应 release 版本的tar.gz
文件,这里我采用第二种方式:
wget https://github.com/azkaban/azkaban/archive/3.70.0.tar.gz # 解压 tar -zxvf azkaban-3.70.0.tar.gz
1.2 准备编译环境#
1. JDK#
Azkaban 编译依赖 JDK 1.8+ ,JDK 安装方式见本仓库:
Linux 环境下 JDK 安装
2. Gradle#
Azkaban 3.70.0 编译需要依赖
gradle-4.6-all.zip
。Gradle 是一个项目自动化构建开源工具,类似于 Maven,但由于采用 Groovy 语言进行项目配置,所以比 Maven 更为灵活,目前广泛用于 Android 开发、Spring 项目的构建。需要注意的是不同版本的 Azkaban 依赖 Gradle 版本不同,可以在解压后的
/gradle/wrapper/gradle-wrapper.properties
文件查看在编译时程序会自动去图中所示的地址进行下载,但是下载速度很慢。为避免影响编译过程,建议先手动下载至
/gradle/wrapper/
目录下:wget https://services.gradle.org/distributions/gradle-4.6-all.zip
然后修改配置文件
gradle-wrapper.properties
中的distributionUrl
属性,指明使用本地的 gradle。3. Git#
Azkaban 的编译过程需要用 Git 下载部分 JAR 包,所以需要预先安装 Git:
yum install git
1.3 项目编译#
在根目录下执行编译命令,编译成功后会有
BUILD SUCCESSFUL
的提示:
./gradlew build installDist -x test
编译过程中需要注意以下问题:
- 因为编译的过程需要下载大量的 Jar 包,下载速度根据网络情况而定,通常都不会很快,如果网络不好,耗费半个小时,一个小时都是很正常的;
- 编译过程中如果出现网络问题而导致 JAR 无法下载,编译可能会被强行终止,这时候重复执行编译命令即可,gradle 会把已经下载的 JAR 缓存到本地,所以不用担心会重复下载 JAR 包。
如果出现以下错误:JCE报错那么需要下载一点东西:
testV1_1 FAILED java.lang.RuntimeException: java.lang.RuntimeException: org.jasypt.exceptions.EncryptionOperationNotPossibleException: Encryption raised an exception. A possible cause is you are using strong encryption algorithms and you have not installed the Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files in this Java Virtual Machine at azkaban.crypto.Crypto.decrypt(Crypto.java:76) at azkaban.crypto.DecryptionTest.testV1_1(DecryptionTest.java:35) Caused by: java.lang.RuntimeException: org.jasypt.exceptions.EncryptionOperationNotPossibleException: Encryption raised an exception. A possible cause is you are using strong encryption algorithms and you have not installed the Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files in this Java Virtual Machine at azkaban.crypto.CryptoV1_1.decrypt(CryptoV1_1.java:57) at azkaban.crypto.Crypto.decrypt(Crypto.java:74) ... 1 more Caused by: org.jasypt.exceptions.EncryptionOperationNotPossibleException: Encryption raised an exception. A possible cause is you are using strong encryption algorithms and you have not installed the Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files in this Java Virtual Machine at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.handleInvalidKeyException(StandardPBEByteEncryptor.java:1073) at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.decrypt(StandardPBEByteEncryptor.java:1050) at org.jasypt.encryption.pbe.StandardPBEStringEncryptor.decrypt(StandardPBEStringEncryptor.java:725) at azkaban.crypto.CryptoV1_1.decrypt(CryptoV1_1.java:55) ... 2 more azkaban.crypto.EncryptionTest > testEncryption FAILED org.jasypt.exceptions.EncryptionOperationNotPossibleException: Encryption raised an exception. A possible cause is you are using strong encryption algorithms and you have not installed the Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files in this Java Virtual Machine at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.handleInvalidKeyException(StandardPBEByteEncryptor.java:1073) at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.encrypt(StandardPBEByteEncryptor.java:924) at org.jasypt.encryption.pbe.StandardPBEStringEncryptor.encrypt(StandardPBEStringEncryptor.java:642) at azkaban.crypto.CryptoV1_1.encrypt(CryptoV1_1.java:42) at azkaban.crypto.Crypto.encrypt(Crypto.java:58) at azkaban.crypto.EncryptionTest.testEncryption(EncryptionTest.java:28) 5 tests completed, 2 failed > Task :azkaban-common:compileJava 注: 某些输入文件使用或覆盖了已过时的 API。 注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。 注: 某些输入文件使用了未经检查或不安全的操作。 注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。 FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':az-crypto:test'. > There were failing tests. See the report at: file:///opt/azkaban/az-crypto/build/reports/tests/test/index.html * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights. * Get more help at https://help.gradle.org
解决方法:下载JCE
https://www.oracle.com/technetwork/cn/java/javase/downloads/jce8-download-2133166-zhs.html
我这边使用的JDK8,包含了JCE所需要的jre8解压搜下载好的文件,放置到java的以下目录:
/usr/local/jdk1.8.0_74/jre/lib/security
覆盖后重新编译
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':az-exec-util:linkMainExecutable'.
> Could not find Linker 'g++' in system path.yum install gcc gcc-c++
Azkaban单机部署与测试
cd $AZKABAN_HOME/azkaban-solo-server/build/distributions
tar -zxf azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz -C /opt/modules/
cd /opt/modules/azkaban-solo-server-0.1.0-SNAPSHOT/
bin/start-sole.sh
Azkaban单独服务器应该全部设置好,8081
默认情况下通过侦听端口来接受传入的网络请求。因此,打开网络浏览器并签出http://localhost:8081/
。对于个人服务器的默认登录用户名和密码都是azkaban
它在配置conf/azkaban-users.xml
中resources
独奏服务器的文件夹中。
在conf
目录中,应该有三个文件:
azkaban.private.properties
-由Azkaban用于存储Mysql密码等机密azkaban.properties
-由Azkaban用于运行时参数global.properties
-全局静态属性,作为共享属性传递给每个工作流和作业。azkaban-users.xml
-用于添加用户和角色进行身份验证。如果未将XmLUserManager设置为使用该文件,则不使用此文件。该azkaban.properties
文件是主配置文件。
停止服务器:
bin/shutdown-solo.sh
创建流
本节介绍如何使用Azkaban Flow 2.0创建Azkaban流。Flow 1.0将在未来被弃用。
流程2.0基础知识
步骤1:
创建一个名为的简单文件
flow20.project
。添加azkaban-flow-version
以指示这是Flow 2.0 Azkaban项目:azkaban-flow-version: 2.0
步骤2:
创建另一个名为的文件
basic.flow
。添加一个名为的部分nodes
,其中将包含您要运行的所有作业。您需要指定name
和type
所有作业。大多数工作也将需要该config
部分。稍后我们将详细讨论。以下是命令作业的简单示例。nodes: - name: jobA type: command config: command: echo "This is an echoed text."
步骤3:
选择您已经创建的两个文件,然后右键单击将其压缩为一个名为的zip文件
Archive.zip
。您还可以使用这两个文件创建一个新目录,然后cd
进入新目录并进行压缩:请不要直接压缩新目录。zip -r Archive.zip .
确保您已经在Azkaban上创建了一个项目(请参阅 创建项目)。然后,您可以通过Web UI将Archive.zip上传到您的项目中(请参见上传项目)。
现在,您可以单击以测试您的第一个Flow 2.0 Azkaban项目!
Execute Flow
可查看文档
https://github.com/azkaban/azkaban/wiki/Azkaban-Flow-2.0-Design
前置条件:你的服务器是可以连外网。
当任务是异步定时的,我们对于结果的感知往往没有手动跑脚本那么及时,但是如果任何一个任务运行失败可能都会引起一些列问题,在这个情况下消息通知就很重要了,azkaban支持邮件通知任务执行情况
1.配置$HOME_AZKABAN/azkaban-web-server/conf>vi azkaban.properties
# mail settings
#mail.sender=邮件发送者
#mail.host=发送邮件服务器
腾讯qq邮箱的host是:smtp.qq.com 126邮箱的host是:smtp.126.com 163邮箱的host是:smtp.163.com
网上都说不能用qq的,然而我用163的也发不了,最后用了阿里云的
...
# mail settings
[email protected]
mail.host=smtp.aliyun.com
[email protected]
mail.password=pwd
job.failure.email=
job.success.email=
...
2.重启azakaban-web-server
root@hadoop01:/software/azkaban-3.12.0/azkaban-web-server/bin>ls
azkaban-web-shutdown.sh azkaban-web-start.sh keystore logs start-web.sh temp
root@hadoop01:/software/azkaban-3.12.0/azkaban-web-server/bin>sh azkaban-web-shutdown.sh
Killing Web Server. [pid: 104317]
done.
root@hadoop01:/software/azkaban-3.12.0/azkaban-web-server/bin>sh start-web.sh
3.创建schedule,并配置邮件提醒
配置schedule(azkaban使用--schedule定时任务)
除正常配置外,添加以下配置即可