Azkaban是一种类似于Oozie的工作流控制引擎,可以用来解决多个Hadoop(或Spark等)离线计算任务之间的依赖关系问题。
也可以用其代替cron来对周期性任务进行调度,并且更为直观,可靠,同时提供了美观的可视化管理界面。
下文将对azkaban对spark离线任务调度进行简要说明。
一. 简介
该部分内容可参考官方文档:http://azkaban.github.io/azkaban/docs/latest/#overview
azkaban由三部分构成:
- Relational Database(Mysql)
- Azkaban Web Server
- Azkaban Executor Server
Relational Database(Mysql)
azkaban将大多数状态信息都存于Mysql中,Azkaban Web Server 和 Azkaban Executor Server也需要访问DB。
Azkaban Web Server
提供了Web UI,是azkaband的主要管理者,包括 project 的管理,认证,调度,对工作流执行过程的监控等。
Azkaban Executor Server
调度工作流和任务,纪录工作流活任务的日志,之所以将AzkabanWebServer和AzkabanExecutorServer分开,主要是因为在某个任务流失败后,可以更方便的将重新执行。而且也更有利于Azkaban系统的升级。
可调度任务类型
- linux命令
- 脚本
- java程序
- hadoop MR
- hive
创建工作
-
创建工作任务
创建.job为后缀的文件,type是工作任务类型执行会输出 Hello Worldvim hello.job type=command command=echo "Hello World"
-
创建工作流
两个工作任务,通过dependencies进行关联vim foo.job type=command command=echo foo vim bar.job type=command dependencies=foo command=echo bar
工作流如下:
将会先调用foo再调用bar。
二. 调度Spark任务Demo
创建一个新的project
编写代码 写一段简单的Spark代码,将程序打包
1 2 3 4 5 6 7 8 9 10 11 12 | package com.test import org.apache.spark.{SparkConf, SparkContext} object AzkabanTest extends App{ val conf = new SparkConf() .setMaster("local[2]") .setAppName("azkabanTest") val sc = new SparkContext(conf) val data = sc.parallelize(1 to 10) data.map{_ * 2}.foreach(println) } |
编写调度命令
vim test.job
type=command
command=/usr/install/spark/bin/spark-submit --class com.test.AzkabanTest test-1.0-SNAPSHOT.jar
将这两个文件以zip的形式打包在一起
zip -r xxx.zip azkabanTest
上传工程
目前azkaban只支持zip包,其中要包括.job文件以及一些需要的工程和文件。
设置离线任务执行周期
如果需要的话可以设置离线任务的执行周期(类似于cron的功能)
任务通知
可以设置任务完成或失败进行邮箱通知等操作。
一些界面
主界面
任务完成情况
任务log详情
定时任务调用情况图