Azkaban知识总结

工作流(Workflow),指“业务过程的部分或整体在计算机应用环境下的自动化”。是对工作流程及其各操作步骤之间业务规划的抽象、概括描述。工作流解决的主要问题是:为了实现某个业务目标,利用计算机软件在多个参与者之间按某种预定规则自动从传递文档、信息或者任务。

一个完整的数据分析系统通常都是由多个前后依赖的模块组合构成的:数据采集、数据预处理、数据分析、数据展示等。各个模块单元之间存在事件先后依赖关系,且存在着周期重复。

为了很好地组织起这样的复杂执行计划,需要一个工作流调度系统来调度执行。

azkaban官网:https://azkaban.github.io/

工作流

工作流调度实现方式

简单的任务调度:直接使用linux的crontab来定义;但是缺点明显,无法设置依赖。

复杂的任务调度:开发调度平台或使用现成的开源调度系统,比如ooize、azkaban、airflow等

常见工作流调度系统

市面上目前有许多工作流调度器,在hadoop领域,常见的工作流调度器有Oozie, Azkaban,Cascading,Hamake等

各种调度工具特性对比

下面的表格对上述四种hadoop工作流调度器的关键特性进行了比较,尽管这些工作流调度器能够解决的需求场景基本一致,但在设计理念,目标用户,应用场景等方面还是存在显著的区别,在做技术选型的时候,可以提供参考

特性 Hamake Oozie Azkaban Cascading
工作流描述语言 XML XML (xPDL based) text file with key/value pairs Java API
依赖机制 data-driven explicit explicit explicit
是否要web容器 No Yes Yes No
进度跟踪 console/log messages web page web page Java API
Hadoop job调度支持 no yes yes yes
运行模式 command line utility daemon daemon API
Pig支持 yes yes yes yes
事件通知 no no no yes
需要安装 no yes yes no
支持的hadoop版本 0.18+ 0.20+ currently unknown 0.18+
重试支持 no workflownode evel yes yes
运行任意命令 yes yes yes yes
Amazon EMR支持 yes no currently unknown yes

Azkaban与Oozie对比

对市面上最流行的两种调度器,给出以下详细对比,以供技术选型参考。总体来说,ooize相比azkaban是一个重量级的任务调度系统,功能全面,但配置使用也更复杂。如果可以不在意某些功能的缺失,轻量级调度器azkaban是很不错的候选对象。

详情如下

  • 功能

    两者均可以调度mapreduce,pig,java,脚本工作流任务

    两者均可以定时执行工作流任务

  • 工作流定义

    Azkaban使用Properties文件定义工作流

    Oozie使用XML文件定义工作流

  • 工作流传参

    Azkaban支持直接传参,例如${input}

    Oozie支持参数和EL表达式,例如${fs:dirSize(myInputDir)}

  • 定时执行

    Azkaban的定时执行任务是基于时间的

    Oozie的定时执行任务基于时间和输入数据

  • 资源管理

    Azkaban有较严格的权限控制,如用户对工作流进行读/写/执行等操作

    Oozie暂无严格的权限控制

  • 工作流执行

    Azkaban有两种运行模式,分别是solo server mode(executor server和web server部署在同一台节点)和multi server mode(executor server和web server可以部署在不同节点)

    Oozie作为工作流服务器运行,支持多用户和多工作流

  • 工作流管理

    Azkaban支持浏览器以及ajax方式操作工作流

    Oozie支持命令行、HTTP REST、Java API、浏览器操作工作流

Azkaban调度器

Azkaban是由Linkedin开源的一个批量工作流任务调度器。用于在一个工作流内以一个特定的顺序运行一组工作和流程。

Azkaban定义了一种KV文件(properties)格式来建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。

它有如下功能特点:

  • Web用户界面
  • 方便上传工作流
  • 方便设置任务之间的关系
  • 调度工作流
  • 认证/授权(权限的工作)
  • 能够杀死并重新启动工作流
  • 模块化和可插拔的插件机制
  • 项目工作区
  • 工作流和任务的日志记录和审计

Azkaban 原理架构

mysql服务器:存储元数据,如项目名称、项目描述、项目权限、任务状态、SLA规则等

AzkabanWebServer:对外提供web服务,使用户可以通过web页面管理。职责包括项目管理、权限授权、任务调度、监控executor。

AzkabanExecutorServer:负责具体的工作流的提交、执行。

Azkaban 三种部署模式

solo server mode

该模式中webServer和executorServer运行在同一个进程中,进程名是AzkabanSingleServer。使用自带的H2数据库。这种模式包含Azkaban的所有特性,但一般用来学习和测试。

two-server mode

该模式使用MySQL数据库, Web Server和Executor Server运行在不同的进程中。

multiple-executor mode

该模式使用MySQL数据库, Web Server和Executor Server运行在不同的机器中。且有多个Executor Server。该模式适用于大规模应用。

Azkaban 源码编译

Azkaban3.x在安装前需要自己编译成二进制包。并且提前安装好Maven、Ant、Node等软件。

我们这里选用azkaban3.51.0这个版本自己进行重新编译,编译完成之后得到我们需要的安装包进行安装

注意:编译需要使用jdk1.8的版本来进行编译,如果编译服务器使用的jdk版本是1.7的,记得切换成jdk1.8,我们这里使用的是jdk8u141这个版本来进行编译

编译环境

1
2
yum install -y git
yum install -y gcc-c++

下载源码解压

1
2
3
4
cd /export/softwares/
wget https://github.com/azkaban/azkaban/archive/3.51.0.tar.gz
tar -zxvf 3.51.0.tar.gz -C ../servers/
cd /export/servers/azkaban-3.51.0/

编译源码

1
./gradlew build installDist -x test

Gradle是一个基于Apache Ant和Apache Maven的项目自动化构建工具。-x test 跳过测试。(注意联网下载jar可能会失败、慢)。

如果编译失败

编译后安装包路径

  • azkaban-exec-server

    编译完成之后得到我们需要的安装包在以下目录下即可获取得到azkaban-exec-server存放目录

    1
    $ /export/servers/azkaban-3.51.0/azkaban-exec-server/build/distributions/
  • azkaban-web-server

    azkaban-web-server存放目录

    1
    $ /export/servers/azkaban-3.51.0/azkaban-web-server/build/distributions/
  • azkaban-solo-server

    azkaban-solo-server存放目录

    1
    $ /export/servers/azkaban-3.51.0/azkaban-solo-server/build/distributions/
  • execute-as-user.c

    azkaban two server模式下需要的C程序在这个路径下面

    1
    $ /export/servers/azkaban-3.51.0/az-exec-util/src/main/c
  • 数据库脚本文件

    数据库脚本文件在这个路径下面

    1
    $ /export/servers/azkaban-3.51.0/azkaban-db/build/distributions/

Azkaban安装部署

solo-server模式部署

节点规划

HOST 角色
node01 Web Server 和 Executor Server 同一进程

安装步骤

第一步:解压

azkaban 的solo server使用的是一个单节点的模式来进行启动服务的,只需要一个

azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz的安装包即可启动,所有的数据信息都是保存在H2这个azkaban默认的数据当中。

上传我们的压缩包,然后修改配置文件启动即可

1
2
$ cd /export/softwares
$ tar -zxvf azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz -C ../servers/

第二步:修改两个配置文件

修改时区配置文件

1
2
$ cd /export/servers/azkaban-solo-server-0.1.0-SNAPSHOT/conf
$ vim azkaban.properties
1
default.timezone.id=Asia/Shanghai

修改commonprivate.properties配置文件

1
2
$ cd /export/servers/azkaban-solo-server-0.1.0-SNAPSHOT/plugins/jobtypes
$ vim commonprivate.properties
1
2
3
execute.as.user=false
# azkaban默认需要3G的内存,剩余内存不足则会报异常
memCheck.enabled=false

第三步:启动solo-server

启动azkaban-solo-server

1
2
3
$ cd  /export/servers/azkaban-solo-server-0.1.0-SNAPSHOT
## 注意:启动/关闭必须进到azkaban-solo-server-0.1.0-SNAPSHOT/目录下
$ bin/start-solo.sh

AzkabanSingleServer(对于Azkaban solo‐server模式,Exec Server和Web Server在同一个进程中)

第四步:浏览器页面访问

浏览器页面访问 http://node01:8081/;默认用户名密码 azkaban

初体验测试

创建两个文件one.jobtwo.job内容如下,然后打成zip包。

1
2
3
# one.job
type=command
command=echo "this is job one"
1
2
3
4
# two.job
type=command
dependencies=one
command=echo "this is job two"

接下来步骤:http://node01:8081/index 登录 => create project => upload zip包 => execute flow 一步步执行即可。

two-server模式部署

节点规划

HOST 角色
node03 Mysql
node02 web-server 和 exec-server不同进程

mysql配置初始化

Node03节点,进入mysql的客户端执行以下命令

1
mysql  -uroot -p

执行以下命令:

1
2
3
4
5
6
mysql> CREATE DATABASE azkaban;
mysql> CREATE USER 'azkaban'@'%' IDENTIFIED BY 'azkaban';
mysql> GRANT all privileges ON azkaban.* to 'azkaban'@'%' identified by 'azkaban' WITH GRANT OPTION;
mysql> flush privileges;
mysql> use azkaban;
mysql> source /export/softwares/create-all-sql-0.1.0-SNAPSHOT.sql;

web-server服务器配置

Node02节点,解压azkaban-web-server

1
$ tar -zxvf azkaban-web-server-0.1.0-SNAPSHOT.tar.gz -C ../servers/

Node02节点,解压azkaban-exec-server

1
$ tar -zxvf azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz -C ../servers/

生成SSL证书

1
2
$ cd /export/servers/azkaban-web-server-3.51.0
$ keytool -keystore keystore -alias jetty -genkey -keyalg RSA

运行此命令后,会提示输入当前生成keystore证书文件。

修改azkaban-web-server的配置文件

1
2
$ cd /export/servers/azkaban-web-server-3.51.0/conf
$ vim azkaban.properties

以下是要修改的部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# Azkaban Personalization Settings
# 注意时区后面不要有空格
default.timezone.id=Asia/Shanghai

# Azkaban Jetty server properties.
jetty.use.ssl=true
jetty.ssl.port=8443

# Azkaban Executor settings
executor.host=localhost
executor.port=12321

# KeyStore for SSL ssl相关配置 注意密码和证书路径
jetty.keystore=keystore
jetty.password=123456
jetty.keypassword=123456
jetty.truststore=keystore
jetty.trustpassword=123456

# Azkaban mysql settings by default. Users should configure their own username and password.
database.type=mysql
mysql.port=3306
mysql.host=node03
mysql.database=azkaban
mysql.user=azkaban
mysql.password=azkaban

#Multiple Executor
azkaban.use.multiple.executors=true
#azkaban.executorselector.filters=StaticRemainingFlowSize,MinimumFreeMemory,CpuStatus

添加azkaban.native.lib=false 和 execute.as.user=false 属性:

1
2
mkdir -p plugins/jobtypes
vim commonprivate.properties
1
2
3
azkaban.native.li=false
execute.as.user=false
memCheck.enabled=false

executor-server服务器配置

修改azkaban-exec-server的配置文件

1
2
$ cd /export/servers/azkaban-exec-server-3.51.0/conf
$ vim azkaban.properties

以下是需要修改的部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Azkaban Personalization Settings
default.timezone.id=Asia/Shanghai

# Where the Azkaban web server is located
azkaban.webserver.url=https://node02:8443

# Azkaban mysql settings by default. Users should configure their own username and password.
database.type=mysql
mysql.port=3306
mysql.host=node03
mysql.database=azkaban
mysql.user=azkaban
mysql.password=azkaban

# Azkaban Executor settings
executor.port=12321

添加execute-as-user插件

将我们编译后的C文件execute-as-user.c上传到这个目录来/export/servers/azkaban-exec-server-3.51.0/plugins/jobtypes;或者直接将我们/export/softwares下面的文件拷贝过来也行

1
$ cp /export/softwares/execute-as-user.c /export/servers/azkaban-exec-server-3.51.0/plugins/jobtypes/

然后执行以下命令生成execute-as-user

1
2
3
4
cd /export/servers/azkaban-exec-server-3.51.0/plugins/jobtypes
gcc execute-as-user.c -o execute-as-user
chown root execute-as-user
chmod 6050 execute-as-user

注意:如果提示gcc command not found 那么就在线安装gcc+c++即可。 任意目录执行命令 :

1
yum -y install  gcc-c++

修改配置文件

1
2
$ cd  /export/servers/azkaban-exec-server-3.47.0/plugins/jobtypes
$ vim commonprivate.properties
1
2
3
execute.as.user=true
memCheck.enabled=false
azkaban.native.lib=/export/servers/azkaban-exec-server-3.51.0/plugins/jobtypes

集群启动

启动exec-server

1
2
$ cd /export/servers/azkaban-exec-server-3.51.0
$ bin/start-exec.sh

手动激活executor

启动webServer之后进程失败消失,通过安装包根目录下对应启动日志进行排查。

以上错误则需要手动激活executor。node02机器执行以下命令

1
2
cd /export/servers/azkaban/azkaban-exec-server-3.51.0/
curl -G "node02:$(<./executor.port)/executor?action=activate" && echo

然后重新启动webServer就可以了。

启动azkaban-web-server

1
2
$ cd /export/servers/azkaban-web-server-3.51.0/
$ bin/start-web.sh

访问地址:https://node03:8081

multiple-executor模式部署

multiple-executor模式是多个executor Server分布在不同服务器上,只需要将azkaban-exec-server安装包拷贝到不同机器上即可组成分布式。

节点规划

HOST 角色
node01 exec-server
node02 web-server、exec-server
node03 mysql

scp executor-server安装包到 node01

启动之后,需要手动激活executor

1
2
cd  /export/servers/azkaban/azkaban-exec-server-3.51.0/
curl -G "node01:$(<./executor.port)/executor?action=activate" && echo
-------------本文结束感谢您的阅读-------------

本文标题:Azkaban知识总结

文章作者:Mr.wj

发布时间:2019年12月29日 - 21:37

最后更新:2019年12月29日 - 21:42

原始链接:https://www.wjqixige.cn/2019/12/29/Azkaban知识总结/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Mr.wj wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!