一个完整的数据分析系统通常都是由大量任务单元组成:shell脚本程序,java程序,mapreduce程序、hive脚本等。
各任务单元之间存在时间先后及前后依赖关系。
例如,某个业务系统每天产生20G原始数据,需要每天都对其进行处理,处理步骤如下所示:
需要将统计分析得到的结果数据同步到业务系统中,供业务调用使用。
为了实现上面多个任务的依次执行,可以使用现成的开源调度系统,比如流行的**ooize**、**azkaban**等。而市面上目前有许多工作流调度器,在hadoop领域,常见的工作流调度器还有Cascading,Hamake等。
对市面上最流行的两种调度器,给出以下详细对比,以供技术选型参考。总体来说,ooize相比azkaban是一个重量级的任务调度系统,功能全面,但配置使用也更复杂。如果可以不在意某些功能的缺失,轻量级调度器azkaban是很不错的候选对象。
Azkaban是由Linkedin开源的一个批量工作流任务调度器。用于在一个工作流内以一个特定的顺序运行一组工作和流程。Azkaban定义了一种KV文件格式来建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。
它有如下功能特点:
解压压缩包到对应的文件夹,如下路径:
[root@mini1 azkaban]# ll
drwxr-xr-x. 2 root root 4096 Jun 20 03:31 azkaban-2.5.0
drwxr-xr-x. 10 root root 4096 Jun 20 04:11 executor
drwxr-xr-x. 9 root root 4096 Jun 20 04:01 server
在mysql中为azkaban创建对应的数据库:
create database azkaban;
use azkaban;
source /root/azkaban/azkaban-2.5.0/create-all-sql-2.5.0.sql;
创建SSL配置,产生对应的keystore文件,将其拷贝的server根目录:
keytool -keystore keystore -alias jetty -genkey -keyalg RSA
输入keystore密码:
再次输入新密码:
您的名字与姓氏是什么?
[Unknown]:
您的组织单位名称是什么?
[Unknown]:
您的组织名称是什么?
[Unknown]:
您所在的城市或区域名称是什么?
[Unknown]:
您所在的州或省份名称是什么?
[Unknown]:
该单位的两字母国家代码是什么
[Unknown]: CN
CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN 正确吗?
[否]: y
输入的主密码
(如果和 keystore 密码相同,按回车):
再次输入新密码:
生成时区配置文件Asia/Shanghai,用交互式命令 tzselect 即可。拷贝该时区文件,覆盖系统本地时区配置
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
进入azkaban web服务器安装目录 conf目录,修改azkaban.properties文件
default.timezone.id=Asia/Shanghai #默认时区,已改为亚洲/上海 默认为美国
database.type=mysql #数据库类型
mysql.port=3306 #端口号
mysql.host=mini1 #数据库连接IP
mysql.database=azkaban #数据库实例名
mysql.user=root #数据库用户名
mysql.password=root #数据库密码
mysql.numconnections=100 #最大连接数
# Jetty服务器属性. 注意:这里的密码必须与刚刚生成keystore的密码一致
jetty.maxThreads=25 #最大线程数
jetty.ssl.port=8443 #Jetty SSL端口
jetty.port=8081 #Jetty端口
jetty.keystore=keystore #SSL文件名
jetty.password=123456 #SSL文件密码
jetty.keypassword=123456 #Jetty主密码 与 keystore文件相同
jetty.truststore=keystore #SSL文件名
jetty.trustpassword=123456 # SSL文件密码
azkaban配置 executor服务器,进入执行服务器安装目录conf,修改azkaban.propertiest
#Azkaban
default.timezone.id=Asia/Shanghai #时区
#数据库设置
database.type=mysql #数据库类型(目前只支持mysql)
mysql.port=3306 #数据库端口号
mysql.host=mini1 #数据库IP地址
mysql.database=azkaban #数据库实例名
mysql.user=root #数据库用户名
mysql.password=root #数据库密码
mysql.numconnections=100 #最大连接数
进入azkaban web服务器conf目录,修改azkaban-users.xml,该配置主要是给用户的登录账号做设置的。
...
"admin" password="admin" roles="admin,metrics" />
"admin" permissions="ADMIN" />
...
启动web服务器和executor服务器
##在azkaban web服务器目录下执行启动命令*************注意:必须在web服务器根目录运行*************
bin/azkaban-web-start.sh
##在executor服务器目录下执行启动命令*************注意:必须在executor服务器根目录运行************
bin/azkaban-executor-start.sh
服务启动后,打开网站https://mini1:8443/index 。azkaban界面由四部分组成:
Azkaban内置的任务类型支持command、java、Pig
创建job描述文件 以.job后缀结尾
#command.job
type=command
command=echo 'hello'
将job资源文件打包成zip文件
zip command.job
通过azkaban的web管理平台创建project并上传job压缩包
多个job形成的工作流,每个job都需要定义好执行的顺序,这里可以使用dependencies属性来配置。
“`
type=command
command=echo “foo”
type=command
dependencies=foo
command=echo “bar”
“`
command.N表示可以执行多个command命令操作。
type=command
command=echo 'start execute'
command.1=/root/apps/hadoop/bin/hdfs dfs -mkdir /azkaban
command.2=/root/apps/hadoop/bin/hdfs dfs -put /root/zk.log /azkaban
还记得MapReduce第一个案例吗,系统为我们实现了一个圆周率计算案例,通过MapReduce的jar包来执行:
hadoop jar /root/apps/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.4.jar pi 10 10
Mr任务依然可以使用command的job类型来执行:
##MR Job
type=command
command=/root/apps/hadoop/bin/hadoop jar /root/apps/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.4.jar pi 10 10
除了支持Hadoop,MapReduce之外,还能支持Hive脚本:
数据库数据
001,zhangsan
002,lisi
003,wangwu
004,zhaoliu
test.sql
use default;
drop table aztest;
create table aztest(id int,name string) row format delimited fields terminated by ',';
load data inpath '/aztest/hiveinput' into table aztest;
create table azres as select * from aztest;
insert overwrite directory '/aztest/hiveoutput' select count(1) from aztest;
hivetest.job:
type=command
command=/root/apps/hive/bin/hive -f "test.sql"