Azkaban3.x两种部署模式

Azkaban3.x两种部署模式

在Azkaban3.0之后的版本中,官网提供了两种部署模式:

  • stand alone “solo-server” mode(单机模式)
  • distributed multiple-executor mode(分布式多执行器模式)

    区别

    在solo server mode模式中,web server 和 executor server运行在同一个进程中。
    进程名称为AzkabanSingleServer。
    数据库使用自带的H2来做数据持久化。
    该模式适合测试环境以及小规模工作流调度

在multiple-executor mode模式中,web server 和 executor server运行在不同的进程中。
进程名称分别为AzkabanWebServer和AzkabanExecutorServer。
数据库使用MySQL实例来做数据持久化。
该模式适合生产环境

源码编译

源码下载

官网下载指定版本:https://azkaban.github.io/downloads.html
这里以Releases下的azkaban-3.88.0.tar.gz为例。

环境依赖

Azkaban源码的编译需要依赖JDK环境和Git环境。同时,由于网络环境的不同,可能需要提前下载好相关Gradle版本依赖包。

安装JDK

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
## 创建文件夹
[root@node01 opt]# mkdir /usr/java
## 解压到指定文件夹
[root@node01 opt]# tar -zxvf jdk-8u162-linux-x64.tar.gz-C /usr/java/
## 修正所属用户及用户组
[root@node01 opt]# cd /usr/java
[root@node01 java]# chown -R root:root /usr/java/jdk1.8.0_162/
## 配置Java环境变量,末尾追加
[root@node01 java]# vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_162
export PATH=$JAVA_HOME/bin:$PATH
## 使配置生效并查看
[root@node01 java]# source /etc/profile
[root@node01 java]# which java
/usr/java/jdk1.8.0_162/bin/java
[root@node01 java]# java -versionjava
version "1.8.0_162"
Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)

安装Git

1
2
3
4
5
6
7
8
## 查看是否安装git
[root@node01 ~]# which git
/usr/bin/which: no git in (/usr/java/jdk1.8.0_162/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
## 使用yum命令进行安装
[root@node01 ~]# yum install -y git
## 安装完成之后再次查看
[root@node01 ~]# which git
/usr/bin/git

下载Gradle版本依赖包

Gradle是一个项目自动化构建开源工具。
Azkban3.x的源码编译需要依赖Gradle,这里我们可以提前下载好所需要的Gradle版本。
具体Gradle所需要的版本信息可以在解压好的azkaban源码路径下的gradle/wrapper/gradle-wrapper.properties文件中查看。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
## 1. 查看所需Gradle版本路径
## 解压azkaban-3.*.tar.gz到指定目录并查看所需Gradle版本路径
[root@node01 opt]# tar -zxvf azkaban-3.90.0.tar.gz
[root@node01 opt]# cd azkaban-3.70.2/gradle/wrapper/
[root@node01 wrapper]# cat gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip

## 2. 根据路径提前下载好相关zip包
##这里下载好的zip包需要保存在/gradle/wrapper/目录下,所以我们直接在/gradle/wrapper/目录下使用wget命令
[root@node01 wrapper]# which wget
/usr/bin/wget
## 如果没有安装wget,使用yum命令先安装wget
[root@node01 wrapper]# yum install -y wget
## 下载指定gradle版本zip包
wget https\://services.gradle.org/distributions/gradle-4.6-all.zip
## 下载前目录
[root@node01 wrapper]# ls
gradle-wrapper.jar gradle-wrapper.properties
## 下载后目录
[root@node01 wrapper]# ls
gradle-4.6-all.zip gradle-wrapper.jar gradle-wrapper.properties

## 3. 配置本地路径
## 将网络路径改为本地路径,这里我们使用相对路径
distributionUrl=gradle-4.6-all.zip

源码编译

1
2
3
4
5
6
7
# 编译环境clean
[root@node01 azkaban-3.88.0]# ./gradlew clean
# 源码编译(跳过测试)
[root@node01 azkaban-3.88.0]# ./gradlew build -x test
## 等待源码编译完成后,查看编译好的文件,以azkaban-solo-server模块为例
[root@node01 azkaban-3.88.0]# ls azkaban-solo-server/build/distributions/
azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz azkaban-solo-server-0.1.0-SNAPSHOT.zip

可能出现的问题

受网络环境影响,可能出现编译失败的情况,一般都是相关依赖jar包下载失败,重新执行相关命令即可。

Azkaban3.x Solo Server模式安装部署

环境依赖

从Azkaban3.x源码编译根目录路径下/azkaban-solo-server/build/distributions获取相关tar包。

1
2
[root@node01 distributions]# ls
azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz azkaban-solo-server-0.1.0-SNAPSHOT.zip

安装部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
## 1. 解压文件
## 解压文件到指定目录
[root@node01 distributions]# tar -xzvf azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz -C /opt/
## 查看解压之后的文件并重命名
[root@node01 distributions]# cd /opt/
[root@node01 opt]# ls
azkaban-3.88.0 azkaban-3.88.0.tar.gz azkaban-solo-server-0.1.0-SNAPSHOT
[root@node01 opt]# mv azkaban-solo-server-0.1.0-SNAPSHOT/ azkaban-solo-server
[root@node01 opt]# ls
azkaban-3.88.0 azkaban-3.88.0.tar.gz azkaban-solo-server

## 2. 修改配置文件
## 这里主要是修改时区,默认的是America/Los_Angeles,改为Asia/Shanghai
[root@node01 azkaban-solo-server]# vim conf/azkaban.properties
## default.timezone.id=America/Los_Angeles
default.timezone.id=Asia/Shanghai

## 3. 启动Azkaban并查看进程
## bin目录下是azkaban的一些启动和停止的命令
[root@node01 azkaban-solo-server]# bin/start-solo.sh
[root@node01 azkaban-solo-server]# jps
1216 Jps
1199 AzkabanSingleServer

访问Web界面

启动成功之后我们可以通过http进行Web界面访问(默认使用http协议,后续可以改为https协议)。
默认地址:http://localhost:8081
默认登录用户名/密码:azkaban/azkaban,可以在conf目录下的配置文件中修改。

1
2
3
4
5
6
7
8
[root@node01 azkaban-solo-server]# cat conf/azkaban-users.xml 
<azkaban-users>
<user groups="azkaban" password="azkaban" roles="admin" username="azkaban"/>
<user password="metrics" roles="metrics" username="metrics"/>

<role name="admin" permissions="ADMIN"/>
<role name="metrics" permissions="METRICS"/>
</azkaban-users>

简单测试

这里新建一个test.job文件,简单的写一个调度任务,本地打包成zip包之后在Azkban Web UI界面选择上传文件(需要先新建项目,在新建的项目里面进行上传)。

1
2
3
#test.job
type=command
command=touch /opt/A.txt

文件上传成功之后,我们可以在Web界面进行相关操作。这里我们在项目Flows中执行相关调度,不管是执行成功还是执行失败,我们都可以在界面中看到详细的日志信息。

1
2
3
4
5
6
7
## 这里我们发现新建了一个A.txt文本,符合预期。
[root@node01 opt]# ls
A.txt azkaban-3.88.0 azkaban-3.88.0.tar.gz azkaban-solo-server
## 停止azkaban服务
[root@node01 azkaban-solo-server]# bin/shutdown-solo.sh
Killing solo-server. [pid: 1199], attempt: 1
shutdown succeeded

Azkaban3.x Multi Executor Server模式安装部署

准备工作

从Azkaban3.x源码编译根目录路径下/azkaban-*/build/distributions获取相关tar包,从azkaban-db/build/sql/路径下获取相关SQL脚本

1
2
3
4
5
6
[root@node01 azkaban-3.88.0]# ls azkaban-web-server/build/distributions/
azkaban-web-server-0.1.0-SNAPSHOT.tar.gz azkaban-web-server-0.1.0-SNAPSHOT.zip
[root@node01 azkaban-3.88.0]# ls azkaban-exec-server/build/distributions/
azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz azkaban-exec-server-0.1.0-SNAPSHOT.zip
[root@node01 azkaban-3.88.0]# ls azkaban-db/build/sql/
create-all-sql-0.1.0-SNAPSHOT.sql

节点规划

节点 角色
node01 web-server、exec-server
node02 exec-server、MySQL

安装部署

MySQL数据库配置

Multi Executor Server模式依赖MySQL,这里我们提前在node02节点上安装好MySQL。

1
2
3
4
5
6
7
8
9
## 新建azkaban数据库
mysql> CREATE DATABASE azkaban;
## 新建azkaban用户供azkban数据库使用
mysql> CREATE USER 'azkaban'@'%' IDENTIFIED BY 'azkaban';
## 给azkaban用户赋权
mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON azkaban.* to 'azkaban'@'%' WITH GRANT OPTION;
## 导入相关sql脚本到azkaban数据库
mysql> use azkaban;
mysql> source create-all-sql-0.1.0-SNAPSHOT.sql

Azkaban Executor Server配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
## 各节点解压文件到指定路径,这里以node01为例
[root@node01 opt]# tar azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz
## 重命名
[root@node01 opt]# mv azkaban-exec-server-0.1.0-SNAPSHOT azkaban-exec-server
## 修改配置文件,主要是时区、url以及MySQL数据库连接配置
default.timezone.id=Asia/Shanghai
# Where the Azkaban web server is located
# azkaban.webserver.url=http://localhost:8081
azkaban.webserver.url=http://node01:8081
# Azkaban mysql settings by default. Users should configure their own username and password.
database.type=mysql
mysql.port=3306
mysql.host=node02
mysql.database=azkaban
mysql.user=azkaban
mysql.password=azkaban
mysql.numconnections=100
## 根据节点规划,其它Azkaban Executor Server做相同配置

注意:配置完成之后,启动Azkaban Executor Server,一定要做激活操作
不然后续调度任务无法正常执行。具体如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
## 各节点启动Azkaban Executor Server,这里以node01为例
[root@node01 azkaban-exec-server]# cd /opt/azkaban-exec-server
[root@node01 azkaban-exec-server]# ./bin/start-exec.sh
## 查看启动之后进程
[root@node01 azkaban-exec-server]# jps
1334 Jps
1323 AzkabanExecutorServer
## 激活操作
## 1.我们可以根据进程号查看端口号或者从mysql数据库的表executors中查看相关信息
mysql> select * from executors;
+----+--------+-------+--------+
| id | host | port | active |
+----+--------+-------+--------+
| 1 | node01 | 35214 | 0 |
| 2 | node02 | 38177 | 0 |
+----+--------+-------+--------+
## 或者
[root@node01 azkaban-exec-server]# netstat -ntnlp|grep 1323
tcp6 0 0 :::35214 :::* LISTEN 1323/java
## 2.查询到端口号之后进行激活操作
[root@node01 azkaban-exec-server]# curl -G "node01:35214/executor?action=activate" && echo
{"status":"success"}
## 激活成功之后各节点的active状态由0变为1

Azkaban Web Server配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
## 解压文件到指定路径
[root@node01 opt]# tar -zxvf azkaban-web-server-0.1.0-SNAPSHOT.tar.gz
## 重命名
[root@node01 opt]# mv azkaban-web-server-0.1.0-SNAPSHOT azkaban-web-server
## 修改配置文件信息。主要是时区以及MySQL数据库连接配置
default.timezone.id=Asia/Shanghai

# Azkaban mysql settings by default. Users should configure their own username and password.
database.type=mysql
mysql.port=3306
mysql.host=node02
mysql.database=azkaban
mysql.user=azkaban
mysql.password=azkaban
mysql.numconnections=100
## 启动Azkaban Web Server
[root@node01 azkaban-web-server]# ./bin/start-web.sh
## 查看相关进程
[root@node01 azkaban-web-server]# jps
1441 Jps
1427 AzkabanWebServer
1323 AzkabanExecutorServer

访问Web界面

完成上面的配置之后,我们可以通过http://node01:8081来进行Web访问。
默认用户名/密码为:azkaban/azkaban。
相关参数可以在azkaban-web-serverconf/azkaban-users.xml文件中进行配置。

简单测试

这里新建一个test.job文件,简单的写一个调度任务,本地打包成zip包之后在Azkban Web UI界面选择上传文件(需要先新建项目,在新建的项目里面进行上传)。

1
2
3
#test.job
type=command
command=touch /opt/A.txt

文件上传成功之后,我们可以在Web界面进行相关操作。这里我们在项目Flows中执行相关调度,不管是执行成功还是执行失败,我们都可以在界面中看到详细的日志信息。

1
2
3
4
5
6
7
8
## 这里我们发现新建了一个A.txt文本,符合预期。
[root@node01 opt]# ls
A.txt azkaban-web-server azkaban-exec-server
## 停止Azkaban Web Server和各节点Azkaban Executor Server
[root@node01 opt]# cd azkaban-web-server
[root@node01 azkaban-web-server]# ./bin/shutdown-web.sh
[root@node01 azkaban-web-server]# cd /opt/azkaban-exec-server
[root@node01 azkaban-exec-server]# ./bin/shutdown-exec.sh

常见问题:调度任务一直处理preparing

一般来说,考虑以下两个方面

1
2
3
4
5
6
7
8
9
10
11
12
## 1. 考虑executors是否处于激活状态
## 可以从MySQL表executors中查看相关信息,如果处于未激活状态(active为0),采用以下命令激活
curl -G "localhost:$(<./executor.port)/executor?action=activate" && echo

## 2. 考虑executors主机内存是否满足需求
## 默认情况下过滤器会检查 executor 主机空余内存是否会大于 6G,如果不足 6G,则 web-server 不会将任务交由该主机执行。
## 通过修改`conf/azkaban.properties`配置文件信息,跳过过滤。
[root@node01 azkaban-web-server]# vim conf/azkaban.properties
## 修改前
azkaban.executorselector.filters=StaticRemainingFlowSize,MinimumFreeMemory,CpuStatus
## 修改后,去掉MinimumFreeMemory
azkaban.executorselector.filters=StaticRemainingFlowSize,CpuStatus

Azkaban3.x HTTPS服务器配置

区别

在Azkaban3.x两种部署模式中,默认情况下都是采用HTTP协议。
即进行Web访问的时候默认地址为:http://localhost:8081
这里我们计划配置采用HTTPS协议。
即进行Web访问的时候默认地址为:https://localhost:8443

我们先简单了解一下两者的区别。
HTTP的全称是Hypertext Transfer Protocol Vertion (超文本传输协议)。
HTTPS的全称是Secure Hypertext Transfer Protocol(安全超文本传输协议)。
HTTPS基于HTTP开发,使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版。

HTTPS服务器配置

生成SSL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
## 指定路径生成ssl,我们这里在/opt路径下,方便下面配置
## 注意: 这里这里除了输入密钥库口令"azkaban"和密钥口令“azkaban”,其它全部配置为默认,直接回车,然后选择yes继续回车生成keystore文件。
[root@node01 opt]# keytool -keystore keystore -alias jetty -genkey -keyalg RSA
Enter keystore password:
Re-enter new password:
What is your first and last name?
[Unknown]:
What is the name of your organizational unit?
[Unknown]:
What is the name of your organization?
[Unknown]:
What is the name of your City or Locality?
[Unknown]:
What is the name of your State or Province?
[Unknown]:
What is the two-letter country code for this unit?
[Unknown]:
Is CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct?
[no]: yes

Enter key password for <jetty>
(RETURN if same as keystore password):

Warning:
The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore keystore -destkeystore keystore -deststoretype pkcs12".

修改配置文件azkaban.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
14
## Solo Server模式配置文件在azkaban-solo-server/conf下面
## Multi Executor Server模式配置文件在azkaban-web-server/conf下面
## 修改配置文件
# Azkaban Jetty server properties.
jetty.use.ssl=true ## 修改为true,默认false
jetty.maxThreads=25
jetty.port=8081
## 下面为新增文件内容
jetty.keystore=/opt/keystore
jetty.password=azkaban
jetty.keypassword=azkaban
jetty.truststore=/opt/keystore
jetty.trustpassword=azkaban
jetty.ssl.port=8443

访问Web界面

配置完成之后访问https://localhost:8443即可。

可能出现的问题

使用Google浏览器访问Web UI界面的时候,日志文件可能会报错。但是采用其它浏览器没有出现这个问题。

1
2
3
## 错误信息如下:
WARN [log] [Azkaban] EXCEPTION
javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown

这里需要我们将Google浏览器设置为兼容模式即可。

参考资料

官网文档:https://azkaban.readthedocs.io/en/latest/getStarted.html#

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2015-2023 henrrywan

请我喝杯咖啡吧~

支付宝
微信