Azkaban Solo Server 部署实战:从环境校验到定时任务调度

📅 发布时间:2026/10/14 13:11:49
Azkaban Solo Server 部署实战:从环境校验到定时任务调度
简介这是一份已编译完成的 Azkaban 单机版部署包面向大数据开发者、初学者及小规模团队解决快速搭建工作流调度环境的问题。压缩包采用 tar.gz 格式大小约 42.28MB无需额外编译解压后即可进行配置与运行适合在本地环境中验证项目创建、作业依赖编排、定时调度与日志监控等核心操作。目前已有 256 人浏览学习是入门 Hadoop 生态调度工具的轻量级选择。资源内含可直接启动的 Web 服务、执行器与内嵌 H2 数据库通过修改 conf/azkaban.properties 即可调整服务器端口、日志路径等参数配合 bin 目录脚本可完成数据库初始化与启停管理。借助 Web 界面使用者能直观体验多项目任务管理、DAG 依赖执行流程并观察执行日志与错误信息有助于快速理解 Azkaban 工作流引擎的工作机制需要注意该版本为 SNAPSHOT 构建更适用于实验验证而非生产环境。1. 拿到 azkaban 任务调度这套 solo server 包先别急着解压在 azkaban 任务调度的场景里azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz这种构建产物第一眼看上去像是一个开箱即用的安装包但它比想象中“挑环境”。这个包是 Azkaban 单机模式solo server的部署产物把 Web 服务、任务执行器、调度存储全部压进一个进程内置 H2 数据库不需要额外装 MySQL适合刚接触工作流调度的人在小团队或测试环境里快速跑通定时任务。但正因为“内置”了很多东西启动失败时排查链路也长。我习惯先把它当成一个黑匣子来验解压、看目录、确认依赖再谈配置和启动。2. solo server 的组成与选型一个进程里到底塞了什么2.1 三种部署模式打在同一个项目里solo 省掉的复杂度具体在哪Azkaban 官方提供三种部署形态solo server、双机模式two-server mode、多执行器模式multi-executor mode。不少第一次接触的人以为 solo 只是“少两台机器”实际上差异不止是机器数量而是组件拆分方式。部署模式进程数量数据库适用规模主要代价solo server1 个 Java 进程内嵌 H2学习、测试、单机触发无高可用状态存本地two-server modeWeb Server Executor ServerMySQL小团队生产要单独维护 MySQLmulti-executor mode1 个 Web N 个 ExecutorMySQL中大型集群要处理 executor 分组与负载solo server 把 Web Server 和 Executor Server 合并成一个 JVM 进程数据库用 H2 的文件模式整个应用的边界就是bin、conf、lib几个目录。它的价值不是处理高并发调度而是把“部署一套调度系统”这件事的复杂度降到最低。常见做法是拿它当开发环境或临时复现工具生产环境不建议直接沿用。2.2 一个调度请求在 solo 里的完整路径理解 solo server 的运行方式关键是记住一条流转链用户通过 Web UI 上传项目包zip 格式内含 .job 文件→ 项目被存进 H2 数据库 → 调度线程按 cron 表达式触发 → 内嵌的 Executor 读取 DAG 依赖关系并逐个执行 job → 执行日志回写到 UI。这个路径决定了你在排错时该看哪里项目传不上去查 Web 端口和数据库任务触发了但没跑查 executor 状态任务跑了但结果不对查.job文件本身。我在实际使用中见过有人反复重启服务去“试”问题其实只要打开logs/solo-server.log按时间戳对一遍就能定位到具体环节。2.3 边界什么场景不该用它solo 模式的短板不是 bug是设计边界。第一H2 文件数据库不适合多客户端并发写如果多个开发人员同时传项目、改调度可能出现数据库锁等待。第二重启会中断正在执行的任务流没有故障转移。第三所有数据都在本地磁盘如果服务器磁盘损坏历史调度记录和项目包会全部丢失。所以我的选型建议是单机验证、课程实验、自动化测试环境用 solo一旦涉及多团队协作、需要稳定 SLA 的批量任务尽早迁移到 two-server 模式或 multi-executor 模式。3. 部署实战解压、配置、启动三步把调度器拉起来3.1 环境准备先照清单核四件事拿到azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz之后第一件事不是解压是确认环境。重点看四样JDK 版本、JAVA_HOME环境变量、端口占用、解压目录的写权限。这个步骤最容易被跳过但大部分“起不来”都出在这里。# 1. 确认 JDK 版本Azkaban 要求 8 或 11推荐 8 java -version # 2. 确认 JAVA_HOME 已设置solo 启动脚本依赖它 echo ${JAVA_HOME} # 3. 检查 8081 和 8082 端口是否被占用 netstat -tlnp | grep -E 8081|8082 # 4. 解压到固定目录避免放在 /tmp 下被自动清理 mkdir -p /opt/azkaban tar -zxvf azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz -C /opt/azkaban逻辑说明java -version和echo ${JAVA_HOME}是连锁的只有JAVA_HOME指向有效的 JDK 8 安装路径bin/start-solo.sh才能找到 Java 进程检查端口是因为 solo 模式默认会占用 8081Web UI和 8082Executor 通信任何一个被别的服务占了启动就会报Address already in use。参数说明-C指定解压目标目录/opt/azkaban是常见部署位置。如果你想换目录后续所有azkaban.properties里的相对路径都要重新确认。解压后建议看一眼目录结构确认bin、conf、lib、plugins四个目录都完整。3.2 两处必须改的配置端口、时区、数据库路径进入conf/azkaban.properties这是 solo server 的唯一核心配置文件。绝大多数启动异常和调度时间错乱都源于这个文件里的三个配置项没改对。# Web UI 端口默认 8081 jetty.port8081 # Executor 通信端口默认 8082 executor.port8082 # 时区务必写全否则定时任务会差 8 小时 azkaban.server.timezoneAsia/Shanghai user.timezoneAsia/Shanghai # H2 数据库文件路径默认在内存或临时目录必须改成固定路径 database.typeh2 h2.path/opt/azkaban/azkaban-solo-server-0.1.0-SNAPSHOT/data/h2逻辑说明jetty.port控制的是浏览器访问的 Web UI 端口executor.port是内嵌执行器监听调度请求的端口两个端口值不能相等否则会冲突。azkaban.server.timezone和user.timezone两个都改只改其中一个会出现 UI 上显示的时间正常、实际触发时间不对的怪现象。参数说明h2.path的值会自动创建目录如果填的是相对路径会相对于启动脚本的工作目录解析一旦你换了启动方式就可能找不到数据库文件所以这里一律写绝对路径。3.3 启动与验证从日志确认服务健康配置完成后启动、验证、看日志要按顺序来。solo server 的启动脚本对执行目录敏感建议先cd到解压目录再执行。cd /opt/azkaban/azkaban-solo-server-0.1.0-SNAPSHOT # 前台启动观察启动日志输出 bin/start-solo.sh # 另开一个终端等待 30 秒后确认进程存在 ps -ef | grep azkaban # 用 curl 验证 Web UI 是否返回正常状态码 curl -I http://localhost:8081逻辑说明bin/start-solo.sh默认以后台方式启动日志写入logs/solo-server.log。如果进程存在但curl没有返回200或302说明 Web 容器还没完全初始化等几秒再试。我一般会用tail -f logs/solo-server.log同时盯着日志看有没有Starting Azkaban Server和Server started两行关键记录。参数说明curl -I只发 HEAD 请求适合快速探测服务存活不会触发实际任务。solo 模式的默认登录账号是azkaban / azkaban第一次登录后建议立即在用户管理里改密这个默认口令在任何公网可达的服务器上都是风险点。4. 避坑与常见问题排查五条真实踩坑记录4.1 现象服务进程活着但浏览器一直连不上原因azkaban.properties里改了jetty.port但防火墙规则只放行了安装前的初始端口或者是 H2 数据库初始化失败导致 Web 容器启动到一半就卡住。解决先看logs/solo-server.log如果最后几行有Database connection failed优先检查h2.path的目录权限是否允许当前用户写文件如果日志显示端口绑定异常用netstat -tlnp确认端口实际监听情况然后同步修改防火墙白名单。4.2 现象上传项目 zip 包时一直卡在 Preparing 状态原因zip 包里的 job 文件名包含中文字符或特殊符号Azkaban 在解析项目包时对文件名编码敏感另外 zip 包根目录下混入了.DS_Store之类的隐藏文件也会导致解析流程卡住。解决把所有 job 文件名改成小写英文字母和下划线重新打包上传在压缩时排除隐藏文件。我在本地打包时加过一层检查确认 zip 内没有以.开头的条目。4.3 现象定时任务每次触发都比预期晚 8 小时原因只改了azkaban.server.timezone没有改 JVM 级别的user.timezoneAzkaban 的调度线程读取的是 JVM 默认时区UI 显示的是配置时区两边不一致就会出现这种“时间显示正常、触发不对”的错位。解决在bin/start-solo.sh的 JVM 参数里加一行-Duser.timezoneAsia/Shanghai同时保留 properties 里的两个时区配置重启验证。4.4 现象重启一次项目、调度全部消失原因database.typeh2但h2.path没有配置H2 默认跑在内存模式或者h2.path配置的是相对路径启动脚本工作目录换了数据库文件实际散落在不同位置。解决把h2.path改成固定绝对路径例如/opt/azkaban/azkaban-solo-server-0.1.0-SNAPSHOT/data/h2重启后再查看该目录下是否生成.mv.db文件。这个文件就是你的全部调度数据备份它就是备份整个 solo 服务状态。4.5 现象SNAPSHOT 包启动时报 UnsupportedClassVersionError原因这个包编译时用的 JDK 版本和本机JAVA_HOME指向的版本不一致最常见的是包基于 JDK 8 编译而本机默认 JDK 是 11 或更高。解决安装对应版本的 OpenJDK然后显式导出JAVA_HOME再启动。export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 export PATH${JAVA_HOME}/bin:${PATH} bin/start-solo.sh这条命令的本质是强制启动脚本使用指定的 JDK不依赖系统默认版本。5. 进阶用法用 solo server 跑通第一个带依赖的工作流5.1 写一个最小可跑的 job 文件Azkaban 的调度单位是 jobjob 之间可以用dependencies字段组织成 DAG。在 solo 里验证功能时最常见的做法是写几个 command 类型的 job从最简单的一个节点开始。# hello.job typecommand commandecho hello azkaban# world.job typecommand commandecho world dependencieshello逻辑说明hello.job不依赖任何节点启动后立即执行world.job声明依赖hello只有hello执行成功world才会进入调度队列。两个文件打包成 zip 后在 Web UI 上创建项目、上传、执行流就能看到两个节点的执行顺序是先后而非并行。5.2 用 Web UI 验证执行与日志上传 zip 包后项目里会自动生成一个 flowflow 名默认是hello以第一个 job 文件名为准。点击 execute 按钮在 Execution 页面能看到每个 job 的状态流转READY → RUNNING → SUCCEEDED。如果某个节点失败点进 job 详情就能看到完整的标准输出和错误流。这一步是验证整个 solo 服务是否健康最直观的方式。5.3 把手动执行改成定时调度在 flow 页面点击 schedule 按钮填 cron 表达式。Azkaban 的 cron 是标准 7 段格式和 Linux crontab 相比多了秒位。# 每天早上 8 点触发一次秒位固定为 0 0 0 8 * * * ?参数说明第一位是秒第二位是分第三位是小时?表示不指定具体值。配置完成后调度列表里能看到这条 cron 记录。从那以后我每次部署 solo server都强制走一遍固定流程先改时区、再固定数据库路径、再启动、再看日志顺序不乱问题自然少一半。希望这套流程也能帮你在 azkaban 任务调度上少走弯路。本文还有配套的精品资源点击获取