一、概述

1.1 工作流调度系统

        一个完整的数据分析系统,通常都是由大量任务单元组成:
                shell脚本chengx
                java程序
                mapreduce程序
                hive脚本等

各任务单元之间存在时间先后及依赖关系,为了很好的组织起这样的复杂执行计划,需要一个工作流调度系统来调度任务的执行。

        假如,我有这样⼀一个需求,某个业务系统每天产⽣生20G原始数据,每天都要对其进⾏行行处理理,处理理步骤如下所示:
        1)通过hadoop先将原始数据同步到HDFS上;
        2)借助MapReduce原始框架对原始数据进行转换,生成的数据以分区表的形式存储到多张hive表中;
        3)需要对hive中多个表的数据进行join处理,得到一个明细数据hive大表;
        4)将明细数据进行各种统计分析,得到结果报表信息;
        5)需要将统计分析得到的结果数据同步到业务系统中,供业务系统调用使用;

1.2 工作流调度实现方式

        简单的任务调度:直接使用linux的crontab;

        复杂的任务调度:开发调度平台或使用线程的开源调度系统,比如Ooize、Azkaban、Airflow等。

1.3 Azkaban与Oozie对比

        总体来说,Ooize相比Azkaban是一个重量级的任务调度系统,功能全面但配置使用也更复杂(xml)。如果可以不在意某些功能的缺失,轻量级A调度器zkaban是很不错的候选对象。

        功能:
                两者均可调度mapreduce、pig、java、脚本工作流任务;
                两者均可以定时执行工作流任务;

        工作流定义:
                Azkaban使用properties文件定义工作流;
                Oozie使用XML文件定义工作流;

        工作流传参:
                Azkaban支持直接传参,例如${input}
                Ooize支持参数和EL表达式,例如${fs:dirSize(myInputDir)}

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

        资源管理:
                Azkaban有较严格的权限控制,如用户对工作流进行读/写/执行等操作;
                Oozie暂无严格的权限控制;

        工作流执行:
                Azkaban有两种运行模式,分别是solo servermode(executor server和web server部署在同一台节点)和multi server mode(execotor server和web server可以部署在不用节点)
                Oozie作为工作流服务器运行,支持多用户和多工作流;

二、Azkaban介绍

        Azkaban是linkedin(领英)公司推出的一个批量工作流任务调度器,用于在一个工作流内以一个特定的顺序顺序运行一组工作和流程。Azkaban使用job配置文件建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。

        

工作流调度工具 Oozie 排行 流程调度系统_工作流调度工具 Oozie 排行

         Azkaban定义了一种KV文件(properties)格式来建立任务之间的依赖关系。

        有如下功能特点:
                1)web用户界面
                2)方便上传工作流
                3)方便设置任务之间的关系
                4)调度工作流

        架构角色:
                1)MySql服务器:存储元数据,如项目名称、项目描述、项目权限、任务状态、SLA规则等。
                2)AzkabanWebServer:对外提供web服务,是用户可以通过web页面管理。职责包括项目管理、权限授权、任务调度、监控executor。
                3)AzkabanExecotorServer:负责工作流的提交、执行。

三、Azkaban安装部署

3.1 Azkaban的安装准备工作

        1. 编译
             

cd /opt/lagou/software/
                 wget https://github.com/azkaban/azkaban/archive/3.51.0.tar.gz
                 tar -zxvf 3.51.0.tar.gz -C ../servers/
                 cd /opt/lagou/servers/azkaban-3.51.0/
                 yum -y install git
                 yum -y install gcc-c++
                 ./gradlew build installDist -x test
                 Gradle是一个基于Apache Ant和Apache Maven的项目自动化构建工具。-x test 跳过测试。(注意联网下载jar可能会失败、慢)

        2. 上传编译后的安装文件

                在linux122节点创建目录:mkdir /opt/lagou/servers/azkaban

                

工作流调度工具 Oozie 排行 流程调度系统_数据_02

3.2 solo-server模式部署

3.2.1 单服务模式安装

1. 解压
         azkaban 的solo server使⽤用的是一个单节点的模式来进行行启动服务的,只需要一个azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz的安装包即可启动,所有的数据信息都是保存在H2这个azkaban默认的数据当中。
         tar -zxvf azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz -C ../../servers/azkaban        2. 修改配置文件
         修改时区配置文件
         cd /opt/lagou/servers/azkaban-solo-server-0.1.0-SNAPSHOT/conf
         vim azkaban.properties
         default.timezone.id=Asia/Shanghai

        

工作流调度工具 Oozie 排行 流程调度系统_mysql_03

修改commonprivate.properties配置文件
         cd /opt/lagou/servers/azkaban-solo-server-0.1.0-SNAPSHOT/plugins/jobtypes
         vim commonprivate.properties
         execute.as.user=false
         memCheck.enabled=false
         azkaban默认需要3G的内存,剩余内存不足则会报异常。        3. 启动solo-server
         cd /opt/lagou/servers/azkaban-solo-server-0.1.0-SNAPSHOT
         bin/start-solo.sh        4. 浏览器页面访问
         http://linux122:8081/index

    

工作流调度工具 Oozie 排行 流程调度系统_工作流调度工具 Oozie 排行_04

         登录信息:用户名:azkaban   密码:azkaban

3.2.2 单服务模式使用

        需求:使⽤用azkaban调度我们的shell脚本,执⾏行行linux的shell命令。

        具体步骤:

                1)开发job文件,创建普通文本文件foo.job,文件内容如下:

                        type=command

                        command=echo 'hello world'

                2)打成压缩包

                3)上传压缩包到Azkaban

                4)创建project

                

工作流调度工具 Oozie 排行 流程调度系统_linux_05

                 5)指定project名称和描述

                

工作流调度工具 Oozie 排行 流程调度系统_数据_06

                6) Azkaban上传压缩包

                

工作流调度工具 Oozie 排行 流程调度系统_mysql_07

                 

工作流调度工具 Oozie 排行 流程调度系统_数据_08

                 7)查看工作流计划并执行

                

工作流调度工具 Oozie 排行 流程调度系统_mysql_09

                 运行结果页面

                

工作流调度工具 Oozie 排行 流程调度系统_mysql_10

                 8)停止程序:bin/shutdown-solo.sh

3.3 multiple-executor模式部署

        1. 安装所需软件

                Azkaban Web服务安装包:azkaban-web-server-0.1.0-SNAPSHOT.tar.gz

                Azkaban 执行服务安装包:azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz

                sql脚本:

                        

工作流调度工具 Oozie 排行 流程调度系统_大数据_11

                 节点规划:

                        

工作流调度工具 Oozie 排行 流程调度系统_数据_12

     

2. 数据库准备:
                 linux123,进入mysql的客户端执⾏行行以下命令:mysql -uroot -p
                 执行以下命令:
                         SET GLOBAL validate_password_length=5;
                         SET GLOBAL validate_password_policy=0;
                         CREATE USER 'azkaban'@'%' IDENTIFIED BY 'azkaban';
                         grant all privileges on azkaban.* to 'azkaban'@'%' identified by 'azkaban' with grant option;
                         CREATE DATABASE azkaban;
                         use azkaban;
                         #解压数据库脚本
                         tar -zxvf azkaban-db-0.1.0-SNAPSHOT.tar.gz -C /opt/lagou/servers/azkaban
                         source /opt/lagou/servers/azkaban/azkaban-db-0.1.0-SNAPSHOT/create-all-sql-
 0.1.0-SNAPSHOT.sql; #加载初始化sql创建表        3. 配置Azkaban-web-server
                 进⼊入linux122节点,解压azkaban-web-server
                 mkdir /opt/lagou/servers/azkaban
                 tar -zxvf azkaban-web-server-0.1.0-SNAPSHOT.tar.gz –C /opt/lagou/servers/azkaban/                进⼊入azkaban-web-server根目录下
                 cd /opt/lagou/servers/azkaban/azkaban-web-server-0.1.0-SNAPSHOT
                 #⽣生成ssl证书:
                 keytool -keystore keystore -alias jetty -genkey -keyalg RSA

                

工作流调度工具 Oozie 排行 流程调度系统_mysql_13

                 注意:运行行此命令后,会提示输入当前生成keystore的密码及相应信息,输入的密码请记住(所有密码统⼀以azkaban输入)

                

工作流调度工具 Oozie 排行 流程调度系统_大数据_14

              

修改 azkaban-web-server的配置文件
                 cd /opt/lagou/servers/azkaban-web-server-3.51.0/conf
                 vim azkaban.properties
                 # Azkaban Personalization Settings
                 azkaban.name=Test
                 azkaban.label=My Local Azkaban
                 azkaban.color=#FF3601
                 azkaban.default.servlet.path=/index
                 web.resource.dir=web/
                 default.timezone.id=Asia/Shanghai # 时区注意后⾯面不要有空格                # Azkaban UserManager class
                 user.manager.class=azkaban.user.XmlUserManager
                 user.manager.xml.file=conf/azkaban-users.xml                # Azkaban Jetty server properties. 开启使⽤用ssl 并且知道端⼝口
                 jetty.use.ssl=true
                  jetty.port=8443
                 jetty.maxThreads=25                # KeyStore for SSL ssl相关配置 注意密码和证书路路径
                 jetty.keystore=keystore
                 jetty.password=azkaban
                 jetty.keypassword=azkaban
                 jetty.truststore=keystore
                 jetty.trustpassword=azkaban
                 # Azkaban mysql settings by default. Users should configure their own username and password.
                 database.type=mysql
                 mysql.port=3306
                 mysql.host=linux123
                 mysql.database=azkaban
                 mysql.user=root
                 mysql.password=12345678
                 mysql.numconnections=100                #Multiple Executor 设置为false
                 azkaban.use.multiple.executors=true
                 #azkaban.executorselector.filters=StaticRemainingFlowSize,MinimumFreeMemory,CpuStatus
                 azkaban.executorselector.comparator.NumberOfAssignedFlowComparator=1
                 azkaban.executorselector.comparator.Memory=1
                 azkaban.executorselector.comparator.LastDispatched=1
                 azkaban.executorselector.comparator.CpuUsage=1                添加属性:
                 mkdir -p plugins/jobtypes
                 cd plugins/jobtypes/
                 vim commonprivate.properties
                 azkaban.native.lib=false
                 execute.as.user=false
                 memCheck.enabled=false

         4. 配置Azkaban-exec-server

                linux123节点,上传exec安装包到/opt/lagou/software

工作流调度工具 Oozie 排行 流程调度系统_数据_15

             

tar -zxvf azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz –C /opt/lagou/servers/azkaban/
                修改azkaban-exec-server的配置文件
                 cd /opt/lagou/servers/azkaban-exec-server-3.51.0/conf
                 vim azkaban.properties
                 # Azkaban Personalization Settings
                 azkaban.name=Test
                 azkaban.label=My Local Azkaban
                 azkaban.color=#FF3601
                 azkaban.default.servlet.path=/index
                 web.resource.dir=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
                 azkaban.project.dir=projects
                 # Where the Azkaban web server is located
                 azkaban.webserver.url=https://linux122:8443
                 # Azkaban mysql settings by default. Users should configure their own username and password.
                 database.type=mysql
                 mysql.port=3306
                 mysql.host=linux123
                 mysql.database=azkaban
                 mysql.user=root
                 mysql.password=12345678
                 mysql.numconnections=100
                 # Azkaban Executor settings
                 executor.maxThreads=50
                 executor.port=12321
                 executor.flow.threads=30                分发exec-server到linux121节点
                 cd /opt/lagou/servers
                 scp -r azkaban linux121:$PWD

        5. 启动服务

先启动exec-server
                 再启动web-server
                 #启动exec-server
                 bin/start-exec.sh
                 #启动web-server
                 bin/start-web.sh                激活我们的exec-server

                启动webServer之后进程失败消失,可通过安装包根目录下对应启动日志进行排查。

                

工作流调度工具 Oozie 排行 流程调度系统_大数据_16

                 需要⼿手动激活executor

cd /opt/lagou/servers/azkaban/azkaban-exec-server-0.1.0-SNAPSHOT
                 curl -G "linux123:$(<./executor.port)/executor?action=activate" && echo

                访问地址:https://linux122:8443

四、Azkaban使用

4.1 shell command调度

        1)创建job描述文件:vi command.job

type=command
                 command=echo 'hello'

        2)将job资源文件打包成zip文件:zip command.job。通过azkaban的web管理理平台创建project并上传job压缩包

                首先创建Project。

                

工作流调度工具 Oozie 排行 流程调度系统_mysql_17

                 上传zip包

                

工作流调度工具 Oozie 排行 流程调度系统_linux_18

                 启动执⾏行行该job

                

工作流调度工具 Oozie 排行 流程调度系统_数据_19

 4.2 job依赖调度

        创建有依赖关系的多个job描述

第一个job:foo.job
                 type=command
                 command=echo 'foo'
         第二个job:bar.job依赖foo.job
                 type=command
                 dependencies=foo
                 command=echo 'bar'

        将所有job资源文件打到一个zip包中,在azkaban的web管理界面创建工程并上传zip包,启动工作流flow。

4.3 HDFS任务调度

        创建job描述文件,fs.job

type=command
                 command=/opt/lagou/servers/hadoop-2.9.2/bin/hadoop fs -mkdir /azkaban

        将job资源文件打包成zip文件,通过azkaban的web管理平台创建project并上传job压缩包,启动执行该job。

4.4 MapReduce任务调度

        mr任务依然可以使用command的job类型来执行。
        创建job描述文件,及mr程序jar包(示例例中直接使用hadoop自带的example jar)

type=command
                 command=/opt/lagou/servers/hadoop-2.9.2/bin/hadoop jar hadoop-mapreduce-
                 examples-2.9.2.jar wordcount /wordcount/input /wordcount/azout

        将所有job资源⽂文件打到一个zip包中,在azkaban的web管理界⾯面创建工程并上传zip包
启动job。

        遇到虚拟机内存不足情况:
                1. 增大机器内存
                2. 使用清除系统缓存命令,暂时释放一些内存

[root@linux123 mapreduce]# echo 1 >/proc/sys/vm/drop_caches
                         [root@linux123 mapreduce]# echo 2 >/proc/sys/vm/drop_caches
                         [root@linux123 mapreduce]# echo 3 >/proc/sys/vm/drop_caches

4.5 HIVE脚本任务调度

        创建job描述⽂文件和hive脚本

Hive脚本: test.sql
                 use default;
                 drop table aztest;
                 create table aztest(id int,name string) row format delimited fields terminated by ',';        Job描述文件:hivef.job
                 type=command
                 command=/opt/lagou/servers/hive-2.3.7/bin/hive -f 'test.sql'


        将所有job资源文件打到一个zip包中创建工程并上传zip包,启动job。

4.6 定时任务调度

        除了手动立即执行工作流任务外,azkaban也支持配置定时任务调度。开启方式如下:

        首页选择待处理的project

        选择左边schedule表示配置定时调度信息,选择右边execute表示立即执行工作流任务。

        

工作流调度工具 Oozie 排行 流程调度系统_mysql_20