1 Azkaban简介
azkaban
是由领英退出的一款开源免费的工作流调度器软件
特点
功能强大 可以调度几乎所有软件的执行(command)
配置简单 job配置文件
提供了web页面使用
java语言开发 源码清晰可见 可以进行二次开发
架构
web服务器 :对外提供web服务 用户在页面上进行项目的相关管理
executor服务器:负责具体的工作流的调度提交。
数据库:用于保存工作流相关信息(比如:mysql)
部署模式
单节点模式:web、executor在同一个进程 适用于测试体验
two-server:web、executor在不同的进程中 可以使用第三方数据库
mutil-executor-server:web、executor在不同的机器上 可以部署多个executor服务器
安装部署
单节点部署模式 注意时区 内存检测的关闭
启动时候必须在安装包的根目录下进行启动
bin/start-solo.sh 正确 ./start-solo.sh 错误
azkaban开发流程
编写job的配置文件 xxxxx.job
type=command command=xxxx
把所有job配置打成一个zip的压缩包
登录页面node-1:8081 创建工程(默认用户名密码都是azkaban)
上传zip压缩包
选择调度schduler或者立即执行executor工程。
two server模式部署
该模式的特点是web服务器和executor服务器分别位于不同的进程中
使用第三方的数据库进行数据的保存 :mysql
安装部署注意事项
先对mysql进行初始化操作
配置azkaban.properties 注意时区 mysql相关 ssl
启动时候注意需要自己手动的激活executor服务器 在根目录下启动
如果启动出错 通过安装包根目录下的日志进行判断
访问的页面https
multiple-executor部署模式
所谓的 multiple-executor指的是可以在多个机器上分别部署executor服务器
相当于做了一个负载均衡
特别注意:executor启动(包括重启)的时候 默认不会激活 需要自己手动激活
对应的mysql中的表executors active :0 表示未激活 1表示激活
可以自己手动修改数据提交激活 也可以使用官方的命令请求激活
curl -G "node-3:$(<./executor.port)/executor?action=activate" && echo
azkaban调度总结
理论上任何一款软件,只有可以通过shell command执行 都可以转化成为azkaban的调度执行
type=command command = sh xxx.sh
2 工作流
2.1 为什么需要工作流调度系统
工作流(Workflow),指“业务过程的部分或整体在计算机应用环境下的自动化”。是对工作流程及其各操作步骤之间业务规则的抽象、概括描述。工作流解决的主要问题是:为了实现某个业务目标,利用计算机软件在多个参与者之间按某种预定规则自动传递文档、信息或者任务。一个完整的数据分析系统通常都是由多个前后依赖的模块组合构成的:数据采集、数据预处理、数据分析、数据展示等。各个模块单元之间存在时间先后依赖关系,且存在着周期性重复。为了很好地组织起这样的复杂执行计划,需要一个工作流调度系统来调度执行。
一个完整的数据分析系统通常都是由大量任务单元组成:Shell 脚本程序,Java 程序,MapReduce 程序、Hive 脚本等
各任务单元之间存在时间先后及前后依赖关系
为了很好地组织起这样的复杂执行计划,需要一个工作流调度系统来调度执行;
2.2 工作流调度实现方式
简单的任务调度:直接使用 linux 的 crontab 来定义,但是缺点也是比较明
显,无法设置依赖。
复杂的任务调度:自主开发调度平台,使用开源调度系统,比如 azkaban、
Apache Oozie、Cascading、Hamake 等。
其中知名度比较高的是 Apache Oozie,但是其配置工作流的过程是编写大
量的 XML 配置,而且代码复杂度比较高,不易于二次开发。
2.3 工作流调度工具之间对比
下面的表格对四种 hadoop 工作流调度器的关键特性进行了比较,尽管这些工作流调度器能够解决的需求场景基本一致,但在设计理念,目标用户,应用场景等方面还是存在显著的区别,在做技术选型的时候,可以提供参考。
3 Azkaban 调度器
3.1 Azkaban 介绍
Azkaban 是由 linkedin(领英)公司推出的一个批量工作流任务调度器,用
于在一个工作流内以一个特定的顺序运行一组工作和流程。Azkaban 使用 job 配
置文件建立任务之间的依赖关系,并提供一个易于使用的 web 用户界面维护和跟
踪你的工作流。
Azkaban 功能特点:
提供功能清晰,简单易用的 Web UI 界面
提供 job 配置文件快速建立任务和任务之间的依赖关系
提供模块化和可插拔的插件机制,原生支持 command、Java、Hive、Pig、Hadoop
基于 Java 开发,代码结构清晰,易于二次开发
3.2 Azkaban 原理架构
mysql 服务器: 存储元数据,如项目名称、项目描述、项目权限、任务状态、SLA 规则等AzkabanWebServer:对外提供 web 服务,使用户可以通过 web 页面管理。职责包括项目管理、权限授权、任务调度、监控 executor。
AzkabanExecutorServer:负责具体的工作流的提交、执行。
3.3 Azkaban 三种部署模式
3.3.1 solo server mode
该模式中 webServer 和 executorServer 运行在同一个进程中,进程名是AzkabanSingleServer。使用自带的 H2 数据库。这种模式包含 Azkaban 的所有特性,但一般用来学习和测试。
3.3.2 two-server mode
该模式使用 MySQL 数据库, Web Server 和 Executor Server 运行在不同的进程中。
3.3.3 multiple-executor mode
该模式使用 MySQL 数据库, Web Server 和 Executor Server 运行在不同的机器中。且有多个 Executor Server。该模式适用于大规模应用。
4 Azkaban 源码编译
Azkaban3.x 在安装前需要自己编译成二进制包。
并且提前安装好 Maven、Ant、Node 等软件,具体请参考附件资料
4.1 编译环境
yum install –y git
yum install –y gcc-c++
4.2 下载源码解压
wget https://github.com/azkaban/azkaban/archive/3.51.0.tar.gz
tar -zxvf 3.51.0.tar.gz
cd ./azkaban-3.51.0/
1
2
3
4.3 编译源码
./gradlew build installDist -x test
Gradle 是一个基于 Apache Ant 和 Apache Maven 的项目自动化构建工具。
-x test 跳过测试。(注意联网下载 jar 可能会失败、慢)
4.4 编译后安装包路径
编译成功之后就可以在指定的路径下取得对应的安装包了。
#solo-server 模式安装包路径 azkaban-solo-server/build/distributions/ #two-server 模式和 multiple-executor 模式 web-server 安装包路径 azkaban-web-server/build/distributions/ #two-server 模式和 multiple-executor 模式 exec-server 安装包路径 azkaban-exec-server/build/distributions/ azkaban-db/build/distributions/
数据库相关安装包路径
4 Azkaban 安装部署
4.1 solo-server 模式部署
4.1.1 节点规划
4.1.2 解压配置
mkdir /export/servers/azkaban tar -zxvf azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz –C /export/servers/azkaban/ vim conf/azkaban.properties default.timezone.id=Asia/Shanghai #修改时区 vim plugins/jobtypes/commonprivate.properties
添加:memCheck.enabled=false
azkaban 默认需要 3G 的内存,剩余内存不足则会报异常
4.1.3 启动验证
cd azkaban-solo-server-0.1.0-SNAPSHOT/ bin/start-solo.sh
注:启动/关闭必须进到 azkaban-solo-server-0.1.0-SNAPSHOT/目录下。
AzkabanSingleServer(对于 Azkaban solo‐server 模式,Exec Server 和 Web Server 在
同一个进程中)
4.1.4 登录 web 页面
访问 Web Server=>http://node-1:8081/ 默认用户名密码 azkaban
4.1.5 初体验测试
http://node-1:8081/index 登录=>Create Project=>Upload zip 包 =>execute flow
执行一步步操作即可。
创建两个文件 one.job two.job,内容如下,打包成 zip 包。
cat one.job type=command command=echo "this is job one"
cat two.job type=command dependencies=one command=echo "this is job two"
创建工程:
上传 zip 压缩包:
execute 执行:
执行页面:
执行结果查看:
4.2 two-server 模式部署
4.2.1 节点规划
4.2.2 mysql 配置初始化
node-1:
mkdir /export/servers/azkaban
tar -zxvf azkaban-db-0.1.0-SNAPSHOT.tar.gz –C /export/servers/azkaban/
Mysql 上创建对应的库、增加权限、创建表
mysql> CREATE DATABASE azkaban_two_server; #创建数据库
mysql> use azkaban_two_server;
mysql> source /export/servers/azkaban/azkaban-db-0.1.0-SNAPSHOT/createall-sql-0.1.0-SNAPSHOT.sql; #加载初始化 sql 创建表
4.2.3 web-server 服务器配置
node-2:
mkdir /export/servers/azkaban
tar -zxvf azkaban-web-server-0.1.0-SNAPSHOT.tar.gz –C /export/servers/azkaban/
tar -zxvf azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz –C /export/servers/azkaban/
生成 ssl 证书:
keytool -keystore keystore -alias jetty -genkey -keyalg RSA
运行此命令后,会提示输入当前生成 keystore 的密码及相应信息,输入的密
码请记住(所有密码统一以 123456 输入)。
完成上述工作后,将在当前目录生成 keystore 证书文件,将 keystore 拷贝
到 azkaban web 服务器根目录中。 如: cp keystore azkaban-web-server-0.1.0-SNAPSHOT/
配置 conf/azkaban.properties:
# Azkaban Personalization Settings azkaban.name=Test azkaban.label=My Local Azkaban azkaban.color=#FF3601 azkaban.default.servlet.path=/index web.resource.dir=web/ default.timezone.id=Asia/Shanghai # 时区注意后面不要有空格 # Azkaban UserManager class user.manager.class=azkaban.user.XmlUserManager user.manager.xml.file=conf/azkaban-users.xml # Azkaban Jetty server properties. 开启使用 ssl 并且知道端口 jetty.use.ssl=true jetty.ssl.port=8443 jetty.maxThreads=25 # Azkaban Executor settings 指定本机 Executor 的运行端口 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=node-1 mysql.database=azkaban_two_server mysql.user=root mysql.password=hadoop mysql.numconnections=100 #Multiple Executor 设置为 false azkaban.use.multiple.executors=true #azkaban.executorselector.filters=StaticRemainingFlowSize,MinimumFreeMemory,CpuStatus azkaban.executorselector.comparator.NumberOfAssignedFlowComparator=1 azkaban.executorselector.comparator.Memory=1 azkaban.executorselector.comparator.LastDispatched=1 azkaban.executorselector.comparator.CpuUsage=1 添加 azkaban.native.lib=false 和 execute.as.user=false 属性: mkdir -p plugins/jobtypes vim commonprivate.properties azkaban.native.lib=false execute.as.user=false memCheck.enabled=false
4.2.4 exec-server 服务器配置
配置 conf/azkaban.properties:
# Azkaban Personalization Settings azkaban.name=Test azkaban.label=My Local Azkaban azkaban.color=#FF3601 azkaban.default.servlet.path=/index web.resource.dir=web/ default.timezone.id=Asia/Shanghai # Azkaban UserManager class user.manager.class=azkaban.user.XmlUserManager user.manager.xml.file=conf/azkaban-users.xml # Loader for projects executor.global.properties=conf/global.properties azkaban.project.dir=projects # Where the Azkaban web server is located azkaban.webserver.url=https://node-2:8443 # Azkaban mysql settings by default. Users should configure their own username and password. database.type=mysql mysql.port=3306 mysql.host=node-1 mysql.database=azkaban_two_server mysql.user=root mysql.password=hadoop mysql.numconnections=100 # Azkaban Executor settings executor.maxThreads=50 executor.port=12321 executor.flow.threads=30
4.2.5 集群启动
先启动 exec-server
再启动 web-server。
启动 webServer 之后进程失败消失,可通过安装包根目录下对应启动日志进行排查。
需要手动激活 executor
cd /export/servers/azkaban/execserver
curl -G “node-2:$(<./executor.port)/executor?action=activate” && echo
然后重新启动 webServer 就可以了。
4.3 multiple-executor 模式部署
multiple-executor 模式是多个 executor Server 分布在不同服务器上,只需要
将 azkaban-exec-server 安装包拷贝到不同机器上即可组成分布式。
4.3.1 节点规划
4.3.2 scp executor server 安装包到 node-3
启动之后,需要手动激活 executor
cd /export/servers/azkaban/execserver curl -G "node-3:$(<./executor.port)/executor?action=activate" && echo
4.3.3 Azkaban 多 Executor 模式注意事项
Azkaban 多 Executor 模式是指,在集群中多个节点部署 Executor。在这种模式下,
Azkaban web Server 会根据策略,选取其中一个 Executor 去执行任务。
为确保所选的 Executor 能够准确的执行任务,我们须在以下两种方案任选其一,推荐使
用方案二。
方案一:指定特定的 Executor(hadoop102)去执行任务。
1)在 MySQL 中 azkaban 数据库 executors 表中,查询 hadoop102 上的 Executor 的 id。
mysql> use azkaban; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select * from executors; +----+-----------+-------+--------+ | id | host | port | active | +----+-----------+-------+--------+ 1 3 5985 2 4 36363 | 3 | hadoop102 | 12321 | 1 | +----+-----------+-------+--
2)在执行工作流程时加入 useExecutor 属性,如下
方案二:在 Executor 所在所有节点部署任务所需脚本和应用。