目录
是什么
工作流引擎,调度平台,类似oozie
Linkedin开源
怎么安装
1 下载并且编译
主项目git clone https://github.com/azkaban/azkaban.git
需要编译,到目录下,执行以下的命令
./gradlew distTar -x test
2 主要包含三个部分
Azkaban Web服务器,Azkaban执行服务器 ,MySQL数据库
azkaban-web-server-2.5.0.tar.gz
azkaban-executor-server-2.5.0.tar.gz
3 安装配置,很长
3.1 azkaban web服务器安装
解压azkaban-web-server-2.5.0.tar.gz
命令: tar –zxvf azkaban-web-server-2.5.0.tar.gz
将解压后的azkaban-web-server-2.5.0 移动到 azkaban目录中,并重新命名 webserver
命令: mv azkaban-web-server-2.5.0 ../azkaban
cd ../azkaban
mv azkaban-web-server-2.5.0 server
3.2 azkaban 执行服务器安装
解压azkaban-executor-server-2.5.0.tar.gz
命令:tar –zxvf azkaban-executor-server-2.5.0.tar.gz
将解压后的azkaban-executor-server-2.5.0 移动到 azkaban目录中,并重新命名 executor
命令:mv azkaban-executor-server-2.5.0 ../azkaban
cd ../azkaban
mv azkaban-executor-server-2.5.0 executor
azkaban脚本导入
解压: azkaban-sql-script-2.5.0.tar.gz
命令:tar –zxvf azkaban-sql-script-2.5.0.tar.gz
将解压后的mysql 脚本,导入到mysql中:
进入mysql:
mysql> create database azkaban;
mysql> use azkaban;
mysql> source/home/hadoop/azkaban-2.5.0/create-all-sql-2.5.0.sql;
3.3 生成keysotre的密码和相应信息的密钥库
keytool -keystore keystore -alias jetty -genkey -keyalg RSA
一路默认,最后要输入 jetty的密钥口令,也可以直接回车
最好copy一下: mv keystore /opt/module/azkaban/server
3.4 配置时间
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
怎么用
1 启动
启动 web:
在webserver/bin
目录下,执行
nohup bin/azkaban-web-start.sh 1>/tmp/azstd.out 2>/tmp/azerr.out
启动:server:
bin/ azkaban-executor-start.sh
默认不是activate 所以: http://192.168.64.131:12321/executor?action=activate
2 网站
https://4.0.70.175:8083/index
3 上传zip及效果演示
a1.job:
type=command
command=echo 666
a2.job:
type=command
command=echo 888
dependencies=a1
hive.job:
type=command
command=chmod -R 777 /user/azkaban/exec-server/executions
command.1=echo 666
command.2=su hdfs -c 'hive -f hive.sql'
hive.sql:
show databases;
4 在我们系统中的应用 EMR
api: https://azkaban.readthedocs.io/en/latest/ajaxApi.html
怎么实现的(源码)
主要模块
Azkaban的执行代码主要分为四大模块:
(1)azkaban-webserver:主要提供web界面展示和接收http请求的模块
(2)azkaban-execserver:具体执行任务的模块
(3)azkaban-common:公共模块,提供访问数据库,告警等公共类
(4)azkaban-plugins:插件模块,主要包含hive、spark、mr、java等模块
执行流程
总体说明:
Azkaban WebServer需要根据Executor Server的运行状态信息,选择一个合适的Executor Server来运行WorkFlow,然后会将提交到队列中的WorkFlow调度到选定的Executor Server上运行。
从调度层面来看,Azkaban WebServer与Executor Server之间的交互方式非常简单,是通过REST API的方式来进行交互,基本的模式是,Azkaban WebServer根据调度的需要,主动调用Executor Server暴露的REST API来获取相应的资源信息,比如Executor Server的状态信息、分配WorkFlow到指定Executor Server上运行,等等。
1 提交任务
这个可以通过网页和api方式实现,因为太简单,就不说了。
2 选择执行器
选择执行器的原则
- 能够运行WorkFlow的剩余容量,数值越大越优先
- 剩余内存用量,数值越大越优先
- 最近分配Flow的时间,数值越大越优先
- CPU使用用量,数值越小越优先
基于上面4个指标,创建了4个比较器,使用FactorComparator来表示,对需要比较的一组Executor Server,使用这4个比较器进行比较,通过加权后得到一个得分值,根据该得分值选定Executor Server。
3 执行器执行
执行器收到任务的指令后,先到数据库查询相应的信息,然后就可以开始执行了。
4 部分源码分析
时间有限,水平也有限,只看一下azkaban是怎么执行java类的。
先了解一下结构 JavaJob --> JavaProcessJob --> ProcessJob ,箭头是继承
1 通过看配置文件 java/private.properties,我们知道jobtype=javaJob的,是通过JavaJob这个类来执行的
jobtype.class=azkaban.jobtype.JavaJob
2 根据常识,我们认为,这个类,应该是用 run方法去执行。但是 javaJob和和javaProcessJob都没有重写此方法,所以就是执行ProcessJob的run方法了。
3 在ProcessJob的run中,我们看到这一句:commands=getCommandList(),说明他是在构造一个命令,同时我们发现 JavaProcessJob重写了此方法,但是JavaJob没有,说明会用到 JavaProcessJob 里面的 getCommandList。
4 我们又发现 JavaProcessJob 里的 getCommandList 有一句 command+=getJavaClass(); 而且我的 javaJob是有重写这个方法的,所以实际这句会执行 JavaJobRunnerMain.class.getName().
5 JavaJobRunnerMain的构造方法中,调用了 runMethod。而,runMethod里就是传说中的java的反射,然后就把用户的自定义的类给拿到并且执行了。
优缺点
我们 hadoop 2.73支持
daemon指后台运行
和oozie相比较轻量级
使用过程中,发现有一些不太友好的地方:
1 一个项目只能上传一个zip
2 运行的日志不太好获取,api偏少,查询方法也较为单一
3 用户管理做得不好,目前emr使用的方式是配置一个azkaban用户,每次都是用这个用户去执行作业,导致界面上看到全是azkaban。
参考了: