分布式任务调度框架 Azkaban —— Flow 2.0 的使用

一、Flow 2.0 简介

1.1 Flow 2.0 的产生

Azkaban 目前同时支持 Flow 1.0 和 Flow2.0 ,但是官方文档上更推荐使用 Flow 2.0,因为 Flow 1.0 会在将来的版本被移除。Flow 2.0 的主要设计思想是提供 1.0 所没有的流级定义。用户可以将属于给定流的所有 job / properties 文件合并到单个流定义文件中,其内容采用 YAML 语法进行定义,同时还支持在流中再定义流,称为为嵌入流或子流。

1.2 基本结构

项目 zip 将包含多个流 YAML 文件,一个项目 YAML 文件以及可选库和源代码。Flow YAML 文件的基本结构如下:

  • 每个 Flow 都在单个 YAML 文件中定义;
  • 流文件以流名称命名,如:my-flow-name.flow
  • 包含 DAG 中的所有节点;
  • 每个节点可以是作业或流程;
  • 每个节点 可以拥有 name, type, config, dependsOn 和 nodes sections 等属性;
  • 通过列出 dependsOn 列表中的父节点来指定节点依赖性;
  • 包含与流相关的其他配置;
  • 当前 properties 文件中流的所有常见属性都将迁移到每个流 YAML 文件中的 config 部分。

官方提供了一个比较完善的配置样例,如下:

config:
  user.to.proxy: azktest
  param.hadoopOutData: /tmp/wordcounthadoopout
  param.inData: /tmp/wordcountpigin
  param.outData: /tmp/wordcountpigout

# This section defines the list of jobs
# A node can be a job or a flow
# In this example, all nodes are jobs
nodes:
 # Job definition
 # The job definition is like a YAMLified version of properties file
 # with one major difference. All custom properties are now clubbed together
 # in a config section in the definition.
 # The first line describes the name of the job
 - name: AZTest
   type: noop
   # The dependsOn section contains the list of parent nodes the current
   # node depends on
   dependsOn:
     - hadoopWC1
     - NoOpTest1
     - hive2
     - java1
     - jobCommand2

 - name: pigWordCount1
   type: pig
   # The config section contains custom arguments or parameters which are
   # required by the job
   config:
     pig.script: src/main/pig/wordCountText.pig

 - name: hadoopWC1
   type: hadoopJava
   dependsOn:
     - pigWordCount1
   config:
     classpath: ./*
     force.output.overwrite: true
     input.path: ${param.inData}
     job.class: com.linkedin.wordcount.WordCount
     main.args: ${param.inData} ${param.hadoopOutData}
     output.path: ${param.hadoopOutData}

 - name: hive1
   type: hive
   config:
     hive.script: src/main/hive/showdb.q

 - name: NoOpTest1
   type: noop

 - name: hive2
   type: hive
   dependsOn:
     - hive1
   config:
     hive.script: src/main/hive/showTables.sql

 - name: java1
   type: javaprocess
   config:
     Xms: 96M
     java.class: com.linkedin.foo.HelloJavaProcessJob

 - name: jobCommand1
   type: command
   config:
     command: echo "hello world from job_command_1"

 - name: jobCommand2
   type: command
   dependsOn:
     - jobCommand1
   config:
     command: echo "hello world from job_command_2"

二、YAML语法

想要使用 Flow 2.0 进行工作流的配置,首先需要了解 YAML 。YAML 是一种简洁的非标记语言,有着严格的格式要求的,如果你的格式配置失败,上传到 Azkaban 的时候就会抛出解析异常。

2.1 基本规则

  1. 大小写敏感 ;
  2. 使用缩进表示层级关系 ;
  3. 缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级;
  4. 使用#表示注释 ;
  5. 字符串默认不用加单双引号,但单引号和双引号都可以使用,双引号表示不需要对特殊字符进行转义;
  6. YAML 中提供了多种常量结构,包括:整数,浮点数,字符串,NULL,日期,布尔,时间。

2.2 对象的写法

# value 与 : 符号之间必须要有一个空格
key: value

2.3 map的写法

# 写法一 同一缩进的所有键值对属于一个map
key:
    key1: value1
    key2: value2

# 写法二
{key1: value1, key2: value2}

2.3 数组的写法

# 写法一 使用一个短横线加一个空格代表一个数组项
- a
- b
- c

# 写法二
[a,b,c]

2.5 单双引号

支持单引号和双引号,但双引号不会对特殊字符进行转义:

s1: '内容\n 字符串'
s2: "内容\n 字符串"

转换后:
{ s1: '内容\\n 字符串', s2: '内容\n 字符串' }

2.6 特殊符号

一个 YAML 文件中可以包括多个文档,使用 --- 进行分割。

2.7 配置引用

Flow 2.0 建议将公共参数定义在 config 下,并通过 ${} 进行引用。

三、简单任务调度

3.1 任务配置

新建 flow 配置文件:

nodes:
  - name: jobA
    type: command
    config:
      command: echo "Hello Azkaban Flow 2.0."

在当前的版本中,Azkaban 同时支持 Flow 1.0 和 Flow 2.0,如果你希望以 2.0 的方式运行,则需要新建一个 project 文件,指明是使用的是 Flow 2.0:

azkaban-flow-version: 2.0

3.2 打包上传

3.3 执行结果

由于在 1.0 版本中已经介绍过 Web UI 的使用,这里就不再赘述。对于 1.0 和 2.0 版本,只有配置方式有所不同,其他上传执行的方式都是相同的。执行结果如下:

四、多任务调度

和 1.0 给出的案例一样,这里假设我们有五个任务(jobA——jobE), D 任务需要在 A,B,C 任务执行完成后才能执行,而 E 任务则需要在 D 任务执行完成后才能执行,相关配置文件应如下。可以看到在 1.0 中我们需要分别定义五个配置文件,而在 2.0 中我们只需要一个配置文件即可完成配置。

nodes:
  - name: jobE
    type: command
    config:
      command: echo "This is job E"
    # jobE depends on jobD
    dependsOn:
      - jobD

  - name: jobD
    type: command
    config:
      command: echo "This is job D"
    # jobD depends on jobA、jobB、jobC
    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"

五、内嵌流

Flow2.0 支持在一个 Flow 中定义另一个 Flow,称为内嵌流或者子流。这里给出一个内嵌流的示例,其 Flow 配置如下:

nodes:
  - name: jobC
    type: command
    config:
      command: echo "This is job C"
    dependsOn:
      - embedded_flow

  - name: embedded_flow
    type: flow
    config:
      prop: value
    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"

内嵌流的 DAG 图如下:

执行情况如下:

参考资料

  1. Azkaban Flow 2.0 Design
  2. Getting started with Azkaban Flow 2.0

更多大数据系列文章可以参见 GitHub 开源项目大数据入门指南

原文地址:https://www.cnblogs.com/heibaiying/p/11442420.html

时间: 2024-10-06 14:06:09

分布式任务调度框架 Azkaban —— Flow 2.0 的使用的相关文章

分布式任务调度框架xxl-job

github地址:https://github.com/xuxueli/xxl-job git.osc地址:http://git.oschina.net/xuxueli0323/xxl-job 博客地址(内附使用教程):http://www.cnblogs.com/xuxueli/p/4845111.html [最迅速的熟悉该项目的方式:执行Job库初始化SQL:Eclipse中导入xxl-job-admin项目,启动项目访问:即可:] 一.简介:<分布式任务调度框架xxl-job> 基于qu

新一代分布式任务调度框架:当当elastic-job开源项目的10项特性

作者简介: 张亮,当当网架构师.当当技术委员会成员.消息中间件组负责人.对架构设计.分布式.优雅代码等领域兴趣浓厚.目前主导当当应用框架ddframe研发,并负责推广及撰写技术白皮书. 一.为什么需要作业(定时任务)? 作业即定时任务.一般来说,系统可使用消息传递代替部分使用作业的场景.两者确有相似之处.可互相替换的场景,如队列表.将待处理的数据放入队列表,然后使用频率极短的定时任务拉取队列表的数据并处理.这种情况使用消息中间件的推送模式可更好的处理实时性数据.而且基于数据库的消息存储吞吐量远远

分布式的任务调度框架

[niubi-job——一个分布式的任务调度框架]----niubi-job这下更牛逼了! niubi-job迎来第一次重大优化 niubi-job是一款专门针对定时任务所设计的分布式任务调度框架,它可以进行动态发布任务,并且有超高的可用性保证. 有多少人半夜被叫起来查BUG,结果差到最后发现,是因为某个定时任务挂了导致出了问题? 有了niubi-job,你再也不用担心这个问题! 又有多少人因为要发布一个新的定时任务,为了不影响线上的运行,只能等到半夜再去发布应用? 有了niubi-job,你可

【niubi-job——一个分布式的任务调度框架】----niubi-job这下更牛逼了!

niubi-job迎来第一次重大优化 niubi-job是一款专门针对定时任务所设计的分布式任务调度框架,它可以进行动态发布任务,并且有超高的可用性保证. 有多少人半夜被叫起来查BUG,结果差到最后发现,是因为某个定时任务挂了导致出了问题? 有了niubi-job,你再也不用担心这个问题! 又有多少人因为要发布一个新的定时任务,为了不影响线上的运行,只能等到半夜再去发布应用? 有了niubi-job,你可以随时发布你的定时任务而且不会影响当前任务的运行! 是不是很兴奋呢? 还有更兴奋的呢,那就是

分布式任务调度平台XXL-JOB本地配置可能遇到的问题和解决方案

一. 基本概念 XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家公司线上产品线,开箱即用. 二. 本地实例配置问题 这个地方就不做过多赘述了,官方文档上以及说的很详细.网上的博客也有很多.接下来主要讲一下作者在本地配置运行过程中遇到的各种问题. 这里作者使用的环境 1. JDK 1.8 2. Maven 4.0 3. Mysql 8.0 4. 操作系统 Mac os (这里是关键,这也是下边各种问题的关键) 三. 配置运行

分布式任务调度平台SIA-TASK的架构设计与运行流程

一.分布式任务调度的背景 无论是互联网应用或者企业级应用,都充斥着大量的批处理任务.我们常常需要一些任务调度系统来帮助解决问题.随着微服务化架构的逐步演进,单体架构逐渐演变为分布式.微服务架构.在此背景下,很多原先的任务调度平台已经不能满足业务系统的需求,于是出现了一些基于分布式的任务调度平台. 1.1 分布式任务调度的演进 在实际业务开发过程中,很多时候我们无可避免地需要使用一些定时任务来解决问题.通常我们会有多种解决方案:使用 Crontab 或 SpringCron (当然这种情况可能机器

分布式任务调度的解决方案

简介 随着系统规模的发展,定时任务数量日益增多,任务也变得越来越复杂,尤其是在分布式环境下,存在多个业务系统,每个业务系统都有定时任务的需求,如果都在自身系统中调度,一方面增加业务系统的复杂度,另一方面也不方便管理,因此需要有一个任务平台对分散的任务进行统一管理调度,基于目前的情况,任务平台需要支持以下几个方面: 1.任务统一管理,提供图形化界面对任务进行配置和调度. 2.任务并发控制,同一个任务在同一时间只能允许一个执行. 3.任务弹性扩容,可根据繁忙情况动态增减服务器分摊压力,对大任务进行分

分布式任务框架选型

任务框架需求: 分布式任务框架,需要一个分布式锁,只有获得锁的才能执行任务.     解决方案:redis,zookeeper,DB 运维工具.日志.监控.任务配置等 高可用性.保证任务能够执行,且不重复跑.用途就是在分布式环境使用,可以轻松实现. 第1.3点不复杂代码量也不多,可以自己实现,但第2点需要大量的code,需要从网上找现成的框架. 下面调研了4种分布式任务调度框架,整理如下:   可用性 运维工具 复杂度 任务分片 并行调度 文档 部署方式 tbschedule 高 丰富 中 支持

宜信开源|分布式任务调度平台SIA-TASK的架构设计与运行流程

一.分布式任务调度的背景 无论是互联网应用或者企业级应用,都充斥着大量的批处理任务.我们常常需要一些任务调度系统来帮助解决问题.随着微服务化架构的逐步演进,单体架构逐渐演变为分布式.微服务架构.在此背景下,很多原先的任务调度平台已经不能满足业务系统的需求,于是出现了一些基于分布式的任务调度平台. 1.1 分布式任务调度的演进 在实际业务开发过程中,很多时候我们无可避免地需要使用一些定时任务来解决问题.通常我们会有多种解决方案:使用 Crontab 或 SpringCron (当然这种情况可能机器