news 2026/5/26 22:26:33

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 modeWeb 和 Executor 在同一进程,使用 H2 内嵌数据库学习和测试(推荐)
two-server modeWeb 和 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 克隆项目的常见结构:先建一个父目录用于归类,克隆时会自动创建与仓库同名的子目录。


不要自己改目录!!!


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


# 查看目录结构 ls -la ~/azkaban ls -la ~/azkaban/azkaban # 检查 gradlew 文件是否存在 ls -la ~/azkaban/azkaban/gradlew

一、环境准备

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

环境要求检查命令推荐版本
Javajava -versionJava 8(必须)
Gradlegradle --version5.0
Node.jsnode --version16.x 或更高
npmnpm --version对应版本

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


安装unzip工具

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

sudo apt update sudo apt install unzip -y

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

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

# 停止当前编译(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
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 秒,速度很快)。


现在继续执行后续步骤

# 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
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 了。


现在执行编译

# 进入 Azkaban 源码目录 cd ~/azkaban/azkaban # 编译(跳过测试) ./gradlew build installDist -x test

编译过程中需要注意的

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

如果gradle命令找不到


确认一下环境变量:

# 查看 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

# 将 Gradle 路径永久添加到 .bashrc echo 'export PATH=/opt/gradle-5.0/bin:$PATH' >> ~/.bashrc # 重新加载 source ~/.bashrc # 验证 which gradle gradle --version

重新执行

cd ~/azkaban/repo gradle build installDist -x test
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"
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

# 找到 Java 8 的安装路径 dirname $(dirname $(readlink -f $(which java)))

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

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

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

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

cd ~/azkaban/repo gradle clean gradle build installDist -x test

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


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
2210902 AzkabanSingleServer

🎉Azkaban 启动成功!


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


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


如何验证

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

bash

jps | grep -i azkaban

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


下次如何使用

方式一:查看运行状态

bash

jps | grep -i azkaban
方式二:停止服务

bash

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

如果停止后想再次启动:

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

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 | grep -i azkaban
重启电脑后手动执行启动命令
停止服务./bin/shutdown-solo.sh

六、访问 Web UI

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

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

字段
用户名azkaban
密码azkaban


七、常用命令

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

服务管理命令

操作solo-servertwo-server
启动./bin/start-solo.shWeb:./bin/start-web.sh
Exec:./bin/start-exec.sh
停止./bin/shutdown-solo.shWeb:./bin/shutdown-web.sh
Exec:./bin/shutdown-exec.sh
查看状态jps | grep Azkabanjps | 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

# 创建第一个 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

/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)的教程,随时告诉我。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 22:23:06

Linux命令:pidstat

pidstat 命令 基本介绍 pidstat&#xff08;Process ID Statistics&#xff09;是 Linux 系统中用于报告进程级统计信息的工具&#xff0c;属于 sysstat 工具包的一部分。它可以显示指定进程或所有进程的 CPU、内存、I/O 等资源使用情况&#xff0c;是系统管理员进行进程性能分…

作者头像 李华
网站建设 2026/5/26 22:16:46

YOLOv5魔改实战:加入SE注意力机制,在自建绝缘子数据集上F1冲到96.2%

YOLOv5模型优化实战&#xff1a;融合SE注意力机制实现绝缘子检测性能突破在目标检测领域&#xff0c;YOLOv5以其出色的速度和精度平衡成为工业界宠儿。但当面对特定场景如电力巡检中的绝缘子检测时&#xff0c;原始模型往往难以满足专业场景的严苛要求。本文将带您深入探索如何…

作者头像 李华
网站建设 2026/5/26 22:15:54

从零搭建VMware Windows内核调试环境:WinDbg与WinDbg Preview实战指南

1. 为什么需要Windows内核调试环境&#xff1f;搞Windows内核开发或者驱动开发的朋友都知道&#xff0c;调试是个大问题。普通调试器根本看不到内核层面的东西&#xff0c;这就好比你想修车却只能看到车漆表面一样无力。我在刚开始接触内核调试时也踩了不少坑&#xff0c;最痛苦…

作者头像 李华