工作流调度器Azkaban的基本架构、运行模式、安装部署和使用案例详解

tech2023-02-22  102

目录

一、准备工作

二、Azkaban介绍

1. 为什么需要工作流调度系统

2. Azkaban介绍

三、Azkaban的基本架构

四、Azkaban的三种运行模式

五、Azkaban的安装部署

1. Azkaban的编译

2. Azkaban两个服务模式安装

六、Azkaban使用场景案例

1. Command类型单一job示例

2. Command类型多job工作流flow

3. HDFS操作任务

4. MAPREDUCE任务

5. HIVE脚本任务

6. Azkaban的定时任务

7. Azkaban的webUI参数传递


一、准备工作

安装VMware15虚拟化软件

安装CentOS 7虚拟机3个

安装3节点的hadoop-2.6.0-cdh5.14.2集群

安装了hive

二、Azkaban介绍

1. 为什么需要工作流调度系统

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

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

例如,我们可能有这样一个需求,某个业务系统每天产生20G原始数据,我们每天都要对其进行处理,处理步骤如下所示:

通过Hadoop先将原始数据同步到HDFS上;借助MapReduce计算框架对原始数据进行转换,生成的数据以分区表的形式存储到多张Hive表中;需要对Hive中多个表的数据进行JOIN处理,得到一个明细数据Hive宽表;将明细数据进行各种统计分析,得到结果报表信息;需要将统计分析得到的结果数据同步到业务系统中,供业务调用使用。

常见的工作流调度实现方式:

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

复杂的任务调度:开发调度平台或使用现成的开源调度系统,比如ooize、azkaban、airflow等。

2. Azkaban介绍

Azkaban是由Linkedin开源的一个批量工作流任务调度器。用于在一个工作流内以一个特定的顺序运行一组工作和流程。

Azkaban官网:https://azkaban.github.io/

Azkaban定义了一种KV文件(properties)格式来建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。

它有如下功能特点:

Web用户界面

方便上传工作流

方便设置任务之间的关系

调度工作流

认证/授权(权限的工作)

能够杀死并重新启动工作流

模块化和可插拔的插件机制

项目工作区

工作流和任务的日志记录和审计

易于开发使用的功能特点:

提供功能清晰、简单易用的web UI界面

提供job配置文件快速建立任务和任务之间的关系

提供模块化的可插拔机制,原生支持command、java、hive、hadoop

基于java开发,代码结构清晰,易于二次开发

三、Azkaban的基本架构

Azkaban由三部分构成

Azkaban Web Server 提供了Web UI,是azkaban的主要管理者,包括 project 的管理,认证,调度,对工作流执行过程的监控等。

Azkaban Executor Server 负责具体的工作流和任务的调度提交

MySQL用于保存项目、日志或者执行计划之类的信息

四、Azkaban的三种运行模式

1. solo server mode(单机模式)

web server 和 executor server运行在一个进程里

最简单的模式,数据库内置的H2数据库,管理服务器和执行服务器都在一个进程中运行,任务量不大项目可以采用此模式。 ​

2. two server mode

web server 和 executor server运行在不同的进程

数据库为mysql,管理服务器和执行服务器在不同进程,这种模式下,管理服务器和执行服务器互不影响。 ​

3. multiple executor mode

web server 和 executor server运行在不同的进程,executor server有多个

该模式下,执行服务器和管理服务器在不同主机上,且执行服务器可以有多个。

五、Azkaban的安装部署

1. Azkaban的编译

我们这里选用Azkaban3.51.0这个版本自己进行重新编译,编译完成之后得到我们需要的安装包进行安装

注意:我们这里编译需要使用jdk1.8的版本来进行编译,如果编译服务器使用的jdk版本是1.7的,记得切换成jdk1.8,我们这里使用的是jdk8u141这个版本来进行编译。

cd /xsluo/soft/ wget https://github.com/azkaban/azkaban/archive/3.51.0.tar.gz tar -zxvf 3.51.0.tar.gz -C ../install/ cd /xsluo/install/azkaban-3.51.0/ yum -y install git yum -y install gcc-c++ ./gradlew build installDist -x test

编译之后需要的安装文件列表如下:

1)azkaban-exec-server

编译完成之后得到我们需要的安装包在以下目录下:azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz

/xsluo/install/azkaban-3.51.0/azkaban-exec-server/build/distributions

2)azkaban-web-server

azkaban-web-server存放目录:azkaban-web-server-0.1.0-SNAPSHOT.tar.gz

/xsluo/install/azkaban-3.51.0/azkaban-web-server/build/distributions

3)azkaban-solo-server

azkaban-solo-server存放目录:azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz

/xsluo/install/azkaban-3.51.0/azkaban-solo-server/build/distributions

4)execute-as-user.c

azkaban two server模式下需要的C程序在这个路径下面:execute-as-user.c

/xsluo/install/azkaban-3.51.0/az-exec-util/src/main/c

 

5)数据库脚本文件

数据库脚本文件在这个路径下面:create-all-sql-0.1.0-SNAPSHOT.sql

/xsluo/install/azkaban-3.51.0/azkaban-db/build/install/azkaban-db

 

2. Azkaban两个服务模式安装

1)确认所需软件

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

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

编译之后的sql脚本:create-all-sql-0.1.0-SNAPSHOT.sql

C程序文件脚本:execute-as-user.c 程序

[hadoop@node03 ~]$ ll /xsluo/soft/ total 497824 -rw-rw-r-- 1 hadoop hadoop 15762347 Aug 31 11:44 azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz -rw-rw-r-- 1 hadoop hadoop 23877900 Aug 31 11:45 azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz -rw-rw-r-- 1 hadoop hadoop 20009071 Aug 31 11:45 azkaban-web-server-0.1.0-SNAPSHOT.tar.gz -rw-rw-r-- 1 hadoop hadoop 11990 Aug 31 11:45 create-all-sql-0.1.0-SNAPSHOT.sql -rw-rw-r-- 1 hadoop hadoop 3976 Aug 31 11:45 execute-as-user.c

2)数据库准备

进入mysql的客户端执行以下命令

 

mysql -uroot -p -- 设置密码的验证强度等级 set global validate_password_policy=LOW; set global validate_password_length=6; ​ CREATE DATABASE azkaban; CREATE USER 'azkaban'@'%' IDENTIFIED BY 'azkaban';   GRANT all privileges ON azkaban.* to 'azkaban'@'%' identified by 'azkaban' WITH GRANT OPTION; flush privileges; use azkaban; source /xsluo/soft/create-all-sql-0.1.0-SNAPSHOT.sql;

3)解压软件安装包

解压azkaban-web-server

cd /xsluo/soft tar -zxvf azkaban-web-server-0.1.0-SNAPSHOT.tar.gz -C ../install/ cd /xsluo/install mv azkaban-web-server-0.1.0-SNAPSHOT/ azkaban-web-server-3.51.0

解压azkaban-exec-server

cd /xsluo/soft tar -zxvf azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz -C ../install/ cd /xsluo/install mv azkaban-exec-server-0.1.0-SNAPSHOT/ azkaban-exec-server-3.51.0

4)安装SSL安全认证

安装ssl安全认证,允许我们使用https的方式访问我们的azkaban的web服务;

密码一定要一个个的字母输入,或者粘贴也行

cd /xsluo/install/azkaban-web-server-3.51.0 keytool -keystore keystore -alias jetty -genkey -keyalg RSA

密码一直输入azkaban

5)azkaban web server安装

修改azkaban-web-server的配置文件

cd /xsluo/install/azkaban-web-server-3.51.0/conf vim azkaban.properties # Azkaban Personalization Settings azkaban.name=Azkaban azkaban.label=My 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 # Velocity dev mode velocity.dev.mode=false # Azkaban Jetty server properties. jetty.use.ssl=true jetty.maxThreads=25 jetty.port=8081 jetty.ssl.port=8443 jetty.keystore=/xsluo/install/azkaban-web-server-3.51.0/keystore jetty.password=azkaban jetty.keypassword=azkaban jetty.truststore=/xsluo/install/azkaban-web-server-3.51.0/keystore jetty.trustpassword=azkaban # Azkaban Executor settings # mail settings mail.sender= mail.host= # User facing web server configurations used to construct the user facing server URLs. They are useful when there is a reverse proxy between Azkaban web install and users. # enduser -> myazkabanhost:443 -> proxy -> localhost:8081 # when this parameters set then these parameters are used to generate email links. # if these parameters are not set then jetty.hostname, and jetty.port(if ssl configured jetty.ssl.port) are used. # azkaban.webserver.external_hostname=myazkabanhost.com # azkaban.webserver.external_ssl_port=443 # azkaban.webserver.external_port=8081 job.failure.email= job.success.email= lockdown.create.projects=false cache.directory=cache # JMX stats jetty.connector.stats=true executor.connector.stats=true # Azkaban mysql settings by default. Users should configure their own username and password. database.type=mysql mysql.port=3306 mysql.host=node03 mysql.database=azkaban mysql.user=azkaban mysql.password=azkaban mysql.numconnections=100 #Multiple Executor 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 azkaban.activeexecutor.refresh.milisecinterval=10000 azkaban.queueprocessing.enabled=true azkaban.activeexecutor.refresh.flowinterval=10 azkaban.executorinfo.refresh.maxThreads=10

6)azkaban executor server 安装

第一步:修改azkaban-exex-server配置文件

cd /xsluo/install/azkaban-exec-server-3.51.0/conf vim azkaban.properties # Azkaban Personalization Settings azkaban.name=Azkaban azkaban.label=My 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 # Velocity dev mode velocity.dev.mode=false # Azkaban Jetty server properties. jetty.use.ssl=true jetty.maxThreads=25 jetty.port=8081 #注意 添加如下5行内容 jetty.keystore=/xsluo/install/azkaban-web-server-3.51.0/keystore jetty.password=azkaban jetty.keypassword=azkaban jetty.truststore=/xsluo/install/azkaban-web-server-3.51.0/keystore jetty.trustpassword=azkaban # Where the Azkaban web server is located azkaban.webserver.url=https://node03:8443 # mail settings mail.sender= mail.host= # User facing web server configurations used to construct the user facing server URLs. They are useful when there is a reverse proxy between Azkaban web install and users. # enduser -> myazkabanhost:443 -> proxy -> localhost:8081 # when this parameters set then these parameters are used to generate email links. # if these parameters are not set then jetty.hostname, and jetty.port(if ssl configured jetty.ssl.port) are used. # azkaban.webserver.external_hostname=myazkabanhost.com # azkaban.webserver.external_ssl_port=443 # azkaban.webserver.external_port=8081 job.failure.email= job.success.email= lockdown.create.projects=false cache.directory=cache # JMX stats jetty.connector.stats=true executor.connector.stats=true # Azkaban plugin settings azkaban.jobtype.plugin.dir=plugins/jobtypes # Azkaban mysql settings by default. Users should configure their own username and password. database.type=mysql mysql.port=3306 mysql.host=node03 mysql.database=azkaban mysql.user=azkaban mysql.password=azkaban mysql.numconnections=100 # Azkaban Executor settings executor.maxThreads=50 executor.flow.threads=30

第二步:添加插件

将我们编译后的C文件execute-as-user.c上传到这个目录来/xsluo/install/azkaban-exec-server-3.51.0/plugins/jobtypes或者直接将我们/xsluo/soft下面的文件拷贝过来也行

cp /xsluo/soft/execute-as-user.c /xsluo/install/azkaban-exec-server-3.51.0/plugins/jobtypes/

然后执行以下命令生成execute-as-user

sudo yum -y install gcc-c++ cd /xsluo/install/azkaban-exec-server-3.51.0/plugins/jobtypes gcc execute-as-user.c -o execute-as-user sudo chown root execute-as-user sudo chmod 6050 execute-as-user

备注:假如用数字表示的权限为6050,那对应的字母表示是什么呢?第一数字个表示的是特殊权限6 = 4 + 2,即同时设置了SUID和SGID,第二个数字表示的所有者权限为0,字母表示为---,因为没有设置x权限,特殊权限表示为大写字母S,在第三个数字为5 =4 + 1,设置了用户组权限为读(r)和执行(x),特殊权限表示为小写字母s,第四个数字为0,字母表示为---。综合起来即为---Sr-s---,例如:

[hadoop@node03 jobtypes]$ sudo chmod 6050 execute-as-user [hadoop@node03 jobtypes]$ ll total 24 -rw-rw-r-- 1 hadoop hadoop 44 Aug 9 2018 commonprivate.properties ---Sr-s--- 1 root hadoop 13688 Sep 3 16:18 execute-as-user -rw-rw-r-- 1 hadoop hadoop 3976 Sep 3 16:13 execute-as-user.c

第三步:修改配置文件

修改配置文件

cd /xsluo/install/azkaban-exec-server-3.47.0/plugins/jobtypes vim commonprivate.properties

内容如下

execute.as.user=false memCheck.enabled=false azkaban.native.lib=/xsluo/install/azkaban-exec-server-3.51.0/plugins/jobtypes

最终生成如下

7)启动服务

第一步:启动 azkaban exec server

cd /xsluo/install/azkaban-exec-server-3.51.0 bin/start-exec.sh [hadoop@node03 azkaban-exec-server-3.51.0]$ jps 3393 AzkabanExecutorServer 3433 Jps

第二步:激活 exec-server

node03机器任意目录下执行以下命令 curl -G "node03:$(<./executor.port)/executor?action=activate" && echo [hadoop@node03 azkaban-exec-server-3.51.0]$ curl -G "node03:$(<./executor.port)/executor?action=activate" && echo {"status":"success"}

第三步:启动 azkaban-web-server

cd /xsluo/install/azkaban-web-server-3.51.0/ bin/start-web.sh ​ [hadoop@node03 azkaban-web-server-3.51.0]$ jps 3393 AzkabanExecutorServer 3498 Jps 3468 AzkabanWebServer

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

用户名和密码都是azkaban

8)修改linux的时区问题

由于先前做好了时钟同步,所以不用担心时区问题,不需要修改时区了

注:先配置好服务器节点上的时区

先生成时区配置文件Asia/Shanghai,用交互式命令 tzselect 即可拷贝该时区文件,覆盖系统本地时区配置 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

六、Azkaban使用场景案例

Azkaba内置的任务类型支持command、java

1. Command类型单一job示例

1)创建job描述文件

创建文本文件,更改名称为mycommand.job

注意后缀.txt一定不要带上,保存为格式为UFT-8

内容如下

type=command command=echo 'hello world'    

2)将job资源文件打包成zip文件

3)创建project,并上传压缩包

通过azkaban的web管理平台创建project并上传job压缩包

首先创建project

上传zip包

4)启动执行job

2. Command类型多job工作流flow

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

第一个job:foo.job

type=command command=echo 'foo'

第二个job:bar.job依赖foo.job

type=command command=echo 'bar'

第三个job:stop.job,依赖于foo.job,以及bar.job

#stop.job type=command dependencies=foo,bar command=echo "stop job"

将所有job资源文件打到一个zip包中

在azkaban的web管理界面创建工程并上传zip包

启动工作流flow

3. HDFS操作任务

1)创建job描述文件fs.job

#fs.job type=command command=echo "start execute" command.1=/xsluo/install/hadoop-2.6.0-cdh5.14.2/bin/hdfs dfs -mkdir /azkaban command.2=/xsluo/install/hadoop-2.6.0-cdh5.14.2/bin/hdfs dfs -put /home/hadoop/nohup.out /azkaban

2)将job资源文件打包成zip文件

3)通过azkaban的web管理平台创建project并上传job压缩包

4)启动执行该job,并查看结果:

4. MAPREDUCE任务

Mr任务依然可以使用command的job类型来执行

创建job描述文件,及mr程序jar包(示例中直接使用hadoop自带的example jar)

type=command command=/xsluo/install/hadoop-2.6.0-cdh5.14.2/bin/hadoop jar /xsluo/install/hadoop-2.6.0-cdh5.14.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.14.2.jar pi 3 5

将所有job资源文件打到一个zip包中

在azkaban的web管理界面创建工程并上传zip包

启动job,并查看结果:

5. HIVE脚本任务

创建job描述文件和hive脚本

Hive脚本: hive.sql

create database if not exists azhive; use azhive; create table if not exists aztest(id string,name string) row format delimited fields terminated by '\t';

Job描述文件:hive.job

type=command command=/xsluo/install/hive-1.1.0-cdh5.14.2/bin/hive -f 'hive.sql'

将所有job资源文件打到一个zip包中

在azkaban的web管理界面创建工程并上传zip包

启动job,并查看结果:

0: jdbc:hive2://node03:10000> show databases; +----------------+--+ | database_name | +----------------+--+ | azhive | | course | | default | | game_center | | hive_explode | | xsluo| | sqooptohive | +----------------+--+ 7 rows selected (0.045 seconds) 0: jdbc:hive2://node03:10000> use azhive; 0: jdbc:hive2://node03:10000> show tables; +-----------+--+ | tab_name | +-----------+--+ | aztest | +-----------+--+ 1 row selected (0.046 seconds)

6. Azkaban的定时任务

使用azkaban的scheduler功能可以实现对我们的作业任务进行定时调度功能

*/1 * ? * * 每分钟执行一次定时调度任务 0 1 ? * * 每天晚上凌晨一点钟执行这个任务 0 */2 ? * * 每隔两个小时定时执行这个任务 30 21 ? * * 每天晚上九点半定时执行这个任务

7. Azkaban的webUI参数传递

可以通过webUI动态给job传递参数

1)创建一个job的描述文件

parameter.job

#parameter.job type=command parameter=${param} command= echo ${parameter}

其中

${param} 表示解析页面传递的参数param的值,通过声明一个变量parameter去接受

${parameter}表示获取该parameter变量的值

2)将job资源文件打包成zip文件

parameter.zip

3)创建工程,上传zip包,最后启动工作流,并且设置参数

4)运行完成后的结果

 

最新回复(0)