Oozie和Azkaban的技术选型和对比
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来对周期性任务进行调度,并且更为直观,可靠,同时提供了美观的可视化管理界面。
lazkaban由三部分构成:
lRelational Database(Mysql)
lazkaban将大多数状态信息都存于MySQL中,Azkaban Web Server 和 Azkaban Executor Server也需要访问DB。
lAzkaban Web Server
l提供了Web UI,是azkaban的主要管理者,包括 project 的管理,认证,调度,对工作流执行过程的监控等。
lAzkaban 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-2.5.0 / server
mv azkaban-executor-2.5.0/ executor
进入mysql
mysql -uroot -proot
mysql> create database azkaban;
mysql> use azkaban;
Database changed
#执行创建表的脚本
mysql> source /home/hadoop/azkaban/azkaban-2.5.0/create-all-sql-2.5.0.sql ;
i. 创建SSL配置
命令: keytool -keystore keystore -alias jetty -genkey -keyalg RSA
运行此命令后,会提示输入当前生成 keystore的密码及相应信息,输入的密码请劳记,信息如下:
输入keystore密码:
再次输入新密码:
您的名字与姓氏是什么?
:
您的组织单位名称是什么?
:
您的组织名称是什么?
:
您所在的城市或区域名称是什么?
:
您所在的州或省份名称是什么?
:
#以上内容只需回车不用填写
该单位的两字母国家代码是什么
: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
内容说明如下:
1. 修改时区和首页名称:
#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 #
2. 修改 MySql 数据库配置
database.type=mysql #数据库类型
mysql.port=3306 #端口号
mysql.host=hadoop03 #数据库连接IP
mysql.database=azkaban #数据库实例名
mysql.user=root #数据库用户名
mysql.password=root #数据库密码
mysql.numconnections=100 #最大连接数
# Velocity dev mode
velocity.dev.mode=false
3. 修改 Jetty 服务器属性,包括 keystore 的相关配置
# Jetty服务器属性.
jetty.maxThreads=25 #最大线程数
jetty.ssl.port=8443 #Jetty SSL端口
jetty.port=8081 #Jetty端口
jetty.keystore=keystore #SSL文件名
jetty.password=123456 #SSL文件密码, 创建keystore的密码
jetty.keypassword=123456 #Jetty主密码 与 keystore文件相同
jetty.truststore=keystore #SSL文件名
jetty.trustpassword=123456 # SSL文件密码
# 执行服务器属性
executor.host=slave1 #执行服务器ip,集群模式
executor.port=12321 #执行服务器端口
4. 修改邮件设置(可选)
# 邮件设置
mail.sender=a8589781@163.com #发送邮箱
mail.host=smtp.163.com #发送邮箱smtp地址
mail.user=xxxxxxxx #发送邮件时显示的名称
mail.password=********** #邮箱密码
job.failure.email=a8589781@163.com #任务失败时发送邮件的地址
job.success.email=a8589781@163.com #任务成功时发送邮件的地址
lockdown.create.projects=false #
cache.directory=cache #缓存目录
vazkaban 执行服务器配置
进入执行服务器安装目录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=3306 #数据库端口号
mysql.host=192.168.20.200 #数据库IP地址
mysql.database=azkaban #数据库实例名
mysql.user=azkaban #数据库用户名
mysql.password=oracle #数据库密码
mysql.numconnections=100 #最大连接数
# 执行服务器配置
executor.maxThreads=50 #最大线程数
executor.port=12321 #端口号(如修改,请与web服务中一致)
executor.flow.threads=30 #线程数
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.sh1>/tmp/azstd.out2>/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
[*]创建工作任务
创建.job为后缀的文件,type是工作任务类型执行会输出 Hello World
vim hello.job
type=command
command=sh hello.sh
#!/bin/bash
echo 'hello' > /home/hadoop/hello.txt
放到同一个目录下然后进行压缩,目前只支持.zip格式的压缩文件
[*]创建工作流
两个工作任务,通过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")
.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文件以及一些需要的工程文件。
页:
[1]