Azkaban 安装完整教程(基于 WSL2/Ubuntu)

本教程详细指导在Windows11的WSL2(Ubuntu24.04)中安装Azkaban工作流调度系统。


关键步骤包括:

  1. 环境准备 :确保Java8、Gradle5.0和Node.js16+已安装,需通过update-alternatives切换Java版本。
  2. 编译安装:克隆Azkaban源码后,配置阿里云镜像加速依赖下载,使用Gradle编译(约3-5分钟)。
  3. 启动服务 :解压生成的安装包,修改时区为Asia/Shanghai,运行start-solo.sh启动服务。
  4. 访问验证 :通过浏览器访问http://localhost:8081,默认账号密码均为azkaban

常见问题 :Java版本冲突需切换至JDK8,端口占用可修改jetty.port,依赖下载慢需配置镜像源。


成功标志为WebUI正常登录及jps显示服务进程。


Azkaban 安装完整教程(基于 WSL2/Ubuntu)

Azkaban 是 LinkedIn 开源的批量工作流任务调度器,用于在一个工作流内以特定顺序运行一组任务。


Azkaban 简介与模式选择

Azkaban 提供三种部署模式:

模式 说明 适用场景
solo-server mode Web 和 Executor 在同一进程,使用 H2 内嵌数据库 学习和测试(推荐)
two-server mode Web 和 Executor 分离,使用 MySQL 数据库 生产环境
multiple-executor mode 多 Executor 集群,Web 和 Executor 分离部署 大规模生产环境

💡 初学者建议 :选择 solo-server mode,最简单快捷,无需配置 MySQL 和 SSL。

本教程基于你的实际安装过程整理,适用于 Windows 11 + WSL2 + Ubuntu 24.04 环境。

因为 Azkaban 不需要系统级别的权限,也不依赖特定的系统路径,安装在用户家目录下是最方便的选择。


为什么不建议装其他地方?

安装位置 优点 缺点
家目录 ~ 不需要 sudo,权限自由,方便修改配置和删除
/usr/local/ 系统级目录,看起来"正规" 需要 sudo,配置文件可能被权限问题困扰
/opt/ 第三方软件常见位置 需要 sudo,不够灵活

💡 结论 :对于学习用途,家目录是最佳选择


你的 Hadoop 和 Sqoop 装在了 /usr/local/ 下,但那是通过 sudo 安装的。


Azkaban 装在 ~/azkaban 下不会有任何冲突。
Git 克隆项目的常见结构:先建一个父目录用于归类,克隆时会自动创建与仓库同名的子目录。


不要自己改目录!!!


问题:父目录就是源码目录,不符合"父目录 → 仓库目录"的标准结构,不便于管理多个项目。


bash 复制代码
# 查看目录结构
ls -la ~/azkaban
ls -la ~/azkaban/azkaban

# 检查 gradlew 文件是否存在
ls -la ~/azkaban/azkaban/gradlew

一、环境准备

安装 Azkaban 前,请确保以下环境已就绪:

环境要求 检查命令 推荐版本
Java java -version Java 8(必须)
Gradle gradle --version 5.0
Node.js node --version 16.x 或更高
npm npm --version 对应版本

sudo: unzip: command not found :你的系统里没有安装 unzip 命令,所以无法解压下载的zip文件。


安装 unzip 工具

在终端中运行以下命令来安装 unzip

bash 复制代码
sudo apt update
sudo apt install unzip -y

⚠️ 重要 :Azkaban 编译需要 Java 8。如果系统中有多个 Java 版本,编译前必须切换到 Java 8。

bash 复制代码
mumu@MuJinqiu:~/azkaban/repo$ node --version
npm --version
v24.11.1
11.7.0
mumu@MuJinqiu:~/azkaban/repo$

很好!你的 Node.js 版本是 v24.11.1,npm 版本是 11.7.0,版本很新,完全满足要求。

现在按步骤修改配置并重新编译。

什么是 Gradle?

简单来说,Gradle 是一个自动化项目构建工具。

  • 它的作用 :它可以帮助开发者自动化地完成下载项目依赖、编译源代码、运行测试、打包应用等一系列繁琐的任务。

  • 为什么用它:像 Azkaban 这样复杂的开源项目,用它来管理构建过程,可以保证不管在谁的电脑上,都能用同样的方式、同样的步骤把它编译成功。

你刚才执行 ./gradlew 的时候,用的其实是 Azkaban 项目自带的 Gradle Wrapper。它就像一个项目专属的Gradle启动脚本,如果检测到系统里没有合适的Gradle版本,它会自动下载。但因为网络问题,它的自动下载失败了,所以我们才需要手动安装好 Gradle 来"帮"它一把。
Gradle 的默认行为------下载大文件时不显示进度条,只在下载完成后才显示一行输出。终端没反应通常是正常的,尤其是在下载 Gradle 发行版(约 100MB)时,看起来就像"卡住"了一样。


在当前终端按 Ctrl+Shift+D 或在启动 gradle 时添加参数:

bash

bash 复制代码
# 停止当前编译(Ctrl+C),然后重新执行
./gradlew build installDist -x test --info

--info 会显示详细日志,可以看到下载的具体进度。


最常见的"卡住"原因分析

现象 可能原因 解决方法
完全无输出 Gradle 正在下载 gradle-5.0-all.zip(约 100MB) 等待 5-10 分钟
最后一行是 Downloading... 同上,网络慢 耐心等待或换镜像
ExceptionCould not resolve 网络超时或依赖下载失败 按 Ctrl+C 重试,或换镜像
长时间(>15分钟)无变化 可能真的卡住了 按 Ctrl+C,手动配置 Gradle
bash 复制代码
mumu@MuJinqiu:~$ # 使用华为云镜像下载 Gradle 5.0
wget https://repo.huaweicloud.com/gradle/gradle-5.0-all.zip
--2026-05-26 12:57:29--  https://repo.huaweicloud.com/gradle/gradle-5.0-all.zip
Resolving repo.huaweicloud.com (repo.huaweicloud.com)... 115.223.9.102, 115.223.9.100, 115.223.9.101
Connecting to repo.huaweicloud.com (repo.huaweicloud.com)|115.223.9.102|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 129875268 (124M) [application/octet-stream]
Saving to: 'gradle-5.0-all.zip'

gradle-5.0-all.zip                          100%[===========================================================================================>] 123.86M  6.29MB/s    in 23s

2026-05-26 12:57:50 (5.31 MB/s) - 'gradle-5.0-all.zip' saved [129875268/129875268]

mumu@MuJinqiu:~$

华为云镜像下载成功了!Gradle 5.0 已经下载完毕(124MB,用了 23 秒,速度很快)。


现在继续执行后续步骤

bash 复制代码
# 1. 解压到 /opt 目录
sudo unzip -d /opt gradle-5.0-all.zip

# 2. 配置环境变量
echo 'export PATH=/opt/gradle-5.0/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

# 3. 验证安装
gradle --version
bash 复制代码
Welcome to Gradle 5.0!

Here are the highlights of this release:
 - Kotlin DSL 1.0
 - Task timeouts
 - Dependency alignment aka BOM support
 - Interactive `gradle init`

For more details see https://docs.gradle.org/5.0/release-notes.html


------------------------------------------------------------
Gradle 5.0
------------------------------------------------------------

Build time:   2018-11-26 11:48:43 UTC
Revision:     7fc6e5abf2fc5fe0824aec8a0f5462664dbcd987

Kotlin DSL:   1.0.4
Kotlin:       1.3.10
Groovy:       2.5.4
Ant:          Apache Ant(TM) version 1.9.13 compiled on July 10 2018
JVM:          11.0.30 (Ubuntu 11.0.30+7-post-Ubuntu-1ubuntu124.04)
OS:           Linux 6.6.87.2-microsoft-standard-WSL2 amd64

mumu@MuJinqiu:~$

🎉 Gradle 5.0 安装成功!

从输出可以看到,Gradle 已经正确安装并运行。现在可以开始编译 Azkaban 了。


现在执行编译

bash 复制代码
# 进入 Azkaban 源码目录
cd ~/azkaban/azkaban

# 编译(跳过测试)
./gradlew build installDist -x test

编译过程中需要注意的

阶段 预计时间 说明
初始化 10-30秒 Gradle 启动,读取配置
下载依赖 3-10分钟 下载项目所需的 jar 包(使用阿里云镜像会快一些)
编译代码 1-2分钟 编译 Java/Scala 源码
打包 30秒 生成安装包

如果 gradle 命令找不到


确认一下环境变量:

bash 复制代码
# 查看 gradle 是否在 PATH 中
which gradle

# 如果没有,重新加载配置
source ~/.bashrc

# 或者手动添加
export PATH=/opt/gradle-5.0/bin:$PATH

which gradle 命令没有输出,说明 Gradle 还没有添加到 PATH 环境变量中。后面手动添加了 export PATH=/opt/gradle-5.0/bin:$PATH,这个命令只在当前窗口生效


为了让系统在任何位置都能识别 gradle 命令,需要配置环境变量。


永久配置环境变量(让所有新窗口都生效)

bash

bash 复制代码
# 将 Gradle 路径永久添加到 .bashrc
echo 'export PATH=/opt/gradle-5.0/bin:$PATH' >> ~/.bashrc

# 重新加载
source ~/.bashrc

# 验证
which gradle
gradle --version

重新执行

bash 复制代码
cd ~/azkaban/repo
gradle build installDist -x test
bash 复制代码
mumu@MuJinqiu:~$ # 将 Gradle 路径永久添加到 .bashrc
echo 'export PATH=/opt/gradle-5.0/bin:$PATH' >> ~/.bashrc

# 重新加载
source ~/.bashrc

# 验证
which gradle
gradle --version
/opt/gradle-5.0/bin/gradle

------------------------------------------------------------
Gradle 5.0
------------------------------------------------------------

Build time:   2018-11-26 11:48:43 UTC
Revision:     7fc6e5abf2fc5fe0824aec8a0f5462664dbcd987

Kotlin DSL:   1.0.4
Kotlin:       1.3.10
Groovy:       2.5.4
Ant:          Apache Ant(TM) version 1.9.13 compiled on July 10 2018
JVM:          11.0.30 (Ubuntu 11.0.30+7-post-Ubuntu-1ubuntu124.04)
OS:           Linux 6.6.87.2-microsoft-standard-WSL2 amd64

很好!Gradle 已经配置好了。


现在需要切换 Java 版本来解决编译错误。
编译失败了,原因是 Java 版本不兼容


错误信息 class file has wrong version 55.0, should be 53.0 表明:

  • 55.0 = Java 11(你当前使用的版本)

  • 53.0 = Java 9(Azkaban 需要的版本)

Azkaban 的某些模块要求使用 Java 8 或 Java 9 ,而你的系统使用的是 Java 11

二、安装 Java 8 并切换版本

bash

复制代码
# 1. 安装 Java 8
sudo apt update
sudo apt install openjdk-8-jdk -y

# 2. 查看已安装的 Java 版本
sudo update-java-alternatives --list

# 3. 切换到 Java 8
sudo update-alternatives --config java
# 选择 Java 8 对应的编号

# 4. 验证
java -version   # 应显示 openjdk version "1.8.0_xxx"
bash 复制代码
mumu@MuJinqiu:~$ sudo update-java-alternatives --list
[sudo] password for mumu:
java-1.11.0-openjdk-amd64      1111       /usr/lib/jvm/java-1.11.0-openjdk-amd64
java-1.17.0-openjdk-amd64      1711       /usr/lib/jvm/java-1.17.0-openjdk-amd64
java-1.8.0-openjdk-amd64       1081       /usr/lib/jvm/java-1.8.0-openjdk-amd64
mumu@MuJinqiu:~$

你已经安装了 Java 8、11、17 三个版本。现在切换到 Java 8:


切换到 Java 8

bash

复制代码
sudo update-alternatives --config java

输入数字选择 Java 8(对应的编号通常是 23,看你终端显示的具体数字),然后回车。


验证切换结果

bash

复制代码
java -version

应该显示:

text

复制代码
openjdk version "1.8.0_xxx"

确认 Gradle 使用的 Java 版本

bash

复制代码
gradle --version

确保 JVM: 一行显示的是 1.8.0_xxx,而不是 11.0.30。

然后编译 Azkaban

bash

复制代码
cd ~/azkaban/repo
gradle clean
gradle build installDist -x test

问题还在!


虽然你切换了系统的 Java 版本,但 Gradle 仍然在使用 Java 11 进行编译。


从错误信息 class file has wrong version 55.0, should be 53.0 可以看出:

  • 55.0 = Java 11(Gradle 实际使用的)

  • 53.0 = Java 9(Azkaban 需要的)

解决方案:让 Gradle 使用 Java 8:设置 Gradle 的 JAVA_HOME

bash

bash 复制代码
# 找到 Java 8 的安装路径
dirname $(dirname $(readlink -f $(which java)))

输出应该是 /usr/lib/jvm/java-8-openjdk-amd64

然后设置环境变量并编译:

bash

bash 复制代码
cd ~/azkaban/repo
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH

# 验证
java -version
gradle --version

# 编译
gradle clean
gradle build installDist -x test

三、安装 Gradle 5.0

bash

复制代码
# 1. 下载 Gradle 5.0(使用华为云镜像加速)
cd ~
wget https://repo.huaweicloud.com/gradle/gradle-5.0-all.zip

# 2. 解压到 /opt
sudo unzip -d /opt gradle-5.0-all.zip

# 3. 配置环境变量
echo 'export PATH=/opt/gradle-5.0/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

# 4. 验证
gradle --version   # 应显示 Gradle 5.0,JVM 为 1.8.0_xxx

四、下载并编译 Azkaban

⚠️ 注意:编译过程需要下载大量依赖包,网络不稳定时可能会失败。如果失败,多执行几次命令即可。

bash

复制代码
# 1. 创建并进入项目目录
mkdir -p ~/azkaban
cd ~/azkaban

# 2. 克隆源码
git clone https://github.com/azkaban/azkaban.git

# 3. 进入源码目录
cd azkaban

# 4. 配置阿里云镜像加速(可选,推荐)
echo 'repositories.grails.default = https://maven.aliyun.com/repository/public' >> gradle.properties

# 5. 修改 Node.js 配置(避免下载失败)
cd azkaban-web-server
nano build.gradle

找到 node { ... } 配置块,修改为:

groovy

复制代码
node {
    version = '24.11.1'        // 改成你安装的 Node.js 版本
    npmVersion = '11.7.0'      // 改成你安装的 npm 版本
    download = false            // 禁止自动下载
    workDir = file("${project.buildDir}/nodejs")
    nodeModulesDir = file("${project.projectDir}")
}

bash

复制代码
# 6. 返回根目录并编译
cd ~/azkaban/azkaban
gradle build installDist -x test

错误 :azkaban-web-server:nodeSetup 失败,是因为构建脚本试图从 https://nodejs.org/dist/v8.10.0/ivy.xml 下载 Node.js 8.10.0,但返回了 403 Forbidden 错误。这通常意味着官方不再直接支持通过这个旧方式自动下载了。


解决方案:让Azkaban使用你系统里已有的Node.js

核心思路是禁止它自动下载,强制它使用你电脑上全局安装的Node.js。


这是最关键的一步。我们需要找到并修改 azkaban-web-server 模块下的 build.gradle 文件,告诉它不要再尝试下载Node.js。


在文件中找到 node { ... } 这个配置块,它看起来应该和下面的内容类似。你需要做两处修改:

  1. download = true 改为 download = false

  2. 可以选择更新 version 为你刚才安装的版本。

  3. 修改完成后,按 Ctrl + X,然后按 Y,最后按 Enter 保存并退出。

  4. 清理并重新编译

第一步:修改 azkaban-web-server/build.gradle

bash

bash 复制代码
cd ~/azkaban/repo/azkaban-web-server
nano build.gradle

在文件中找到 node { ... } 这个配置块(大约在第 40-50 行左右),把它修改成下面这样:

groovy

复制代码
node {
    version = '24.11.1'        // 改成你安装的版本
    npmVersion = '11.7.0'      // 改成你安装的 npm 版本
    download = false            // 关键:禁止自动下载
    workDir = file("${project.buildDir}/nodejs")
    nodeModulesDir = file("${project.projectDir}")
}

保存退出Ctrl+XY回车


第二步:清理并重新编译

bash

bash 复制代码
cd ~/azkaban/repo
gradle clean
gradle build installDist -x test

编译时间约 3-5 分钟,取决于网络速度。


bash 复制代码
BUILD SUCCESSFUL in 2m 59s
84 actionable tasks: 76 executed, 8 from cache
mumu@MuJinqiu:~/azkaban/repo$

🎉 编译成功!

恭喜你,Azkaban 已经成功编译完成!


五、启动 Azkaban

bash

复制代码
# 1. 进入 distributions 目录
cd ~/azkaban/azkaban/azkaban-solo-server/build/distributions

# 2. 查看实际生成的安装包名称
ls -la

# 3. 解压(使用实际文件名)
tar -zxvf azkaban-solo-server-*.tar.gz

# 4. 进入解压后的目录
cd azkaban-solo-server-*

# 5. 修改时区配置
sed -i 's/default.timezone.id=America\/Los_Angeles/default.timezone.id=Asia\/Shanghai/' conf/azkaban.properties

# 6. 启动
./bin/start-solo.sh

# 7. 查看进程
jps | grep -i azkaban
bash 复制代码
2210902 AzkabanSingleServer

🎉 Azkaban 启动成功!


你已经启动了 Azkaban 服务,它会作为一个后台守护进程持续运行,不依赖于你当前打开的终端窗口。


从输出中看到的 2210902 AzkabanSingleServer 就是它在后台运行的进程 ID。


如何验证

关闭终端窗口后,重新打开一个新的终端,执行:

bash

bash 复制代码
jps | grep -i azkaban

如果还能看到 AzkabanSingleServer 进程,说明服务仍在运行。


下次如何使用

方式一:查看运行状态

bash

bash 复制代码
jps | grep -i azkaban
方式二:停止服务

bash

bash 复制代码
cd ~/azkaban/repo/azkaban-solo-server/build/distributions/azkaban-solo-server-3.91.0-511-g6db75004
./bin/shutdown-solo.sh
方式三:重新启动

如果停止后想再次启动:

bash

bash 复制代码
cd ~/azkaban/repo/azkaban-solo-server/build/distributions/azkaban-solo-server-3.91.0-511-g6db75004
./bin/start-solo.sh

电脑重启后

Azkaban 不会开机自启。


重启电脑后需要手动启动:

  1. 打开 MobaXterm,连接到 WSL

  2. 执行启动命令:

bash

bash 复制代码
cd ~/azkaban/repo/azkaban-solo-server/build/distributions/azkaban-solo-server-3.91.0-511-g6db75004
./bin/start-solo.sh

总结

场景 操作
当前窗口 ✅ 可以关闭
访问 Web UI 浏览器打开 http://localhost:8081
查看是否运行 `jps
重启电脑后 手动执行启动命令
停止服务 ./bin/shutdown-solo.sh

六、访问 Web UI

⚠️ 注意:使用 https 而不是 http。浏览器会提示证书风险,点击"高级" → "继续访问"即可。

打开浏览器,访问:http://localhost:8081

字段
用户名 azkaban
密码 azkaban

七、常用命令

操作 命令
启动 Azkaban cd ~/azkaban/azkaban/azkaban-solo-server/build/distributions/azkaban-solo-server-* && ./bin/start-solo.sh
停止 Azkaban cd 同上目录 && ./bin/shutdown-solo.sh
查看进程 `jps
查看日志 cat logs/azkaban-solo-server.log

服务管理命令

操作 solo-server two-server
启动 ./bin/start-solo.sh Web: ./bin/start-web.sh Exec: ./bin/start-exec.sh
停止 ./bin/shutdown-solo.sh Web: ./bin/shutdown-web.sh Exec: ./bin/shutdown-exec.sh
查看状态 `jps grep Azkaban`

八、常见问题及解决

问题 解决方法
class file has wrong version 55.0, should be 53.0 切换到 Java 8:sudo update-alternatives --config java
nodeSetup 下载失败 (403 Forbidden) 修改 azkaban-web-server/build.gradle,设置 download = false
端口 8081 被占用 修改 conf/azkaban.properties 中的 jetty.port=8081 为其他端口
gradle: command not found 检查环境变量:source ~/.bashrc 或重新配置 Gradle 路径
编译时依赖下载慢 gradle.properties 中添加阿里云镜像源

九、安装完成标志

当你能成功:

  1. 执行 jps 看到 AzkabanSingleServer 进程

  2. 浏览器访问 http://localhost:8081

  3. 使用 azkaban/azkaban 成功登录

看到 "No Viewable Projects" 和 "Create Project" 按钮时,说明 Azkaban 已完全安装成功,可以开始创建工作流项目了。


快速测试

1. 创建 Job 文件

bash

bash 复制代码
# 创建第一个 job
cat > one.job << EOF
type=command
command=echo "this is job one"
EOF

# 创建第二个 job(依赖第一个)
cat > two.job << EOF
type=command
dependencies=one
command=echo "this is job two"
EOF
2. 打包并上传

one.jobtwo.job 打包成 zip 文件,然后:

  1. 登录 Azkaban Web UI

  2. 点击 Create Project

  3. 输入项目名和描述

  4. 上传 zip 包

  5. 点击 Execute 执行

  6. 查看执行结果

打包成 zip 文件

方法一:只打包指定的两个文件

bash

复制代码
zip myflow.zip one.job two.job
方法二:打包当前目录下所有 .job 文件

bash

复制代码
zip myflow.zip *.job
方法三:打包并包含子目录(如果需要)

bash

复制代码
zip -r myflow.zip . -i "*.job"

验证打包结果

bash

复制代码
# 查看 zip 文件内容
unzip -l myflow.zip

输出示例:

text

复制代码
Archive:  myflow.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       36  2026-05-26 15:00   one.job
       40  2026-05-26 15:00   two.job
---------                     -------
       76                     2 files

在 Azkaban 中使用

  1. 将生成的 myflow.zip 上传到 Azkaban:

    • 登录 Azkaban Web UI(http://localhost:8081

    • 点击 Create Project

    • 输入项目名称和描述

    • 上传 myflow.zip 文件

  2. 点击 Execute 执行工作流


其他常用 zip 命令

操作 命令
打包多个指定文件 zip archive.zip file1 file2 file3
打包整个目录 zip -r archive.zip directory/
打包时排除某些文件 zip archive.zip *.job -x temp.job
添加密码保护 zip -P 密码 archive.zip *.job
解压 zip 文件 unzip archive.zip
查看 zip 内容(不解压) unzip -l archive.zip

十、目录结构总结

text

bash 复制代码
/home/mumu/
├── azkaban/                          # 项目父目录
│   └── azkaban/                      # Git 源码仓库
│       ├── gradlew                   # Gradle 包装器
│       ├── azkaban-solo-server/      # Solo Server 模块
│       │   └── build/distributions/  # 编译后的安装包
│       │       └── azkaban-solo-server-*/ # 可运行的服务目录
│       ├── azkaban-web-server/       # Web Server 模块
│       └── ...
└── gradle-5.0-all.zip                # Gradle 安装包

现在你的 Azkaban 已经完全安装好了,可以开始创建工作流项目。如果需要创建第一个工作流(Job)的教程,随时告诉我。

相关推荐
蓝眸少年CY1 个月前
Azkaban - 入门教程
大数据·azkaban
走遍西兰花.jpg5 个月前
如何启动azkaban
hadoop·azkaban
DolphinScheduler社区7 个月前
真实迁移案例:从 Azkaban 到 DolphinScheduler 的选型与实践
java·大数据·开源·任务调度·azkaban·海豚调度·迁移案例
出发行进1 年前
Azkaban其一,介绍、体系架构和安装
linux·azkaban
开着拖拉机回家2 年前
【调度工具】Azkaban用户手册
executor·任务调度·azkaban·调度工具·web server·job依赖配置·flow任务
シ風箏2 年前
Azkaban【部署 02】CentOS release 7.5安装配置azkaban-3.70.0安装阶段(含已编译的10个安装文件:可直接进行安装)
大数据·linux·azkaban·调度工具
都教授20003 年前
任务流之间的调度依赖
java·spark·azkaban
沙糖桔453 年前
Hadoop----Azkaban的使用与一些报错问题的解决
大数据·hadoop·分布式·azkaban