Azkaban工作流调度器
准备:
- 安装好对应版本的mysql
- 安装好对应版本的hadoop集群
- 安装好对应版本的hive
1. 为什么需要工作流调度系统
-
一个完整的数据分析系统通常都是由大量任务单元组成;
- shell脚本程序、java程序、mapreduce程序、hive脚本等
-
各任务单元之间存在时间先后及前后依赖关系
-
为了很好地组织起这样的复杂执行计划,需要一个工作流调度系统来调度执行
2. Azkaban是什么
- Azkaban是由Linkedin开源的一个批量工作流任务调度器。用于在一个工作流内以一个特定的顺序运行一组工作和流程。
- Azkaban定义了一种KV文件(properties)格式来建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。
- 功能特点
- 提供功能清晰、简单易用的web UI界面
- 提供job配置文件快速建立任务和任务之间的关系
- 提供模块化的可插拔机制,原生支持command、java、hive、hadoop
- 基于java开发,代码结构清晰,易于二次开发
3. Azkaban基本架构
-
Azkaban由三部分构成
-
1、Azkaban Web Server
- 提供了Web UI,是azkaban的主要管理者,包括 project 的管理,认证,调度,对工作流执行过程的监控等。
-
2、Azkaban Executor Server
- 负责具体的工作流和任务的调度提交
-
3、Mysql
- 用于保存项目、日志或者执行计划之类的信息
-
4. Azkaban架构的三种运行模式
- 1、solo server mode(单机模式)
H2
web server 和 executor server运行在一个进程里
最简单的模式,数据库内置的H2数据库,管理服务器和执行服务器都在一个进程中运行,任务量不大项目可以采用此模式。
- 2、two server mode
web server 和 executor server运行在不同的进程
数据库为mysql,管理服务器和执行服务器在不同进程,这种模式下,管理服务器和执行服务器互不影响。
- 3、multiple executor mode
web server 和 executor server运行在不同的进程,executor server有多个
该模式下,执行服务器和管理服务器在不同主机上,且执行服务器可以有多个。
5. Azkaban安装部署
- 采用第二种模式,管理服务器、执行服务器分进程,但在同一台主机上。
-
1、下载安装包
- azkaban-web-server-2.5.0.tar.gz
- azkaban-executor-server-2.5.0.tar.gz
- azkaban-sql-script-2.5.0.tar.gz
-
2、规划安装目录
- /kkb/install
-
3、上传安装包到node03服务器
-
4、azkaban web服务器安装
- 4.1 先创建一个目录
mkdir /kkb/install/azkaban
- 4.2 解压azkaban-web-server-2.5.0.tar.gz
tar –zxvf azkaban-web-server-2.5.0.tar.gz -C /kkb/install/azkaban/
- 4.3 重命名解压目录
mv /kkb/install/azkaban/azkaban-web-2.5.0 /kkb/install/azkaban/server
-
4.4 配置SSL安全访问协议
在server目下执行下边的命令 命令: keytool -keystore keystore -alias jetty -genkey -keyalg RSA Keytool: 是java数据证书的管理工具,使用户能够管理自己的公/私钥对及相关证书。 -keystore:指定密钥库的名称及位置(产生的各类信息将不在.keystore文件中) -alias: 对我们生成的.keystore 进行指认别名;如果没有默认是mykey -genkey: 在用户主目录中创建一个默认文件".keystore" -keyalg: 指定密钥的算法 RSA/DSA 默认是DSA 运行此命令后,会提示输入当前生成 keystore的密码及相应信息,输入的密码请劳记,信息如下(建议全部使用123456): ------------------------------------------------------------------- 输入keystore密码: 再次输入新密码: 您的名字与姓氏是什么? [Unknown]: 您的组织单位名称是什么? [Unknown]: 您的组织名称是什么? [Unknown]: 您所在的城市或区域名称是什么? [Unknown]: 您所在的州或省份名称是什么? [Unknown]: 该单位的两字母国家代码是什么 [Unknown]: CN CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN 正确吗? [否]: y 输入<jetty>的主密码 (如果和 keystore 密码相同,按回车): 再次输入新密码: 完成上述工作后,将在当前目录生成 keystore 证书文件,将keystore 考贝到 azkaban webserver 服务器根目录中. 执行拷贝命令: cp keystore /kkb/install/azkaban/server
-
4.5 配置时区
1、先生成时区配置文件Asia/Shanghai,用交互式命令 tzselect 即可 选5 --->选9---->选1----->选1 2、拷贝该时区文件,覆盖系统本地时区配置 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
- 4.6 修改配置文件
- vim /kkb/install/azkaban/server/conf/azkaban.properties
- 4.6 修改配置文件
#内容说明如下:
#Azkaban Personalization Settings
azkaban.name=Test #服务器UI名称,用于服务器上方显示的名字
azkaban.label=My Local Azkaban #描述
azkaban.color=#FF3601 #UI颜色
azkaban.default.servlet.path=/index
web.resource.dir=web/ #默认根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 #global配置文件所在位置
azkaban.project.dir=projects
database.type=mysql #数据库类型
mysql.port=3306 #端口号
mysql.host=node03 #数据库连接IP
mysql.database=azkaban #数据库实例名
mysql.user=root #数据库用户名
mysql.password=123456 #数据库密码
# Velocity dev mode
velocity.dev.mode=false #Jetty服务器属性.
jetty.maxThreads=25 #最大线程数
jetty.ssl.port=8443 #Jetty SSL端口
jetty.port=8081 #Jetty端口
jetty.keystore=keystore #SSL文件名
jetty.password=123456 #SSL文件密码
jetty.keypassword=123456 #Jetty主密码 与 keystore文件相同
jetty.truststore=keystore #SSL文件名
jetty.trustpassword=123456 #SSL文件密码
# 执行服务器属性
executor.port=12321 #执行服务器端口
# 邮件设置
mail.sender=[email protected] #发送邮箱
mail.host=smtp.163.com #发送邮箱smtp地址
mail.user=xxxxxxxx #发送邮件时显示的名称
mail.password=********** #邮箱密码
job.failure.email=[email protected] #任务失败时发送邮件的地址
job.success.email=[email protected] #任务成功时发送邮件的地址
lockdown.create.projects=false
cache.directory=cache #缓存目录
- 4.7 修改配置文件用户配置
- vim /kkb/install/azkaban/server/conf/azkaban-users.xml
- 添加管理员用户
- vim /kkb/install/azkaban/server/conf/azkaban-users.xml
<azkaban-users>
<user username="azkaban" password="azkaban" roles="admin"groups="azkaban"/>
<user username="metrics" password="metrics" roles="metrics"/>
<!--新增admin用户-->
<user username="admin" password="admin" roles="admin,metrics" />
<role name="admin" permissions="ADMIN" />
<role name="metrics" permissions="METRICS"/>
</azkaban-users>
-
5、azkaban 执行服器安装
- 1、解压azkaban-executor-server-2.5.0.tar.gz
tar -zxvf azkaban-executor-server-2.5.0.tar.gz -C /kkb/install/azkaban
- 2、重命名解压目录
mv /kkb/install/azkaban/azkaban-executor-2.5.0 /kkb/install/azkaban/executor
- 3、修改配置文件
- vim /kkb/install/azkaban/executor/conf/azkaban.properties
#Azkaban #时区 default.timezone.id=Asia/Shanghai #数据库设置----->需要修改的信息 mysql.host=node03 #数据库IP地址 mysql.database=azkaban #数据库实例名 mysql.user=root #数据库用户名 mysql.password=123456 #数据库密码
-
6、azkaban脚本导入
- 解压azkaban-sql-script-2.5.0.tar.gz
tar -zxvf azkaban-sql-script-2.5.0.tar.gz -C /kkb/install/azkaban
- 把解压后的脚本导入到mysql中
--进入到mysql mysql> create database azkaban; mysql> use azkaban; mysql> source /kkb/install/azkaban/azkaban-2.5.0/create-all-sql-2.5.0.sql;
6. Azkaban启动
6.1 启动web server服务
- 在azkaban web server服务器目录下执行启动命令
bin/azkaban-web-start.sh
- ps:在web server服务器根目录运行
6.2 启动executor执行服务
- 在azkaban executor服务器目录下执行启动命令
bin/azkaban-executor-start.sh
- ps:在executor服务器根目录运行
- 启动完成后,在浏览器(建议使用谷歌浏览器)中输入https://服务器IP地址:8443 ,即可访问azkaban服务了.在登录中输入刚才新的户用名及密码,点击 login.
- 输入“IP地址:8443”无法访问 web 页面, 且后台报错,原因是浏览器安全证书限制
- 解决办法:使用“https://ip:8443”访问, 发现已经可以访问了, 后台会报证数问题的错误, 忽略即可, 不影响使用, 选择高级 ------> 继续访问该网站
- 输入“IP地址:8443”无法访问 web 页面, 且后台报错,原因是浏览器安全证书限制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mt8hCDBw-1577435209260)(azkaban工作流调度器.assets/azkaban-web.png)]
(1)、projects:azkaban最重要的一部分,创建一个工程,将所有的工作流放在工程中执行
(2)、scheduling:定时调度任务用的
(3)、executing: 显示当前运行的任务
(4)、History : 显示历史运行任务
一个project由3个按钮:
(1)、Flows:一个工作流,由多个job组成
(2)、Permissions:权限管理
(3)、Project Logs:工程日志信息
7. Azkaban实战
7.1 command类型单一job
- 1、创建job描述文件 以.job后缀结尾
- 创建 command.job 文件
#command.job
type=command
command=echo 'hello azkaban......'
-
2、将job资源文件打包成zip文件
-
例如
- command.zip
-
3、通过azkaban的web管理平台创建project并上传job压缩包
- 3、点击运行
- 4、运行完成
7.2 command类型多job工作流
-
1、创建有依赖关系的多个job描述
- 第一个job:start1.job
#start1.job type=command command= echo 'start1...start1...'
- 第二个job:start2.job 它依赖start1.job
#start2.job type=command dependencies=start1 command= echo 'start2...start2...'
-
2、将job资源文件打包成zip文件
- start12.zip
- 3、创建工程,上传zip包,最后启动工作流
- 补充
- 如果一个job有多个依赖的job,可以使用逗号隔开
例如:
#start1.job
type=command
command= echo "start1 job"
#start2.job
type=command
command= echo "start2 job"
#stop.job
type=command
denpendencies=start1,start2
command=echo "stop job"
注意:有多个依赖的job,用逗号隔开
7.3 HDFS操作任务
-
1、创建job描述文件
- vim fs.job
#fs.job type=command command=echo "start execute" command.1=/kkb/install/hadoop-2.6.0-cdh5.14.2/bin/hdfs dfs -mkdir /azkaban command.2=/kkb/install/hadoop-2.6.0-cdh5.14.2/bin/hdfs dfs -put /home/hadoop/source.txt /azkaban
-
2、将job资源文件打包成zip文件
- fs.zip
-
3、创建工程,上传zip包,最后启动工作流
7.4 MAPREDUCE任务
-
MR任务依然可以使用command的job类型来执行
-
1、创建job描述文件,及mr程序jar包
- 示例中直接使用hadoop自带的example jar
- hdfs dfs -mkdir -p /wordcount/in
#mr.job type=command command=/kkb/install/hadoop-2.6.0-cdh5.14.2/bin/hadoop jar hadoop-mapreduce-examples-2.6.0-cdh5.14.2.jar wordcount /wordcount/in /wordcount/out
-
2、将job资源文件打包成zip文件
- mr.zip
-
3、创建工程,上传zip包,最后启动工作流
7.5 HIVE脚本任务
-
1、 创建job描述文件和hive脚本
- Hive脚本: test.sql
use default; create table if not exists test_azkaban(id int,name string,address string) row format delimited fields terminated by ','; load data local inpath '/home/hadoop/azkaban/test.txt' into table test_azkaban; create table if not exists countaddress as select address,count(*) as num from test_azkaban group by address ; insert overwrite local directory '/home/hadoop/azkaban/out' select * from countaddress;
-
准备数据
- vim /home/hadoop/azkaban/test.txt
1,zhangsan,shanghai 2,lisi,beijing 3,xiaoming,shanghai 4,xiaozhang,shanghai 5,xiaogang,beijing
-
2、创建job描述文件
- hive.job
# hive.job type=command command=/kkb/install/hive-1.1.0-cdh5.14.2/bin/hive -f 'test.sql'
-
3、将job资源文件打包成zip文件
- hive.zip
- 4、创建工程,上传zip包,最后启动工作流
8. 任务定时调度
- 在启动工作流的时候,可以点击Schedule,实现定时调度一个工作流
9. webUI 传递参数
-
可以通过webUI动态给job传递参数
-
1、创建一个job的描述文件
-
parameter.job
#parameter.job type=command parameter=${param} command= echo ${parameter}
-
其中
- ${param} 表示解析页面传递的参数param的值,通过声明一个变量parameter去接受
- ==${parameter}==表示获取该parameter变量的值
-
-
2、将job资源文件打包成zip文件
- parameter.zip
-
3、创建工程,上传zip包,最后启动工作流,并且设置参数
- 4、运行完成后的结果