什么是Azkaban
Azkaban是由Linkedin公司推出的一个批量工作流任务调度器,主要用于在一个工作流内以一个特定的顺序运行一组工作和流程,它的配置是通过简单的key:value对的方式,通过配置中的dependencies 来设置依赖关系。Azkaban使用job配置文件建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。
Azkaban特点
1) 兼容任何版本的hadoop
2) 易于使用的Web用户界面
3) 简单的工作流的上传
4) 方便设置任务之间的关系
5) 调度工作流
6) 模块化和可插拔的插件机制
7) 认证/授权(权限的工作)
8) 能够杀死并重新启动工作流
9) 有关失败和成功的电子邮件提醒
Azkaban架构
1) AzkabanWebServer:AzkabanWebServer是整个Azkaban工作流系统的主要管理者,它用户登录认证、负责project管理、定时执行工作流、跟踪工作流执行进度等一系列任务。
2) AzkabanExecutorServer:负责具体的工作流的提交、执行,它们通过mysql数据库来协调任务的执行。
3) 关系型数据库(MySQL):存储大部分执行流状态,AzkabanWebServer和AzkabanExecutorServer都需要访问数据库。
Azkaban安装配置
下载
下载如下文件 放入/opt/module/azkaban目录中
azkaban-web-server-2.5.0.tar.gz azkaban-executor-server-2.5.0.tar.gz azkaban-sql-script-2.5.0.tar.gz mysql-libs.zip
选择Mysql作为Azkaban数据库,因为Azkaban建立了一些Mysql连接增强功能,以方便Azkaban设置,并增强服务可靠性。
安装
将下载的压缩文件依次解压
tar -zxvf azkaban-web-server-2.5.0.tar.gz tar -zxvf azkaban-executor-server-2.5.0.tar.gz tar -zxvf azkaban-sql-script-2.5.0.tar.gz
重命名
mv azkaban-web-server-2.5.0.tar.gz server mv azkaban-executor-server-2.5.0.tar.gz executor
[root@hadoop001 azkaban]# ls azkaban-2.5.0 executor server
azkaban脚本导入
在mysql中创建azkaban需要的数据库、表
mysql> create database azkaban; mysql> use azkaban; mysql> source /opt/module/azkaban/azkaban-2.5.0/create-all-sql-2.5.0.sql
生成秘钥库
[root@hadoop001 azkaban]$ keytool -keystore keystore -alias jetty -genkey -keyalg RSA 输入密钥库口令: 再次输入新口令: 您的名字与姓氏是什么? [Unknown]: 您的组织单位名称是什么? [Unknown]: 您的组织名称是什么? [Unknown]: 您所在的城市或区域名称是什么? [Unknown]: 您所在的省/市/自治区名称是什么? [Unknown]: 该单位的双字母国家/地区代码是什么? [Unknown]: CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown是否正确? [否]: y 输入 <jetty> 的密钥口令 (如果和密钥库口令相同, 按回车): 再次输入新口令:
将秘钥文件放入server
[root@hadoop001 azkaban]$ mv keystore /opt/module/azkaban/server/
时间同步设置
如果在/usr/share/zoneinfo/这个目录下不存在时区配置文件Asia/Shanghai,就要用 tzselect生成。
拷贝该时区文件,覆盖系统本地时区配置
[root@hadoop001 azkaban]$ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
集群时间同步(同时发给三个窗口)
[root@hadoop001 azkaban]$ ntpdate -u ntp.api.bz
配置
配置azkaban.properties文件
[root@hadoop101 conf]$ pwd /opt/module/azkaban/server/conf [root@hadoop101 conf]$ vim azkaban.properties
#Azkaban Personalization Settings #服务器UI名称,用于服务器上方显示的名字 azkaban.name=Test #描述 azkaban.label=My Local Azkaban #UI颜色 azkaban.color=#FF3601 #访问WEB页面默认的根路径 azkaban.default.servlet.path=/index #默认web server存放web文件的目录 web.resource.dir=/opt/module/azkaban/server/web/ #默认时区,已改为亚洲/上海 默认为美国 default.timezone.id=Asia/Shanghai #Azkaban UserManager class #用户管理使用的类 user.manager.class=azkaban.user.XmlUserManager #用户权限管理默认类(绝对路径) user.manager.xml.file=/opt/module/azkaban/server/conf/azkaban-users.xml #Loader for projects #global配置文件所在位置(绝对路径) executor.global.properties=/opt/module/azkaban/executor/conf/global.properties #项目保存路径 azkaban.project.dir=projects #数据库类型 database.type=mysql #端口号 mysql.port=3306 #数据库连接IP mysql.host=hadoop101 #数据库实例名 mysql.database=azkaban #数据库用户名 mysql.user=root #数据库密码 mysql.password=000000 #最大连接数 mysql.numconnections=100 # Velocity dev mode velocity.dev.mode=false # Azkaban Jetty server properties. # Jetty服务器属性. #最大线程数 jetty.maxThreads=25 #Jetty SSL端口 jetty.ssl.port=8443 #Jetty端口 jetty.port=8081 #SSL文件名(绝对路径) jetty.keystore=/opt/module/azkaban/server/keystore #SSL文件密码 jetty.password=000000 #Jetty主密码与keystore文件相同 jetty.keypassword=000000 #SSL文件名(绝对路径) jetty.truststore=/opt/module/azkaban/server/keystore #SSL文件密码 jetty.trustpassword=000000 # Azkaban Executor settings executor.port=12321 # mail settings mail.sender= mail.host= job.failure.email= job.success.email= lockdown.create.projects=false cache.directory=cache
web服务器用户配置
<user username="admin" password="admin" roles="admin,metrics" />
执行服务器配置
修改executor的azkaban.properties
[root@hadoop101 conf]$ pwd /opt/module/azkaban/executor/conf [root@hadoop101 conf]$ vim azkaban.properties
#Azkaban #时区 default.timezone.id=Asia/Shanghai # Azkaban JobTypes Plugins #jobtype 插件所在位置 azkaban.jobtype.plugin.dir=plugins/jobtypes #Loader for projects executor.global.properties=/opt/module/azkaban/executor/conf/global.properties azkaban.project.dir=projects database.type=mysql mysql.port=3306 mysql.host=hadoop101 mysql.database=azkaban mysql.user=root mysql.password=000000 mysql.numconnections=100 # Azkaban Executor settings #最大线程数 executor.maxThreads=50 #端口号(如修改,请与web服务中一致) executor.port=12321 #线程数 executor.flow.threads=30
启动服务
开启executor服务器
[root@hadoop101 executor]$ pwd /opt/module/azkaban/executor [root@hadoop101 executor]$ bin/azkaban-executor-start.sh
开启web服务器
[root@hadoop101 server]$ pwd /opt/module/azkaban/server [root@hadoop101 server]$ bin/azkaban-web-start.sh
注:需要依次启动
查看进程
[root@hadoop101 server]$ jps 3601 AzkabanExecutorServer 5880 Jps 3661 AzkabanWebServer
浏览器访问
访问https://服务器IP地址:8443到达azkaban控制台
Azkaban实例
单一Job任务
创建Job描述文件
[root@hadoop001 jobs]$ vim first.job #first.job type=command command=echo 'this is first job'
将Job资源打包成zip文件
zip first.zip first.job
注:Azkaban上传的工作流文件只支持XXX.zip文件。
zip文件中应包含xxx.job运行作业所需的文件和任何文件(文件后缀必须是.job)
作业名称在项目中必须是唯一的。
通过Azkaban的web管理平台创建project并上传job的zip包。
启动
点击执行
点击继续
执行成功
多Job工作流
创建有依赖关系的多个job描述
start.job
[root@hadoop101 jobs]$ vim start.job #start.job type=command command=touch /opt/module/az.txt
step1.job
[root@hadoop101 jobs]$ vim step1.job #step1.job type=command dependencies=start command=echo "this is step1 job"
step2.job
[root@hadoop101 jobs]$ vim step2.job #step2.job type=command dependencies=start command=echo "this is step2 job"
finish.sh
[root@hadoop101 jobs]$ vim finish.job #finish.job type=command dependencies=step1,step2 command=echo "this is finish job"
将所有job资源文件打包到一个zip包中
zip jobs.zip start.job step1.job step2.job finish.job
上传执行,查看结果
job会根据依赖关系依次执行。
java操作任务
以向文件/opt/module/azkaban/output.txt文件中输出信息为例。
编写java程序
import java.io.IOException; public class AzkabanTest { public void run() throws IOException { FileOutputStream fos = new FileOutputStream("/opt/module/azkaban/output.txt"); fos.write("azkaban java progress".getBytes()); fos.close(); } public static void main(String[] args) throws IOException { AzkabanTest azkabanTest = new AzkabanTest(); azkabanTest.run(); } }
将java程序打包成jar包,在azkaban下创建lib目录,将jar包放入lib目录中
编写job文件
[root@hadoop101 jobs]$ vim azkabanJava.job #azkabanJava.job type=javaprocess java.class=com.bigdata.azkaban.AzkabanTest classpath=/opt/module/azkaban/lib/*
将job文件打包成zip文件
MapReduce任务
将MapReduce程序打包放在/opt/module/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar
创建job文件
[root@hadoop101 jobs]$ vim mapreduce.job #mapreduce job type=command command=/opt/module/hadoop-2.7.2/bin/hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /wordcount/input /wordcount/output
Hive任务
编写Hive脚本
[root@hadoop101 jobs]$ vim student.sql use default; drop table student; create table student(id int, name string) row format delimited fields terminated by '\t'; load data local inpath '/opt/module/datas/student.txt' into table student; insert overwrite local directory '/opt/module/datas/student' row format delimited fields terminated by '\t' select * from student;
编写job文件
[root@hadoop101 jobs]$ vim hive.job #hive job type=command command=/opt/module/hive/bin/hive -f /opt/module/azkaban/jobs/student.sql