1 两种调度工具功能对比图

下面的表格对上述2种hadoop工作流调度器的关键特性进行了比较,尽管这些工作流调度器能够解决的需求场景基本一致,但在设计理念,目标用户,应用场景等方面还是存在区别

特性

Oozie

Azkaban

工作流描述语言

XML (xPDL based)

text file with key/value pairs

依赖机制

explicit

explicit

是否要web容器

Yes

Yes

进度跟踪

web page

web page

Hadoop job调度支持

yes

yes

运行模式

daemon

daemon

Pig支持

yes

yes

事件通知

no

no

需要安装

yes

yes

支持的hadoop版本

0.20+

currently unknown

重试支持

workflownode evel

yes

运行任意命令

yes

yes

Amazon EMR支持

no

currently unknown

1   Azkaban与Oozie对比

对市面上最流行的两种调度器,给出以下详细对比。知名度比较高的应该是Apache Oozie,但是其配置工作流的过程是编写大量的XML配置,而且代码复杂度比较高,不易于二次开发。ooize相比azkaban是一个重量级的任务调度系统,功能全面,但配置使用也更复杂。如果可以不在意某些功能的缺失,轻量级调度器azkaban是很不错的候选对象

l  功能

两者均可以调度linux命令、mapreduce、spark、pig、java、hive、java程序、脚本工作流任务

两者均可以定时执行工作流任务

l  工作流定义

Azkaban使用Properties文件定义工作流

Oozie使用XML文件定义工作流

l  工作流传参

Azkaban支持直接传参,例如${input}

Oozie支持参数和EL表达式,例如${fs:dirSize(myInputDir)}

l  定时执行

Azkaban的定时执行任务是基于时间的

Oozie的定时执行任务基于时间和输入数据

l  资源管理

Azkaban有较严格的权限控制,如用户对工作流进行读/写/执行等操作

Oozie暂无严格的权限控制

l  工作流执行

Azkaban有三种运行模式:

1 solo server mode:最简单的模式,数据库内置的H2数据库,管理服务器和执行服务器都在一个进程中运行,任务量不大项目可以采用此模式。

2       two server mode:数据库为mysql,管理服务器和执行服务器在不同进程,这种模式下,管理服务器和执行服务器互不影响

3 multiple executor mode:该模式下,执行服务器和管理服务器在不同主机上,且执行服务器可以有多个

我这次采用第二种模式,管理服务器、执行服务器分进程,但在同一台主机上。

Oozie作为工作流服务器运行,支持多用户和多工作流

l  工作流管理

Azkaban支持浏览器以及ajax方式操作工作流

Oozie支持命令行、HTTP REST、Java API、浏览器操作工作流

3     Azkaban简介

Azkaban是一种类似于Oozie的工作流控制引擎,可以用来解决多个Hadoop(或Spark等)离线计算任务之间的依赖关系问题。

也可以用其代替crontab来对周期性任务进行调度,并且更为直观,可靠,同时提供了美观的可视化管理界面。

l  azkaban由三部分构成:

l  Relational Database(Mysql)

l  azkaban将大多数状态信息都存于MySQL中,Azkaban Web Server 和 Azkaban Executor Server也需要访问DB。

l  Azkaban Web Server

l  提供了Web UI,是azkaban的主要管理者,包括 project 的管理,认证,调度,对工作流执行过程的监控等。

l  Azkaban Executor Server

l  调度工作流和任务,纪录工作流活任务的日志,之所以将AzkabanWebServer和AzkabanExecutorServer分开,主要是因为在某个任务流失败后,可以更方便的将重新执行。而且也更有利于Azkaban系统的升级

a)   安装

参考

http://blog.csdn.net/bbaiggey/article/details/50775568

i. 上传解压重命名

mkdir  /home/hadoop/azkaban

将主要的3个jar先上传 解压

解压,重命名(不是必要的步骤为了方便我选择重命名)

mv azkaban-web-   / server
mv azkaban-executor-  / executor
进入mysql
mysql -uroot -proot
mysql> create database azkaban;
mysql> use azkaban;
Database changed
#执行创建表的脚本
mysql> source /home/hadoop/azkaban/azkaban-/create-all-sql-.sql ;

i. 创建SSL配置

命令: keytool -keystore keystore -alias jetty -genkey -keyalg RSA

运行此命令后,会提示输入当前生成 keystore的密码及相应信息,输入的密码请劳记,信息如下:

输入keystore密码:

再次输入新密码:

您的名字与姓氏是什么?

[Unknown]:

您的组织单位名称是什么?

[Unknown]:

您的组织名称是什么?

[Unknown]:

您所在的城市或区域名称是什么?

[Unknown]:

您所在的州或省份名称是什么?

[Unknown]:

#以上内容只需回车不用填写

该单位的两字母国家代码是什么

[Unknown]:  CN

CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN 正确吗?

[否]:  y

输入<jetty>的主密码

(如果和 keystore 密码相同,按回车):

再次输入新密码:

完成上述工作后,将在当前目录生成 keystore 证书文件,将keystore 拷贝到 azkaban web服务器根目录中.如:

cp keystore server/

i. 配置文件

注:先配置好服务器节点上的时区(或者先date一下看看自己的时区是不是CST时区,如果是的话这一步可以省去)

1、先生成时区配置文件Asia/Shanghai,用交互式命令 tzselect 即可

1、拷贝该时区文件,覆盖系统本地时区配置

cp  /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime

azkaban web服务器配置

进入azkaban web服务器安装目录 conf目录

v  修改azkaban.properties文件

命令vi azkaban.properties

内容说明如下:

. 修改时区和首页名称:
#Azkaban Personalization Settings
azkaban.name=Test                           #服务器UI名称,用于服务器上方显示的名字
azkaban.label=My Local Azkaban                               #描述
azkaban.color=#FF3601                                                 #UI颜色
azkaban.default.servlet.path=/index                         #
web.resource.dir=web/                                                 #默认根web目录
default.timezone.id=Asia/Shanghai                           #默认时区为美国,已改为亚洲/上海
#Azkaban UserManager class
user.manager.class=azkaban.user.XmlUserManager   #用户权限管理默认类
user.manager.xml.file=conf/azkaban-users.xml              #用户配置,具体配置参考下文

#Loader for projects
executor.global.properties=conf/global.properties    # global配置文件所在位置
azkaban.project.dir=projects                                                #
 . 修改 MySql 数据库配置
database.type=mysql                                                              #数据库类型
mysql.port=                                                                       #端口号
mysql.host=hadoop03                                                      #数据库连接IP
mysql.database=azkaban                                                       #数据库实例名
mysql.user=root                                                                 #数据库用户名
mysql.password=root                                                          #数据库密码
mysql.numconnections=                                                  #最大连接数

# Velocity dev mode
velocity.dev.mode=false
. 修改 Jetty 服务器属性,包括 keystore 的相关配置
# Jetty服务器属性.
jetty.maxThreads=                                                               #最大线程数
jetty.ssl.port=                                                                   #Jetty SSL端口
jetty.port=                                                                         #Jetty端口
jetty.keystore=keystore                                                          #SSL文件名
jetty.password=                                                          #SSL文件密码, 创建keystore的密码
jetty.keypassword=                                                      #Jetty主密码 与 keystore文件相同
jetty.truststore=keystore                                                                #SSL文件名
jetty.trustpassword=                                                   # SSL文件密码

# 执行服务器属性
executor.host=slave1                                    #执行服务器ip,集群模式
executor.port=                                                               #执行服务器端口
 . 修改邮件设置(可选)
# 邮件设置
mail.sender=a8589781@.com                                       #发送邮箱
mail.host=smtp..com                                                       #发送邮箱smtp地址
mail.user=xxxxxxxx                                       #发送邮件时显示的名称
mail.password=**********                                                 #邮箱密码
job.failure.email=a8589781@.com                              #任务失败时发送邮件的地址
job.success.email=a8589781@.com                            #任务成功时发送邮件的地址
lockdown.create.projects=false                                           #
cache.directory=cache                                                            #缓存目录

v  azkaban 执行服务器配置

进入执行服务器安装目录conf,修改azkaban.properties

vi azkaban.properties

#Azkaban
default.timezone.id=Asia/Shanghai                                              #时区

# Azkaban JobTypes 插件配置
#azkaban.jobtype.plugin.dir=plugins/jobtypes                   #jobtype 插件所在位置(如果下载jobtypes插件 就配置对应文件,参考:http://blog.itpub.net/29754888/viewspace-1418203/)

#Loader for projects
executor.global.properties=conf/global.properties
azkaban.project.dir=projects

#数据库设置
database.type=mysql                                                                       #数据库类型(目前只支持mysql)
mysql.port=                                                                                #数据库端口号
mysql.host=192.168.20.200                                                           #数据库IP地址
mysql.database=azkaban                                                                #数据库实例名
mysql.user=azkaban                                                                         #数据库用户名
mysql.password=oracle                                                                   #数据库密码
mysql.numconnections=                                                           #最大连接数

# 执行服务器配置
executor.maxThreads=                                                                #最大线程数
executor.port=                                                               #端口号(如修改,请与web服务中一致)
executor.flow.threads=                                                                #线程数

v  用户配置

进入azkaban web服务器conf目录,修改azkaban-users.xml

vi azkaban-users.xml 增加 管理员用户

<azkaban-users>
        <user username="azkaban" password="azkaban" roles="admin" groups="azkaban" />
        <user username="metrics" password="metrics" roles="metrics"/>
        <user username="admin" password="admin" roles="admin,metrics" />
        <role name="admin" permissions="ADMIN" />
        <role name="metrics" permissions="METRICS"/>
</azkaban-users>

注意:检查安载包web和executor的lib文件下是否有mysql驱动,若不存在,则拷贝一个

启动

1. web服务器

在azkaban web服务器目录下执行启动命令

cd /home/hadoop/azkaban/server/

bin/azkaban-web-start.sh

注:在web服务器根目录运行(一定要在根目录下执行因为配置文件中有一个conf/xxx 在其他目录下会找不到conf目录的)

或者启动到后台

nohup bin/azkaban-web-start.sh  >/tmp/azstd.>/tmp/azerr.out & 或者 (nohup ./bin/azkaban-web-start.sh &  )

2.  执行服务器

在执行服务器目录下执行启动命令

cd /home/hadoop/azkaban/executor/

bin/azkaban-executor-start.sh

注:只能在执行服务器根目录运行

也可以在后台运行:nohup ./bin/azkaban-executor-start.sh &

启动完成后,在浏览器(建议使用谷歌浏览器)中输入https://服务器IP地址:8443 ,即可访问azkaban服务了.在登录中输入刚才新的户用名及密码,点击 login.

a)   实例demo

参考

http://blog.csdn.net/lsshlsw/article/details/50831239

  1. 创建工作任务 

    创建.job为后缀的文件,type是工作任务类型执行会输出 Hello World
vim hello.job

type=command

command=sh hello.sh
#!/bin/bash

echo 'hello' > /home/hadoop/hello.txt

放到同一个目录下然后进行压缩,目前只支持.zip格式的压缩文件

  1. 创建工作流 

    两个工作任务,通过dependencies进行关联
vim foo.job

type=command

command=echo foo
vim bar.job

type=command

dependencies=foo

command=echo bar

工作流如下: 

将会先调用foo再调用bar。

a)   调度hive

# hive.job
type=command
command=hive -f 'test.sql'
vim test.sql
use default;
drop table aztest if exists;
create table aztest(id int,name string) row format delimited fields terminated by ',';
load data inpath '/tmp/hadoop/aztest/' into table aztest;
create table az2 as select * from aztest;

调度Spark任务Demo

创建一个新的project

编写代码
 写一段简单的Spark代码,将程序打包
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( to )
  data.map{_ * }.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文件以及一些需要的工程文件。

最新文章

  1. C++标准库实现WAV文件读写
  2. 时钟周期,CPU周期,指令周期,CPU时间片
  3. Spring源码分析——BeanFactory体系之抽象类、类分析(一)
  4. 湖南省第十二届大学生计算机程序设计竞赛 F 地铁 多源多汇最短路
  5. Visual Studio 换皮肤
  6. UART UVM验证平台平台搭建总结
  7. ext3中xtype属性汇总
  8. 浅析 JavaScript 的函数节流和去抖
  9. js秒数转换时分秒方法
  10. iOS 日历控件
  11. 区分javascript中的toString(),toLocaleString(),valueOf()方法
  12. 利用linq的Take Skip方法解决 集合拆分的问题
  13. CSS3字体发光效果
  14. python中读取文件数据时要注意文件路径
  15. IDEA搭建本地服务器解决无法连接https://start.spring.io
  16. MFC实现一元稀疏多项式运算器
  17. ASP.NET Web API实践系列09,在Fiddler和控制台中模拟GET和POST请求
  18. Android -- View流程
  19. 【WPF】使用控件MediaElement播放视频
  20. StringUtils学习

热门文章

  1. 查看.netframeword版本
  2. gomobile 真机 log 打出的日志跟踪
  3. SecureCRT的背景和文字颜色的修改
  4. ListView中内容的动画效果
  5. dhtmlxGrid分页查询,条件查询实例
  6. jdk分析之String
  7. 死锁及oracle死锁--转载
  8. 【Robot Framework】robot framework 学习以及selenium、appnium、requests实践(四)
  9. python 2.7.10 找不到 libmysqlclient.18.dylib 解决方案
  10. 【CImg】简单的畸变矩形矫正