为什么要使用WorkFlow?
因为在生产中的ETL,以及HQL等作业都是通过shell命令触发执行的,在Linux中自带了Crontab调度器,通过它可以进行简单作业的调度,但是对于一些依赖的作业,比如作业B依赖于作业A完成后才能开始,这是Crontab很难去配置了,因为配置Crontab人根本不知道作业具体是何时完成的,全凭经验感觉,这是不可取的。此时我们需要Work Flow来规划好作业的执行调度。市场主流的工作流有两种:Oozie以及Azkzban。
常用的工作流对比
- Oozie:重量级的,不推荐使用,开发需要写一堆XML配置,非常的麻烦
- Azkzban:轻量级的,推荐使用,具有很好的WEBUI交互设计,但是也是比较难用,部分功能需要自定义开发,如无短信通知功能。
Azkaban简介
- 首先它不是apache项目,但属于开源项目,官网地址:https://azkaban.github.io/
-
它是用于运行hadoop生态圈相关作业的批量工作流调度器,主要用于解决作业间的依赖问题,它提供了一个良好的Web操作界面。
- 两种部署模式:无论哪一种部署模式都会包含所有的特性
- solo-server mode :单机模式,内置了H2数据库,web和executor服务运行在一个进程上,可用于测试,本次测试部署的是单机模式。
- multiple-executor mode:集群模式,DB使用的是有主备的mysql,升级维护不影响使用,用于生产
- 具体特性详见官网 两种部署模式的区别
安装Azkaban
安装以3.57.0版本的Azkabab需要有jdk1.8、gradle、git环境,gradle是类似于maven一样的jar依赖管理工具。
下载安装包
- 下载Azkaban:因为Azkaban不是Apache的项目,只有在github上才有。下载地址
- 下载gradle:下载地址 ,我是选择的4.5.1版本的
配置gradle安装包
因为使用gradlew编译的时候会自动下载gradle,但是由于网络的原因,我们选择手动下载安装包然后拷贝到Azkaban的/gradle/wrapper/目录
[hadoop@hadoop001 software]$ tar -zxvf azkaban-3.57.0.tar.gz -C /home/hadoop/sourcecode
[hadoop@hadoop001 software]$ cp gradle-4.5.1-all.zip /home/hadoop/sourcecode/azkaban-3.57.0/gradle/wrapper/
[hadoop@hadoop001 wrapper]$ ll
total 99536
-rw-r--r--. 1 hadoop hadoop 101862201 May 16 22:48 gradle-4.5.1-all.zip
-rw-rw-r--. 1 hadoop hadoop 54708 Sep 5 2018 gradle-wrapper.jar
-rw-rw-r--. 1 hadoop hadoop 779 Sep 5 2018 gradle-wrapper.properties
# 修改distributionUrl配置
[hadoop@hadoop001 wrapper]$ vi gradle-wrapper.properties
...
distributionUrl=gradle-4.5.1-all.zip
安装git
[root@hadoop001 ~]$ yum install -y git
[root@hadoop001 ~]# git --version
git version 1.7.1
编译Azkaban
注意:编译命令为./gradlew build installDist -x test,-x test表示跳过测试,跳过测试可以大大降低编译所需要的时间。
[hadoop@hadoop001 azkaban-3.57.0]# ./gradlew build installDist -x test
...
> Task :az-hadoop-jobtype-plugin:compileJava
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: /home/hadoop/sourcecode/azkaban-3.57.0/az-hadoop-jobtype-plugin/src/main/java/azkaban/jobtype/HadoopSecureSparkWrapper.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
BUILD SUCCESSFUL in 7m 7s
83 actionable tasks: 83 executed
安装Azkaban
[hadoop@hadoop001 azkaban-3.57.0]$ cd azkaban-solo-server/build/distributions/
[hadoop@hadoop001 distributions]$ ll
total 46760
-rw-rw-r--. 1 hadoop hadoop 23879214 May 17 01:47 azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz
-rw-rw-r--. 1 hadoop hadoop 24001751 May 17 01:47 azkaban-solo-server-0.1.0-SNAPSHOT.zip
[hadoop@hadoop001 distributions]$ pwd
/home/hadoop/sourcecode/azkaban-3.57.0/azkaban-solo-server/build/distributions
[hadoop@hadoop001 distributions]$
[hadoop@hadoop001 distributions]$ tar -zxvf azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz -C ~/app/
# 配置Azkaban
[hadoop@hadoop001 conf]$ pwd
/home/hadoop/app/azkaban-solo-server-0.1.0-SNAPSHOT/conf
[hadoop@hadoop001 conf]$ vi azkaban.properties
# Azkaban Personalization Settings
azkaban.name=JustDoDT
azkaban.label=JustDoDt Azkaban
....
[hadoop@hadoop001 conf]$ vi azkaban-users.xml
....
# 新增一行
<user password="123123" roles="admin" username="justdodt"/>
# 启动Azkaban
[hadoop@hadoop001 azkaban-solo-server-0.1.0-SNAPSHOT]$ bin/start-solo.sh
[hadoop@hadoop001 azkaban-solo-server-0.1.0-SNAPSHOT]$ jps
4483 Jps
4456 AzkabanSingleServer
[hadoop@hadoop001 azkaban-solo-server-0.1.0-SNAPSHOT]$
测试
首先创建两个文件(basic.flow;flow20.project),并把他们放在同一个目录下
basic.flow文件内容
nodes:
- name: jobC
type: noop
# jobC depends on jobA and jobB
dependsOn:
- jobA
- jobB
- name: jobA
type: command
config:
command: echo "This is an echoed text."
- name: jobB
type: command
config:
command: pwd
flow20.project文件内容
azkaban-flow-version: 2.0
将上面2个文件打包为.zip格式的压缩包
然后在Azkaban中创建项目,上传工作流
执行成功的截图为:
其他操作详见官方文档
总结
-
以上是Azkaban的安装以及简单使用的过程,无论是学习还是生产使用都是有很大的帮助
-
对于生产上Oozie与Azkaban的选择,个人倾向于更加轻量简单的后者,但是Azkaban不能配置短信告警
-
两种工作流框架都是有个致命的缺点,不能完全的面向用户,若用户能够在页面拖拽拉实现工作流的配置那就更加的完美了,故大公司都是自研工作流框架。