Azkaban
简介
Azkaban是一个分布式工作流管理器,被LinkedIn用来解决Hadoop的作业依赖性问题。我们从ETL作业到数据分析产品中也有许多工作需要按照顺序运行。
使用场景
在大数据业务处理场景中,经常有这样的分析场景:
任务A:将收集到的数据通过一系列的规则进行清洗,然后存入Hive表a中。
任务B:将Hive中已存在的b表和c表进行关联得到表d。
任务C:将A任务得到的表a与B任务得到的表d进行关联得到分析的结果表e。
任务D:最后将Hive中得到的表e通过sqoop导入到关系型数据库MySQL中供web端查询使用。
在以上任务中,存在依赖关系:
A,B <= C <= D
即任务D依赖于任务C,任务C依赖于任务A与任务B。
这个时候需要操作者在调用时重点关注依赖关系,防止程序运行异常或者数据错误。如果依赖关系越来越多,越来越繁杂,那么出现问题的可能性将会大幅度增加。
使用Azkaban时,操作者通过定义job之间的依赖关系,就可以达到job有序进行的效果。具有复杂的依赖关系的jobs再也不用手工去进行干预。
关键组件
AzkabanWebServer
主要负责项目管理、用户登录权限认证、定时执行工作任务、跟踪提交任务执行的流程、访问历史执行任务、保存执行计划的状态等。
AzkabanExecutorServer
主要负责工作流程的提交、执行、检索和更新当前正在执行计划的数据,处理执行计划的日志。
关系型数据库
保存工作流中的元数据信息
安装步骤
环境说明
Cent OS 7.9.2009
编译源码
下载源码Source code (tar.gz)。
解压并重命名:
tar -zxf azkaban-3.80.1.tar.gz -C ./
mv azkaban-3.80.1.tar.gz azkaban
使用gradle
命令打包:
cd azkaban
./gradlew distTar
在用户家目录新建azkabanApp目录,将编译好的文件复制过来:
mkdir ~/azkabanApp
cd ~/azkabanApp
cp azkaban/azkaban-web-server/build/distributions/azkaban-web-server-0.1.0-SNAPSHOT.tar.gz ./
cp azkaban/azkaban-exec-server/build/distributions/azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz ./
cp azkaban/azkaban-db/build/distributions/azkaban-db-0.1.0-SNAPSHOT.tar.gz ./
解压并重命名:
tar -zxf azkaban-web-server-0.1.0-SNAPSHOT.tar.gz -C ./
tar -zxf azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz -C ./
tar -zxf azkaban-db-0.1.0-SNAPSHOT.tar.gz -C ./
mv azkaban-web-server-0.1.0-SNAPSHOT azkaban-web
mv azkaban-exec-server-0.1.0-SNAPSHOT azkaban-exec
mv azkaban-db-0.1.0-SNAPSHOT azkaban-db
数据库
安装mysql5.7
,过程略。本文中是在CentOS中安装运行Azkaban,在Windows中安装Mysql。远程连接Mysql时,需要对Mysql用户配置可远程连接。
进入mysql数据,执行:
# 这里的123456为你给新增权限用户设置的密码,%代表所有主机,也可以具体到你的主机ip地址
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456';
# 从mysql数据库的grant表中重新加载权限数据
flush privileges;
新建azkaban数据库,注意字符集选择latin1
,如果用utf-8
,会因为索引字节过长而报错。
将azkaban-db中的create-all-sql-0.1.0-SNAPSHOT.sql
在mysql数据库中运行,得到所有表:
SSL配置
进入azkaban-web
目录,创建ssl配置:
cd ~/azkabanApp/azkaban-web
keytool -keystore keystore -alias jetty -genkey -keyalg RSA
两次密码输入一致,中间信息可以不用输入,直接回车,最后确认的时候输入Y
。
此时就会在azkaban-web
下多出一个keystore
文件。
AzkabanWebServer
修改azkaban-web/config/azkaban.properties
配置文件:
# Azkaban Personalization Settings
# 服务器UI上显示的名字
azkaban.name=Azkaban
# 描述
azkaban.label=My Local Azkaban
# webui颜色
azkaban.color=#FF3601
# 默认路由
azkaban.default.servlet.path=/index
# web目录
web.resource.dir=/home/hadoop/azkabanApp/azkaban-web/web/
# 默认时区,用于任务调度定时
default.timezone.id=Asia/Shanghai
# 用户权限管理类
user.manager.class=azkaban.user.XmlUserManager
# 用户配置文件
user.manager.xml.file=/home/hadoop/azkabanApp/azkaban-web/conf/azkaban-users.xml
# 全局配置文件
executor.global.properties=/home/hadoop/azkabanApp/azkaban-web/conf/global.properties
azkaban.project.dir=projects
# Velocity dev mode
velocity.dev.mode=false
# Azkaban Jetty server properties.
jetty.use.ssl=false
jetty.maxThreads=25
jetty.port=8081
jetty.keystore=/home/hadoop/azkabanApp/azkaban-web/keystore
jetty.password=azkaban
jetty.keypassword=azkaban
jetty.truststore=/home/hadoop/azkabanApp/azkaban-web/keystore
jetty.trustpassword=azkaban
jetty.ssl.port=8443
# Azkaban Executor settings
# mail settings
mail.sender=
mail.host=
# User facing web server configurations used to construct the user facing server URLs. They are useful when there is a reverse proxy between Azkaban web servers and users.
# enduser -> myazkabanhost:443 -> proxy -> localhost:8081
# when this parameters set then these parameters are used to generate email links.
# if these parameters are not set then jetty.hostname, and jetty.port(if ssl configured jetty.ssl.port) are used.
# azkaban.webserver.external_hostname=myazkabanhost.com
# azkaban.webserver.external_ssl_port=443
# azkaban.webserver.external_port=8081
job.failure.email=
job.success.email=
lockdown.create.projects=false
cache.directory=cache
# JMX stats
jetty.connector.stats=true
executor.connector.stats=true
# executor 服务器端口
executor.port=12312
# Azkaban mysql settings by default. Users should configure their own username and password.
database.type=mysql
mysql.port=3306
mysql.host=192.168.1.21
mysql.database=azkaban
mysql.user=root
mysql.password=root
mysql.numconnections=100
#Multiple Executor
azkaban.use.multiple.executors=true
azkaban.executorselector.filters=StaticRemainingFlowSize,CpuStatus
azkaban.executorselector.comparator.NumberOfAssignedFlowComparator=1
azkaban.executorselector.comparator.Memory=1
azkaban.executorselector.comparator.LastDispatched=1
azkaban.executorselector.comparator.CpuUsage=1
AzkabanExecutorServer
修改azkaban-exex/config/azkaban.properties
配置文件:
# Azkaban Personalization Settings
azkaban.name=Test
azkaban.label=My Local Azkaban
azkaban.color=#FF3601
azkaban.default.servlet.path=/index
web.resource.dir=/home/hadoop/azkabanApp/azkaban-web/web/
default.timezone.id=Asia/Shanghai
# Azkaban UserManager class
user.manager.class=azkaban.user.XmlUserManager
user.manager.xml.file=/home/hadoop/azkabanApp/azkaban-web/conf/azkaban-users.xml
# Loader for projects
executor.global.properties=/home/hadoop/azkabanApp/azkaban-web/conf/global.properties
azkaban.project.dir=projects
# Velocity dev mode
velocity.dev.mode=false
# Azkaban Jetty server properties.
jetty.use.ssl=false
jetty.maxThreads=25
jetty.port=8081
# Where the Azkaban web server is located
azkaban.webserver.url=http://192.168.1.43:8081
# mail settings
mail.sender=
mail.host=
# User facing web server configurations used to construct the user facing server URLs. They are useful when there is a reverse proxy between Azkaban web servers and users.
# enduser -> myazkabanhost:443 -> proxy -> localhost:8081
# when this parameters set then these parameters are used to generate email links.
# if these parameters are not set then jetty.hostname, and jetty.port(if ssl configured jetty.ssl.port) are used.
# azkaban.webserver.external_hostname=myazkabanhost.com
# azkaban.webserver.external_ssl_port=443
# azkaban.webserver.external_port=8081
job.failure.email=
job.success.email=
lockdown.create.projects=false
cache.directory=cache
# JMX stats
jetty.connector.stats=true
executor.connector.stats=true
# Azkaban plugin settings
azkaban.jobtype.plugin.dir=plugins/jobtypes
# Azkaban mysql settings by default. Users should configure their own username and password.
database.type=mysql
mysql.port=3306
mysql.host=192.168.1.21
mysql.database=azkaban
mysql.user=root
mysql.password=root
mysql.numconnections=100
# Azkaban Executor settings
executor.maxThreads=50
executor.flow.threads=30
executor.port=12321
启动与关闭
启动
先启动AzkabanExecutorServer
再启动AzkabanWebServer
。
进入azkaban-exec
,执行./bin/start-exec.sh
。
cd azkaban-exec
./bin/start-exec.sh
进入azkaban-web
,执行./bin/start-web.sh
。
cd azkaban-web
./bin/start-web.sh
关闭
先关闭AzkabanWebServer
再关闭AzkabanExecutorServer
。
进入azkaban-web
,执行./bin/shutdown-web.sh
。
cd azkaban-web
./bin/shutdown-web.sh
进入azkaban-exec
,执行./bin/shutdown-exec.sh
。
cd azkaban-exec
./bin/shutdown-exec.sh
查看程序状态
用jps
查看正在运行的程序:
如果有一个程序启动失败,可以在azkaban-web/logs
或者azkaban-exec/logs
中查看日志。
常见问题
AzkabanWebServer
启动失败,日志报错:
打开数据库中executors
表,找到port
为12321
的记录,将active
字段从0改为1:
重新启动AzkabanWebServer
。
使用
浏览器打开http://${yourServerIp}:8081/
Azkaban
中的project
、mermaid flowchat
、job
之间的关系:
- 一个
project
中可以包含多个mermaid flowchat
- 一个
mermaid flowchat
包含多个job
job
是Azkaban
中运行的一个进程,可以是简单的linux
命令、shell
脚本等等- 一个
job
可以依赖于另外几个job
,多个job
之间的依赖关系组成mermaid flowchat
,也就是任务流
设计流程
根据文本开始的使用场景描述,我们可以抽象成4个job,分别是job1、job2、job3、job4。每个job都执行一个shell脚本。
job4依赖job3的结果,job3依赖job1与job2的结果。
创建项目
点击创建项目,输入项目名称与描述。注意不能为中文,否则报错:
因为mysql
中azkaban
数据库的字符集为latin1
,所以不能用中文。
编写脚本
在用户家目录创建projectShell
文件夹,用来存放测试shell脚本:
mkdir ~/projectShell
cd projectShell
创建四个脚本文件:
vim job1.sh
#!/bin/bash
echo "开始执行 job1 ... ..."
echo "正在执行 job1 ... ..."
echo "执行完成 job1 ... ..."
vim job2.sh
#!/bin/bash
echo "开始执行 job2 ... ..."
echo "正在执行 job2 ... ..."
echo "执行完成 job2 ... ..."
vim job3.sh
#!/bin/bash
echo "开始执行 job3 ... ..."
echo "正在执行 job3 ... ..."
echo "执行完成 job3 ... ..."
vim job4.sh
#!/bin/bash
echo "开始执行 job4 ... ..."
echo "正在执行 job4 ... ..."
echo "执行完成 job4 ... ..."
编写job
job格式:
文件后缀为job
。
type=command
command=需要执行的脚本或命令
每一个脚本命令都编写一个job,如job1.job:
type=command
command=sh /home/hadoop/projectShell/job1.sh
创建Flow
将上述4个job文件打包成zip格式的压缩包。
在项目内点击Upload,上传压缩包:
上传完成后就会出现job的树形图:
Azkaban 默认 Flow 是以最后一个没有依赖的 job的名字命名的。
执行Flow
点击执行Flow:
可以看到job的执行依赖关系;左下角Schedule为创建定时规则,定时运行;右下角为直接运行。
点击Execute后在Job List
中可以看到每个job的运行情况;通过Timeline
可以看到运行顺序;通过Details
中的Log可以看到每个job运行的日志。
job2的log: