文章目录
简介
Azkaban是一套简单的任务调度服务,整体包括三个部分元数据DB、web-server、exec-server。它是有linkedin的开源项目,用于批量工作流的任务调度器。用于在一个工作流内以一个特定的顺序运行一组工作和流程。
Azkaban定义了一种KV文件格式来建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。
- 1、元数据DB
azkaban将大多数状态信息都存于MySQL中。
- 2、Azkaban Web Server
提供了Web UI,是azkaban的主要管理者,包括 project 的管理,认证,调度,对工作流执行过程的监控等。
- 3、Azkaban Executor Server
调度工作流和任务,纪录工作流活任务的日志,之所以将AzkabanWebServer和AzkabanExecutorServer分开,主要是因为在某个任务流失败后,可以更方便的将重新执行。而且也更有利于Azkaban系统的升级
环境准备
- 1.安装好Mysql,安装过程见Mysql的安装
- 2.安装好JDK1.8
- 3.安装好nodejs
编译Azkaban4.0.4
下载地址
azkaban-4.0.0:下载地址:https://github.com/azkaban/azkaban/releases
编译
1.下载并解压文件
# 下载文件
[root@k8s-node8 software]# wget https://github.com/azkaban/azkaban/releases/4.0.0.tar.gz
# 解压文件
[root@k8s-node6 software]# tar -xzvf 4.0.0.tar.gz
[root@k8s-node6 software]# cd azkaban-4.0.0/
[root@k8s-node6 azkaban-4.0.0]# ls
az-core az-flow-trigger-dependency-plugin
az-intellij-style.xml azkaban-exec-server
azkaban-web-server CONTRIBUTING.md
gradlew README.md test
az-crypto az-flow-trigger-dependency-type az-jobsummary
azkaban-hadoop-security-plugin az-reportal docs
gradlew.bat requirements.txt tools
az-examples az-hadoop-jobtype-plugin azkaban-common
azkaban-solo-server build.gradle gradle
LICENSE settings.gradle
az-exec-util az-hdfs-viewer azkaban-db
azkaban-spi cached-http-filesystem
gradle.properties NOTICE temp
2.修改azkaban-4.0.0目录下的build.gradle文件
打开azkaban-4.0.0目录下的build.gradle文件,更改linkedin的maven仓库地址,原有的仓库地址在国内打不开,编译会报错
找到build.gradle文件中的:
maven{
url 'https://linkedin.bintray.com/maven'
}
修改为如下所示:
maven {
url 'https://linkedin.jfrog.io/artifactory/open-source/'
}
3.修改nodejs相关地址
进入到/home/software/azkaban-4.0.0/azkaban-web-server目录中,打开build.gradle文件,将node选项中的download配置值设为false,如下所示。
node {
// Version of node to use.
version = '8.10.0'
// Version of npm to use.
npmVersion = '5.6.0'
// Base URL for fetching node distributions (change if you have a mirror).
distBaseUrl = 'https://nodejs.org/dist'
// If true, it will download node using above parameters.
// If false, it will try to use globally installed node.
download = false
// Set the work directory for unpacking node
workDir = file("${project.buildDir}/nodejs")
// Set the work directory where node_modules should be located
nodeModulesDir = file("${project.projectDir}")
}
使用本机已经安装好了的nodejs进行编译,如果不修改的话,在编译过程中会去下载node8.10.0,很有可能会因为网络问题下载失败,从而导致编译失败。
4.修改azkaban-db代码,以支持Mysql8.X系列数据库
azkaban默认只支持Mysql5.X(代码中的mysql数据库加载JDBC的驱动类写死了),所以需要改造一下让他既支持Mysql5.x又支持Mysql8.x。
进入/home/software/azkaban-4.0.0/azkaban-db/src/main/java/azkaban/db目录,修改MySQLDataSource.java
@Inject
public MySQLDataSource(final Props props, final DBMetrics dbMetrics) {
super();
this.dbMetrics = dbMetrics;
final int port = props.getInt("mysql.port");
final String host = props.getString("mysql.host");
final String dbName = props.getString("mysql.database");
final String user = props.getString("mysql.user");
final String password = props.getString("mysql.password");
final int numConnections = props.getInt("mysql.numconnections");
//加上mysql的驱动类配置项,如果没有配置则默认是mysql5.x
//-----------------begin-----------------------
String driverName = props.getString("mysql.driverName");
if(driverName == null){
driverName = "com.mysql.jdbc.Driver";
}
//-----------------end-----------------------
final String url = "jdbc:mysql://" + (host + ":" + port + "/" + dbName);
addConnectionProperty("useUnicode", "yes");
addConnectionProperty("characterEncoding", "UTF-8");
//setDriverClassName(com.mysql.jdbc.Driver);
//修改成从配置中读取驱动类名
addConnectionProperty("useSSL", "false");
setDriverClassName(driverName);
setUsername(user);
setPassword(password);
setUrl(url);
setMaxTotal(numConnections);
setValidationQuery("/* ping */ select 1");
setTestOnBorrow(true);
}
5.进行编译
[root@k8s-node6 db]# cd /home/software/azkaban-4.0.0/
[root@k8s-node6 azkaban-4.0.0]# ./gradlew build
[root@k8s-node6 azkaban-4.0.0]# ./gradlew installDist
该踩的坑我已经踩过了,按照上述过程操作,不出意外的话应该可以非常顺利的编译成功,编译成功后就可以进行下一步安装配置操作了。
安装
azkaban的安装分为两种模式,一种是Solo Server的模式,一种是Multi Executor Server的模式。使用更多的一般都是Multi Executor Server的方式,下面我将讲解Multi Executor Server的部署过程。
安装配置azkaban-db
创建azkaban的数据库和用户
- 1.创建数据库
mysql> CREATE DATABASE azkaban;
- 2.创建用户
mysql> CREATE USER 'azkaban'@'%' IDENTIFIED BY 'mysqlazkaban';
如果涉及到因密码太简单而报错(Mysql8.x系列大概率会报错),则需临时更改密码策略为Low级别,再执行上述操作。
mysql> set GLOBAL validate_password.policy=LOW
- 3.用户授权
mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON azkaban.* to 'azkaban'@'%' WITH GRANT OPTION;
mysql> flush privileges;
2.初始化数据库表
进入到 azkaban-db/build/install/azkaban-db/ 目录下
[root@k8s-node6 azkaban-4.0.0]# cd azkaban-db/build/install/azkaban-db/
[root@k8s-node6 azkaban-db]#
[root@k8s-node6 azkaban-db]# ls
create.active_executing_flows.sql create.execution_logs.sql create.project_permissions.sql create.ramp_exceptional_flow_items.sql upgrade.3.104.0.to.3.105.0.sql upgrade.3.83.0.to.3.84.0.sql
create.active_sla.sql create.executor_events.sql create.project_properties.sql create.ramp_exceptional_job_items.sql upgrade.3.20.0.to.3.22.0.sql upgrade.3.84.0.to.3.85.0.sql
create-all-sql-0.1.0-SNAPSHOT.sql create.executors.sql create.projects.sql create.ramp_items.sql upgrade.3.43.0.to.3.44.0.sql upgrade.3.85.0.to.3.86.0.sql
create.containerization-tables-all.sql create.project_events.sql create.project_versions.sql create.ramp.sql upgrade.3.68.0.to.3.69.0.sql
create.execution_dependencies.sql create.project_files.sql create.properties.sql create.triggers.sql upgrade.3.69.0.to.3.70.0.sql
create.execution_flows.sql create.project_flow_files.sql create.quartz-tables-all.sql create.validated_dependencies.sql upgrade.3.76.0.to.3.77.0.sql
create.execution_jobs.sql create.project_flows.sql create.ramp_dependency.sql database.properties upgrade.3.80.0.to.3.81.0.sql
[root@k8s-node6 azkaban-db]#
其中create-all-sql-0.1.0-SNAPSHOT.sql 就是整个azkaban所需要的初始化数据库脚本。
登录数据库,初始化数据库脚本。
mysql> use azkaban;
mysql> source create-all-sql-0.1.0-SNAPSHOT.sql;
安装配置azkaban-exec-server
- 1.进入到/home/software/azkaban-4.0.0/azkaban-exec-server/build/install/azkaban-exec-server/目录中
[root@k8s-node6 ~]# cd /home/software/azkaban-4.0.0/azkaban-exec-server/build/install/azkaban-exec-server/
[root@k8s-node6 azkaban-exec-server]#
[root@k8s-node6 azkaban-exec-server]# cd conf/
[root@k8s-node6 conf]# ls
azkaban.properties global.properties log4j.properties
- 2.打开azkaban.properties文件,其中有如下值需要修改:
# web-server的端口监听和是否启用https
jetty.use.ssl=false
jetty.maxThreads=25
jetty.port=8081 //默认端口是8081,如果有冲突则可以修改成其他值
# 数据库的相关配置信息
database.type=mysql
# mysql8.x需要加上驱动的配置,上面我们更改过代码
mysql.driverName=com.mysql.cj.jdbc.Driver
mysql.port=3306
mysql.host=127.0.0.1
mysql.database=azkaban
mysql.user=azkaban
mysql.password=mysqlazkaban
mysql.numconnections=100
- 3.启动azkaban-exec-server执行器
[root@k8s-node6 azkaban-exec-server]# bin/start-exec.sh
[root@k8s-node6 azkaban-exec-server]# ls
bin conf currentpid executions executor.port lib logs plugins projects temp
[root@k8s-node6 azkaban-exec-server]#
如果出现了executor.port文件,则说明executor启动成功
Tips: 启动的时候一定要bin/start-exec.sh的方式启动,不要进入到bin目录再执行start-exec.sh,否则可能会报错,从而启动不成功。
- 4.激活Executor
在executor.port所在的目录执行如下操作
[root@k8s-node6 azkaban-exec-server]# curl -G "localhost:$(<./executor.port)/executor?action=activate" && echo
{"status":"success"}
安装配置azkaban-web-server
进入到/home/software/azkaban-4.0.0/azkaban-web-server/build/install/azkaban-web-server目录中:
1.配置conf
[root@k8s-node6 azkaban-web-server]# cd conf/
[root@k8s-node6 conf]# ls
azkaban.properties azkaban-users.xml global.properties log4j.properties
- azkaban.properties 是azkaban-web-server的配置文件
- azkaban-user.xml是azkaban的用户配置文件,(可以在此文件中新增用户或者修改密码)
- global.properties文件中可以配置一些全局的属性。
打开azkaban.properties文件,其中有如下值需要修改:
# web-server的端口监听和是否启用https
jetty.use.ssl=false
jetty.maxThreads=25
jetty.port=8083 //默认端口是8081,如果有冲突则可以修改成其他值
# 数据库的相关配置信息
database.type=mysql
# mysql8.x需要加上驱动的配置,上面我们更改过代码
mysql.driverName=com.mysql.cj.jdbc.Driver
mysql.port=3306
mysql.host=127.0.0.1
mysql.database=azkaban
mysql.user=azkaban
mysql.password=mysqlazkaban
mysql.numconnections=100
2. 启动azkaban-web-server
要先启动最少一个Executor,才能启动web-server。
[root@k8s-node3 azkaban-web-server-4.0.0]# bin/start-web.sh
启动完毕后,在浏览器中输入http://192.168.0.52:8083/,就可以进入到azkaban的web管理工具中。
用户名密码默认都是azkaban/azkaban
可能遇到的问题
- 1.Could not HEAD ‘https://linkedin.bintray.com/maven/com/linkedin/pegasus/generator/28.3.11/generator-28.3.11.pom’. Received status code 502 from server: Bad Gateway
3: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':azkaban-web-server:restliTemplateGenerator'.
> Could not resolve all files for configuration ':azkaban-web-server:generateRestli'.
> Could not resolve com.linkedin.pegasus:generator:28.3.11.
Required by:
project :azkaban-web-server
> Could not resolve com.linkedin.pegasus:generator:28.3.11.
> Could not get resource 'https://linkedin.bintray.com/maven/com/linkedin/pegasus/generator/28.3.11/generator-28.3.11.pom'.
> Could not HEAD 'https://linkedin.bintray.com/maven/com/linkedin/pegasus/generator/28.3.11/generator-28.3.11.pom'. Received status code 502 from server: Bad Gateway
> Could not resolve com.linkedin.pegasus:restli-tools:28.3.11.
Required by:
project :azkaban-web-server
> Skipped due to earlier error
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
==============================================================================
* Get more help at https://help.gradle.org
BUILD FAILED in 7s
22 actionable tasks: 19 executed, 3 from cache
解决:
找到build.gradle文件中的:
maven{
url 'https://linkedin.bintray.com/maven'
}
修改为如下所示:
maven {
url 'https://linkedin.jfrog.io/artifactory/open-source/'
}
- 2.如果遇到无法连接Mysql8.x数据库的错误,查看上述更改方式。