-
- Azkaban简介
- Azkaban的架构
- Azkaban做什么
- Azkaban安装
- mysql
- Create a database for Azkaban For example
- Create a database user for Azkaban For example
- Set user permissions on the database
- Configure Packet Size may need to be configured
- To restart MySQL you can run
- azkaban安装
- 在git上clone一个
- gradle 编译
- 进入到编译后的文件夹
- 配置azkaban
- azkabanproperties加入以下内容
- azkaban-usersxml
- 还有一个很重要的文件也要修改
- azkaban运行
- 任务提交
- mysql
Azkaban简介
Azkaban是一款有LinkedIn开源的任务调度系统,使用该系统可以完成任务的定时调度,执行,任务分片等操作。
官方是这么介绍的:
zkaban was implemented at LinkedIn to solve the problem of Hadoop job dependencies.We had jobs that needed to run in order, from ETL jobs to data analytics products.
Initially a single server solution, with the increased number of Hadoop users over the years, Azkaban has evolved to be a more robust solution.
azkaban在linkedIn内部经常被用来作ETL和大数据分析相关的任务调度。
相对于我们比较熟悉的crontab命令,azkaban可以认为是一种更高级的,能够支持任务的分片与自动执行,同时封装有基于jetty的web ui的这么一款专业的任务调度系统。于此同时,国内也有比较著名的当当网开源的一款任务调度系统,elasticjob.
不过,相对于azkaban,笔者更喜欢使用azkaban,因为其web ui界面更加直观,能够看到不同的job之间的依赖关系,同这这个任务调度系统也更轻量化。
Azkaban的架构
azkaban使用java开发,封装了jetty作为轻量的web服务器,使用web ui来操控,web ui能够直观地看到不同的任务之间的依赖关系,azkaban可以单点部署,也可以双机部署,对于一般的情况,单点部署就足够了。
他的架构示意图官方是这么给出的:
官方是这么介绍的:
Azkaban consists of 3 key components:
Relational Database (MySQL)
AzkabanWebServer
AzkabanExecutorServer
在我们很多工程情况下,webserver 就是 executor server,这样就是单点部署,同时,需要我们安装mysql作为持久化的数据库。
Azkaban做什么?
我们用azkaban主要解决的业务场景是:
- 对日志等原始数据进行ETL
- 将ETL后的数据存储起来,可以是mongodb,也可以是hbase等
- 对数据进行分析
- 任务完成或失败通知管理员
这样,我们就可以利用azkaban来进行任务调度,主要应用场景就是离线计算了。
在上面,我们已经知道了,大数据离线计算相关内容是存在一种依赖关系的,最简单的例子是先要ETL,然后才能进行分析。
Azkaban可以在我们睡觉的时候,帮我们完成日志的ETL和自动分析任务的创建和监控,无人值守,方便轻松。
Azkaban安装
mysql
首先得安装Mysql,然后配置mysql,下面按照官方的步骤,进行修改如下:
首先登录到mysql shell,然后输入密码:
mysql -uroot -p
Create a database for Azkaban. For example:
创建数据库,名为azkaban
mysql> CREATE DATABASE azkaban;
Create a database user for Azkaban. For example:
Example database creation command. The user name doesn’t need to be ‘azkaban’
创建用户名和密码
mysql> CREATE USER 'username'@'%' IDENTIFIED BY 'password';
例如:
CREATE USER 'azkaban'@'%' IDENTIFIED BY 'azkaban';
Set user permissions on the database.
Create a user for Azkaban if one hasn’t been made, and give the user INSERT, SELECT, UPDATE, DELETE permission on all tables in the Azkaban db.
Replace db, username with the ones created by the previous steps.
设置权限
mysql> GRANT all ON .* to ''@'%' WITH GRANT OPTION;
例如:
GRANT all ON azkaban.* to 'azkaban'@'%' WITH GRANT OPTION;
Configure Packet Size may need to be configured.
MySQL may have, by default, a ridiculously low allowable packet size. To increase it, you’ll need to have the property max_allowed_packet set to something higher, say 1024M.
To configure this in linux, open /etc/my.cnf. Somewhere after mysqld, add the following:
配置/etc/my.cnf
文件的参数:
[mysqld]
...
max_allowed_packet=1024M
To restart MySQL, you can run…
重启服务,配置生效
$ sudo /sbin/service mysqld restart
azkaban安装
在git上clone一个:
git clone https://github.com/azkaban/azkaban.git
gradle 编译
这里说明以下,因为azkaban可能会用到node.js的npm,所以如果失败的话可以安装下node.js,由于我的server安装过node.js环境,我不知道不安装是否会失败。
# Build Azkaban
./gradlew build
# Build and install distributions
./gradlew installDist
进入到编译后的文件夹
在azkaban源代码的根目录下,注意我说的是源代码的根目录下,这个文件路径有点儿恶心,别找错了:
cd ./azkaban-solo-server/build/install/azkaban-solo-server
之后这个路径我们就是我们相对路径的参考路径了,下面称之为 azkaban-solo-server 目录,切记!
这个文件路径是单机部署编译出来的,从solo这个单词也能看出来,我们执行节点和web server节点都是同一个,对于很多情况,这种就足够了。
配置azkaban
在这个 azkaban-solo-server
目录下,找到conf目录,cd进去,修改几个文件:
azkaban.properties加入以下内容
database.type=mysql
mysql.port=3306
mysql.host=localhost
mysql.database=azkaban
mysql.user=azkaban
mysql.password=azkaban
mysql.numconnections=100
这个是Mysql的配置信息,根据自己的情况修改
azkaban-users.xml
这个里面是WEB UI默认登录的用户名和密码,看情况改,easy!
默认的用户名和密码都是azkaban
还有一个很重要的文件也要修改!
在azkaban-solo-server目录下,修改相对路径这个配置文件
vi ./plugins/jobtypes/commonprivate.properties
加入:
memCheck.enabled=false
因为:
azkaban默认要求机器是3G及以上的,我们很多情况的vps都达不到这个水平,我们必须修改这个配置,否则任务将一直为running状态!
azkaban运行
在在azkaban-solo-server目录下,运行:
./bin/azkaban-solo-start.sh
注意:
一定要在这个路径下运行,因为这个shell中很多用的都是相对路径,如果不在这个路径下运行,mysql数据库会初始化失败的喔~
之所以没用nohup运行,是为了看看是不是会报错,如果有报错,后续根据异常情况好方便排查!
如果要关闭任务,也运行:
./bin/azkaban-solo-shutdown.sh
任务提交
web ui的默认端口号是8081,通过这个端口号访问web ui.
登录到web ui之后,会有任务创建,这个倒是没什么,就是后面要求Upload一个任务,这里注意下:
upload的文件是zip压缩的压缩包,在压缩包中可以包含多个任务,表示任务文件的扩展名是.job
然后,多个job文件打包在一起,这些job文件的格式是:
eg. demo.job
type=command
#用command来执行shell脚本,这个脚本放到压缩包里打包,注意路径
command=sh /job/analysis.sh
dependencies=etl
etl.job
type=command
#这个command当然也可以是python脚本啦
command=python /root/demo/etl.py
#这里也可以是任务执行机器的绝对路径
#无依赖
然后,把上面需要的job文件,sh文件等等打成一个zip压缩包,上传,即可看到生成一个DAG,这个DAG就是我们要调度的任务.
web ui一共也没几个按钮,就那么些功能,剩下的随便点点就知道都怎么用了~