1.为什么需要工作流调度系统 1 2 3 4 一个完成的数据分析系统通常是由大量任务单元组成 shell脚本程序,java程序,mapreduce程序、hive脚本等 各任务单元之间存在时间先后及前后依赖关系 为了很好地组织起这样的复杂执行计划,需要一个工作流调度系统来调度执行
1 2 3 4 5 6 例如:我们可能有这样一个需求,某个业务系统每天产生20G原始数据,我们每天都要对其进行处理 1、通过Hadoop先将原始数据同步到HDFS上 2、借助MapReduce计算框架对原始数据进行转换,生成数据以分区表的形式存储到多张Hive表中 3、需要对Hive中多个表的数据进行JOIN处理,得到一个明细数据Hive大表 4、将明细数据进行复杂的统计分析,得到结果报表信息 5、需要将统计分析得到的结果数据同步到业务系统中,供业务调用使用
2.工作流调度实现方式 1 2 3 简单的任务调度:直接使用linux的crontab来定义 复杂的任务调度:开发调度平台 或使用现成的开源调度系统,比如ooize、azkaban等
3.常见工作流调度系统 1 2 市面上目前有愈多工作流调度器 在hadoop领域,常见的工作流调度器有Oozie,Azkaban,Cascading,Hamake等
4.Azkaban介绍 1 2 Azkaban是由Kinkedin开源的一个批量工作流任务调度器。用于在一个工作流内以一个特定的顺序运行一组工作和流程。 Azkaban定义了一种KV文件格式来建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流
1 2 3 4 5 6 7 8 9 10 它有如下功能特点: 1、Web用户界面 2、方便上传工作流 3、方便设置任务之间的关系 4、调度工作流 5、认证/授权(权限的工作) 6、能够杀死并重新启动工作流 7、模块化和可插拔的插件机制 8、项目工作区 9、工作流和任务的日志记录和审计
5.Azkaban安装部署 5.1.准备工作 1 2 3 4 Azkaban Web服务器 azkaban-web-server-2.5.0.tar.gz Azkaban执行服务器 azkaban-executor-server-2.5.0.tar.gz
1 2 3 4 5 MySQL 目前azkaban只支持mysql,需安装mysql服务器, 本文档中默认已安装好mysql服务器,并建立了root用户,密码123456 下载地址:http://azkaban.github.io/downloads.html
5.1.Azkaban安装 1 2 将安装文件上传到集群,最好上传到安装 hive、sqoop的机器上,方便命令的执行 在当前用户目录下新建 azkabantools目录,用于存放源安装文件.新建azkaban目录,用于存放azkaban运行程序
5.1.1.Azkaban web服务器安装 解压azkaban-web-server-2.5.0.tar.gz
5.1.2.azkaban执行服器安装 解压azkaban-executor-server-2.5.0.tar.gz
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [root@node02 software] [root@node02 modules] total 32 drwxr-xr-x. 7 root root 4096 Jan 25 13:31 azkaban-executor-2.5.0 drwxr-xr-x. 8 root root 4096 Jan 25 13:30 azkaban-web-2.5.0 drwxr-xr-x. 9 matrix matrix 4096 Jan 7 13:44 elasticsearch-2.4.2 drwxr-xr-x. 8 root root 4096 Jan 24 18:58 flume-1.6.0 drwxr-xr-x. 12 matrix matrix 4096 Jan 23 21:00 hadoop-2.5.1 drwxr-xr-x. 8 root root 4096 Jan 23 18:43 hive-1.2.1 drwxr-xr-x. 3 matrix matrix 4096 Dec 19 16:01 journalnode drwxr-xr-x. 12 matrix matrix 4096 Dec 17 21:20 zookeeper [root@node02 modules] [root@node02 modules] [root@node02 modules] [root@node02 modules]
5.1.3.azkaban脚本导入
5.1.3.1.azkaban脚本导入
1 2 3 4 5 mysql> create database azkanban; Query OK, 1 row affected (0.07 sec) mysql> use azkanban; Database changed mysql> source /opt/modules/azkaban-2.5.0/create-all-sql-2.5.0.sql;
5.1.4.创建SSL配置 1 2 Azkanban Web页面使用https来访问的 参考地址: http://docs.codehaus.org/display/JETTY/How+to+configure+SSL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [root@node02 ~] 运行此命令后,会提示输入当前生成 keystor的密码及相应信息,输入的密码请劳记,信息如下: 输入keystore密码: 123456 再次输入新密码: 123456 您的名字与姓氏是什么?不填 [Unknown]: 您的组织单位名称是什么? [Unknown]: 您的组织名称是什么? [Unknown]: 您所在的城市或区域名称是什么? [Unknown]: 您所在的州或省份名称是什么? [Unknown]: 该单位的两字母国家代码是什么 [Unknown]: CN CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN 正确吗? [否]: y 输入<jetty>的主密码123456 (如果和 keystore 密码相同,按回车): 再次输入新密码:123456
1 2 3 4 5 6 7 8 [root@node02 ~] total 44 -rw-------. 1 root root 1101 Dec 13 08:20 anaconda-ks.cfg -rw-r--r--. 1 root root 8815 Dec 13 08:20 install.log -rw-r--r--. 1 root root 3384 Dec 13 08:17 install.log.syslog -rw-r--r--. 1 root root 2234 Jan 25 13:55 keystore -rw-r--r--. 1 root root 19046 Jan 23 20:35 zookeeper.out
5.1.4.1.创建SSL配置将keystore拷贝到azkaban web服务器根目录中
1 2 3 配置文件 注:先配置好服务器节点上的时区 1、先生成时区配置文件Asia/Shanghai,用交互式命令tzselect即可
1 2 3 4 5 [root@node02 ~] cp: overwrite `/etc/localtime'? y [root@node02 ~]# scp -r /usr/share/zoneinfo/Asia/Shanghai root@node01:/etc/localtime [root@node02 ~]# scp -r /usr/share/zoneinfo/Asia/Shanghai root@node03:/etc/localtime 100% 388 0.4KB/s 00:00 [root@node02 ~]# scp -r /usr/share/zoneinfo/Asia/Shanghai root@node04:/etc/localtime 100% 388 0.4KB/s 00:00
5.1.4.2.azkaban web服务器配置 1 2 进入azkaban web服务器安装目录 conf目录 修改azkaban.properties文件
1 2 3 4 5 [root@node02 ~] [root@node02 modules] [root@node02 azkaban] [root@node02 webserver] [root@node02 conf]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 azkaban.name=Test azkaban.label=My Local Azkaban azkaban.color= azkaban.default.servlet.path=/index web.resource.dir=web/ default.timezone.id=Asia/Shanghai user.manager.class=azkaban.user.XmlUserManager user.manager.xml.file=conf/azkaban-users.xml executor.global.properties=conf/global.properties azkaban.project.dir=projects database.type=mysql mysql.port=3306 mysql.host=localhost mysql.database=azkanban mysql.user=root mysql.password=123456 mysql.numconnections=100 velocity.dev.mode=false jetty.maxThreads=25 jetty.ssl.port=8443 jetty.port=8081 jetty.keystore=keystore jetty.password=123456 jetty.keypassword=123456 jetty.truststore=keystore jetty.trustpassword=123456 executor.port=12321 mail.sender=xxxxxxxx@163.com mail.host=smtp.163.com 发送邮箱smtp地址 mail.user=xxxxxxxx mail.password=********** job.failure.email=xxxxxxxx@163.com job.success.email=xxxxxxxx@163.com lockdown.create.projects=false cache.directory=cache
5.1.4.3.用户配置
1 2 3 4 5 6 7 <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 >
5.1.4.4.azkaban执行服务器executor配置 1 2 3 [root@node02 azkaban] [root@node02 conf]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 default.timezone.id=Asia/Shanghai azkaban.jobtype.plugin.dir=plugins/jobtypes executor.global.properties=conf/global.properties azkaban.project.dir=projects database.type=mysql mysql.port=3306 mysql.host=localhost mysql.database=azkanban mysql.user=root mysql.password=123456 mysql.numconnections=100 executor.maxThreads=50 executor.port=12321 executor.flow.threads=30
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 default.timezone.id=Asia/Shanghai azkaban.jobtype.plugin.dir=plugins/jobtypes executor.global.properties=conf/global.properties azkaban.project.dir=projects database.type=mysql mysql.port=3306 mysql.host=localhost mysql.database=azkanban mysql.user=root mysql.password=123456 mysql.numconnections=100 executor.maxThreads=50 executor.port=12321 executor.flow.threads=30
5.1.5.启动azkaban 1 2 3 4 1.确认Hadoop集群/(hdfs、yarn、zookeeper)是否启动 2.在azkaban web服务器目录下执行启动命令 [root@node02 ~] [root@node02 webserver]
1 2 3 注:在web服务器根目录运行 或者启动到后台 nohup bin/azkaban-web-start.sh 1>/tmp/azstd.out 2>/tmp/azerr.out &
1 2 3 4 3.执行服务器 在执行服务器目录下执行启动命令 [root@node02 executor] 注:只能要执行服务器根目录运行
[root@node02 ~]# jps 1610 QuorumPeerMain 1670 DataNode 2296 AzkabanWebServer 2312 AzkabanExecutorServer 1725 JournalNode 2378 Jps
5.1.6.在浏览器查看Azkaban Web UI 1 2 3 4 启动完成后,在浏览器(建议使用谷歌浏览器)中输入https://服务器IP地址:8443 , 即可访问azkaban服务了.在登录中输入刚才新的用户名及密码(均为admin),点击login. https://192.168.230.11:8443/
6.Azkaban实战 1 Azkaba内置的任务类型支持command 、java
6.1.Command类型单一job示例 6.1.1.创建job描述文件 1 2 3 4 [root@node02 ~] type =command command =echo 'hello'
6.1.2.将job资源文件打包成zip文件
6.1.3.通过azkaban的web管理平台创建project并上传job压缩包
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 上传zip包 ```        ```bash 第一个job:foo.job type =command command =echo foo第二个job:bar.job依赖foo.job type =command dependencies=foo command =echo bar
6.2.2.将所有job资源文件打到一个zip包中
6.2.3.在azkaban的web管理界面创建工程并上传zip包
6.2.4.启动工作流flow