文章

Azkaban 全方位技术指南:从编译部署到工作流实践

本文是一篇全面的 Azkaban 技术文档,整合了 Azkaban 的介绍、与 Oozie 的对比、3.x 版本的源码编译与部署、以及 Flow 1.0 和 Flow 2.0 的详细使用教程。无论您是初学者还是有经验的用户,都能从中获得有价值的指导。

Azkaban 全方位技术指南:从编译部署到工作流实践

一个完整的大数据分析系统,通常由多个任务单元(如数据收集、清洗、存储、分析等)组成,这些任务单元及其依赖关系构成了复杂的工作流。为了有效管理这些工作流,工作流调度系统应运而生,Azkaban 便是其中的佼佼者。

本文将全面介绍 Azkaban,从基本概念、编译部署到两种工作流(Flow 1.0 和 Flow 2.0)的实践,为您提供一份详尽的技术指南。

一、Azkaban 简介

1.1 功能特性

Azkaban 产生于 LinkedIn,并经过多年生产环境的检验,它具备以下功能:

  • 兼容任何版本的 Hadoop
  • 易于使用的 Web UI
  • 可以使用简单的 Web 页面进行工作流上传
  • 支持按项目进行独立管理
  • 定时任务调度
  • 模块化和可插入的插件机制
  • 完善的身份验证和授权
  • 跟踪用户操作
  • 支持失败和成功的电子邮件提醒
  • SLA 警报和自动查杀失败任务
  • 支持重试失败的任务

Azkaban 的设计理念是在保证功能实现的基础上兼顾易用性,其页面风格清晰明朗,下图是其 Web UI 界面:

Azkaban Web UI

1.2 Azkaban vs. Oozie

Azkaban 和 Oozie 都是目前使用最为广泛的工作流调度程序,其主要区别如下:

特性AzkabanOozie
工作流定义使用 Properties 文件 (Flow 1.0) 或更简洁的 YAML 文件 (Flow 2.0)。使用基于 XML 的 Hadoop 流程定义语言 (HPDL),定义较为繁琐。
资源管理有较严格的权限控制,如用户对工作流的读/写/执行等操作。权限控制相对较弱。
部署与运行部署简单,3.0后需自行编译。提供单服务模式和分布式多服务模式。部署相对复杂,依赖于 Web 容器(如 Tomcat),元数据需配置外部数据库(如 MySQL)。
易用性Web UI 直观易用,依赖关系、执行日志清晰可见。UI 功能相对基础,配置和监控不如 Azkaban 直观。

总结:如果您的工作流不是特别复杂,且追求易用性和快速上手,轻量级的 Azkaban 是一个更好的选择。

二、Azkaban 3.x 编译及部署

Azkaban 在 3.0 版本之后不再提供预编译的安装包,需要用户自行下载源码进行编译。

2.1 源码编译

1. 准备环境

编译前,请确保您的环境中已安装以下软件:

  • JDK 1.8+
  • Git: yum install git
  • Gradle: Azkaban 3.70.0 依赖 gradle-4.6-all.zip。您可以在源码的 gradle/wrapper/gradle-wrapper.properties 文件中查看所需版本。

[!TIP] 编译时程序会自动下载 Gradle,但速度可能很慢。建议手动下载所需版本的 Gradle 压缩包,放置在 gradle/wrapper/ 目录下,并修改 gradle-wrapper.properties 文件中的 distributionUrl,使其指向本地文件路径。 Gradle Wrapper 配置

2. 下载源码

1
2
3
4
5
# 下载指定版本
wget https://github.com/azkaban/azkaban/archive/3.70.0.tar.gz
# 解压
tar -zxvf azkaban-3.70.0.tar.gz
cd azkaban-3.70.0/

3. 执行编译

在源码根目录下执行编译命令。编译过程会下载大量依赖,请耐心等待。

1
./gradlew build installDist -x test

编译成功后,您会看到 BUILD SUCCESSFUL 的提示。

2.2 部署模式

Azkaban 3.x 提供两种运行模式:

  • Solo Server Mode (单服务模式): Web 管理服务器和执行服务器运行在同一个进程中,元数据默认使用内置的 H2 数据库。适用于测试或小规模场景。
  • Multiple-Executor Mode (分布式多服务模式): Web 服务器和执行服务器分离,元数据存储在外部 MySQL 数据库。适合生产环境。

2.3 Solo Server 模式部署

下面以更简单的单服务模式为例进行部署。

1. 解压安装包

编译成功后,安装包位于 azkaban-solo-server/build/distributions/ 目录下。

1
2
3
# 解压
tar -zxvf azkaban-solo-server-3.70.0.tar.gz
cd azkaban-solo-server-3.70.0/

2. 修改时区(可选)

Azkaban 默认时区为 America/Los_Angeles。如果您的定时任务需要基于本地时间,请修改 conf/azkaban.properties 文件中的时区设置。

1
azkaban.default.timezone.id=Asia/Shanghai

3. 启动与验证

安装包根目录 下执行启动命令。

1
bin/start-solo.sh

启动后,可以通过 jps 命令查看 AzkabanSingleServer 进程是否存在。然后访问 http://<your-ip>:8081,使用默认用户名 azkaban 和密码 azkaban 登录。

Azkaban 登录界面

三、工作流实践:Flow 1.0

Flow 1.0 是 Azkaban 传统的、基于 .job 文件的配置方式。每个任务(Job)定义在一个单独的 .job 文件中,使用 Properties 格式。

3.1 基本任务调度

  1. 创建项目:在 Azkaban UI 上创建一个新项目。
  2. 编写 Job 文件:创建一个 .job 文件,例如 hello.job

    1
    2
    3
    
    # hello.job
    type=command
    command=echo 'Hello Azkaban Flow 1.0!'
    
  3. 打包上传:将所有 .job 文件打包成一个 .zip 文件,并通过 UI 上传到您的项目中。
  4. 执行与查看:在 UI 上找到您的 Flow,点击 “Execute Flow” 执行,并可以查看详细的执行日志。

3.2 多任务依赖调度

通过 dependencies 属性可以定义任务之间的依赖关系。

假设有五个任务,D 依赖 A、B、C,E 依赖 D。

  • Task-A.job, Task-B.job, Task-C.job:
    1
    2
    
    type=command
    command=echo 'Task A' // B, C
    
  • Task-D.job:
    1
    2
    3
    
    type=command
    command=echo 'Task D'
    dependencies=Task-A,Task-B,Task-C
    
  • Task-E.job:
    1
    2
    3
    
    type=command
    command=echo 'Task E'
    dependencies=Task-D
    

将这五个 .job 文件打包上传后,Azkaban 会自动解析依赖关系并生成工作流图。

Flow 1.0 依赖关系图

3.3 调度实战示例

调度 Hive 作业

  • hive-task.job:
    1
    2
    
    type=command
    command=/path/to/hive/bin/hive -f 'test.sql'
    
  • test.sql:
    1
    2
    3
    4
    
    CREATE DATABASE IF NOT EXISTS my_db;
    USE my_db;
    CREATE TABLE emp(empno int, ename string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
    DESC emp;
    

hive-task.jobtest.sql 一起打包上传。Azkaban 会在执行 command 时,在工作目录下找到 test.sql 文件。

3.4 问题排查

如果遇到 Cannot request memory ... from system for job 的错误,通常是因为执行主机的可用内存不足 3G。如果无法增加内存,可以关闭内存检查。修改 plugins/jobtypes/commonprivate.properties 文件:

1
memCheck.enabled=false

四、工作流实践:Flow 2.0

Flow 2.0 是 Azkaban 推荐的现代工作流定义方式,它使用 YAML 语法,将一个 Flow 内的所有任务和配置都定义在单个 .flow 文件中,更加简洁和强大。

4.1 启用 Flow 2.0

要让 Azkaban 识别 Flow 2.0,您需要在项目压缩包的根目录下包含一个 project.properties 文件,内容如下:

1
azkaban-flow-version:2.0

4.2 YAML 语法简介

  • 大小写敏感。
  • 使用缩进表示层级关系。
  • 使用 # 表示注释。
  • 键值对用冒号分隔:key: value (冒号后有空格)。
  • 数组用短横线表示:- item1

4.3 多任务调度示例

使用 Flow 2.0,之前需要五个 .job 文件的依赖关系现在可以用一个 .flow 文件搞定。

  • multi-tasks.flow: ```yaml nodes:
    • name: jobE type: command config: command: echo “This is job E” dependsOn:
      • jobD
    • name: jobD type: command config: command: echo “This is job D” dependsOn:
      • jobA
      • jobB
      • jobC
    • name: jobA type: command config: command: echo “This is job A”

    • name: jobB type: command config: command: echo “This is job B”

    • name: jobC type: command config: command: echo “This is job C” ```

4.4 内嵌流 (Embedded Flow)

Flow 2.0 的一大亮点是支持在一个 Flow 中嵌套另一个 Flow,这对于构建模块化、可复用的工作流非常有用。

  • embedded.flow: ```yaml nodes:
    • name: jobC type: command config: command: echo “This is job C” dependsOn:
      • embedded_flow # 依赖整个内嵌流
    • name: embedded_flow type: flow # 类型为 flow nodes: # 内嵌流自己的节点定义
      • name: jobB type: command config: command: echo “This is job B” dependsOn:
        • jobA
      • name: jobA type: command config: command: echo “This is job A” ```

上传后,UI 会展示出清晰的嵌套结构。

Flow 2.0 内嵌流

五、总结

Azkaban 作为一个轻量级、易于使用的工作流调度系统,非常适合中小型大数据项目。特别是 Flow 2.0 的引入,通过 YAML 和内嵌流等特性,使其在定义复杂工作流时变得更加灵活和强大。希望本篇指南能帮助您快速上手并精通 Azkaban 的使用。

本文由作者按照 CC BY 4.0 进行授权