任务调度系统的比较

oozie

优势: 老牌任务调度系统, 稳定性高; cdh版本自动集成. 无需担心兼容性
劣势: 重量级, 任务调度依靠xml文件, 门槛较高, 不够灵活, 不易于二次开发和后期维护

kattle

优势

  1. 精细化控制, 可以自定义实现复杂功能
  2. 可以在windows上修改, 创建, 修改, 运行控制任务
    劣势
  3. 很多需求要kattle在linux上运行, kattle的设计往往在window完成, 环境的差异可能遇到不可期的问题
  4. linux上运行时, web端管理工具不够好
  5. 功能不够集成, job需要手动控制, 不适合复杂度太高的场景
azkaban

优势: 轻量级, 易使用, 深度集成spark, 通过插件扩展功能
劣势: 没有易用的, 更细粒度的流程控制, 比如, 增量导入需要依赖shell+sqoop

安装

  1. 直接搜索azkaban, 在官网上能找到最新版本和历史版本. 以3.56.0版本为例
  2. 参考官方文档, 使用源码安装.
    核心操作就是, cd到对应目录下, 之后运行./gradlew build 这一步很慢, 甚至于多次因为超时而失败, 多次重试即可
    未测试: 有资料说, 可以在 ${AZKABAN_HOME}/build.gradle文件中增加如下配置
mavenLocal()
maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
maven{ url ''}
  1. 镜像下载完成后, 会提示说因为一个test未通过而失败, 这是因为官网的编译版本本身就不带测试命令. 需要运行./gradlew build -x test 跳过测试
  2. 编译完成后, 各组件的build目录下, 会生成相应的.tar.gz文件. 例如, ./azkaban-solo-server/build/distributions/azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz.
    组件列举如下
    文件夹|功能
    -|-
    azkaban-exec-server|核心之一, (分布式)执行器
    azkaban-web-server|核心之二, 网页服务
    azkaban-db|数据库工具
    azkaban-solo-server|单机版, 用于学习基本操作
    azkaban-common|基本的依赖包
    azkaban-spi|azkaban存储接口以及exception类
    azkaban-hadoop-security-plugin|hadoop 有关kerberos插件
  3. 简单看了下azkaban-db的源码, 它通过jdbc连接到mysql, 然后就可以进行初始化等操作. 官网推荐直接手动运行sql文件.
    运行时因为主键过长而报错, 查询后发现是因为旧版本的mysql不支持, 只好调低了varchar范围

配置

azkaban-web-server在一台服务器上启动即可, 而azkaban-exec-server可以部署在多态服务器上.
网页服务和执行器的目录下的conf文件夹中, 都有azkaban.properties, 虽然同名, 但并不需要保持相同.
执行器的azkaban.properties只需要配置mysql相关的信息, 这是因为执行器启动时, 会在mysql中注册自己的hostnameport, 而且会自动生成一个id.
azkaban运行任务时, 就可以设置useExecutor=id, 以指定任务运行的节点

网页服务的azkaban.properties, 需要修改的字段示例如下

# 设置网页展示的内容
azkaban.name=CoreMaster
azkaban.label=Show your wings, and cover up the sky.
azkaban.color=#FF3601
azkaban.default.servlet.path=/index
web.resource.dir=web/
default.timezone.id=Asia/Shanghai

# 设置网页链接的相关内容, 比如端口号
jetty.use.ssl=false
jetty.maxThreads=25
jetty.port=8081
# 设置邮件发送的服务器
mail.sender=
mail.host=smtp.xx.com
mail.user=
mail.password=
# mail.tls=true
mail.port=
# mysql设置
database.type=mysql
mysql.port=3306
mysql.host=localhost
mysql.database=azkaban
mysql.user=azkaban
mysql.password=azkaban
mysql.numconnections=100

使用

  1. flow20.project: azkaban-flow-version: 2.0
  2. 原生的 Azkaban 支持的plugin类型有以下这些:

类型

说明

comman

Linux shell命令行任务

gobblin

通用数据采集工具

hadoopJava

运行hadoopMR任务

java

原生java任务

hive

支持执行hiveSQL

pig

pig脚本任务

spark

spark任务

hdfsToTeradata

把数据从hdfs导入Teradata

teradataToHdfs

把数据从Teradata导入hdfs

  1. azkaban调度文件配置示例
---
# 设置全局配置
config:
  failure.emails: noreply@foo.com

nodes:
  - name: jobC
    type: noop
    dependsOn:
      - embedded_flow

  - name: embedded_flow
    type: flow
    config:
      prop: value
    nodes:
      - name: jobB
        type: noop
        dependsOn:
          - jobA

      - name: jobA
        type: command
        config:
          command: pwd

: 调度文件的换行一定要是unix格式, 也就是\n, windons下的dos格式(\r\n), 在任务执行时会报异常