基于Azkaban的任务定时调度实践

本文由云+社区发表html

做者:maxluojava

1、Azkaban介绍

Azkaban是LinkedIn开源的任务调度框架,相似于JavaEE中的JBPM和Activiti工做流框架。node

Azkaban功能和特色:linux

1,任务的依赖处理。c++

2,任务监控,失败告警。git

3,任务流的可视化。github

4,任务权限管理。web

常见的任务调度框架有Apache Oozie、LinkedIn Azkaban、Apache Airflow、Alibaba Zeus,因为Azkaban具备轻量可插拔、友好的WebUI、SLA告警、完善的权限控制、易于二次开发等优势,也获得了普遍应用。下图为Azkaban的架构图,主要有三部分组成:Azkaban Webserver、Azkaban Executor、 DB。sql

img

Webserver主要负责权限验证、项目管理、做业流下发等工做;shell

Executor主要负责做业流/做业的具体执行以及搜集执行日志等工做;

MySQL用于存储做业/做业流的执行状态信息。图中所示的是单executor场景,可是实际应用中大部分的项目使用的都是多executor场景。

img

1.1 做业流执行过程

Azkaban webserver会根据搜集起来的Executor的状态选择一个合适的任务运行节点,并将任务推送给该节点,管理并运行该工做流的全部job。

1.2 部署模式

Azkaban支持三种部署模式,分别用于学习和测试,高可用部署方式。

solo-server模式

DB使用的是一个内嵌的H2,Web Server和Executor Server运行在同一个进程里。这种模式包含Azkaban的全部特性,但通常用来学习和测试。

two-server模式

DB使用的是MySQL,MySQL支持master-slave架构,Web Server和Executor Server运行在不一样的进程中。

分布式multiple-executor模式

DB使用的是MySQL,MySQL支持master-slave架构,Web Server和Executor Server运行在不一样机器上,且有多个Executor Server。

1.3 编译部署
编译环境
yum install git 

yum install gcc-c++

yum install java-1.8.0-openjdk-devel
复制代码
下载源码&解压
mkdir –p /data/azkaban/install

cd /data/azkaban

wget https://github.com/azkaban/azkaban/archive/3.42.0.tar.gz

mv 3.42.0.tar.gz azkaban-3.42.0.tar.gz

tar -zxvf azkaban-3.42.0.tar.gz
复制代码
编译
cd azkaban-3.42.0

./gradlew build installDist -x test
复制代码
solo-server模式部署

下面为了部署测试简单,采用solo-server模式进行部署。

cd /data/azkaban/install tar -zxvf ../azkaban-3.42.0/azkaban-solo-server/build/distributions/azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz -C .
复制代码
修改时区
cd /data/azkaban/install/azkaban-solo-server-0.1.0-SNAPSHOT

tzselect #选择Asia/Shanghai

vim ./conf/azkaban.properties

default.timezone.id=Asia/Shanghai #修改时区
复制代码
启动
./bin/azkaban-solo-start.sh
复制代码

注:启动/关闭必须进到/data/azkaban/install/azkaban-solo-server-0.1.0-SNAPSHOT/目录。

登陆

http://ip:port/

监听端口具体见配置./conf/azkaban.properties:jetty.port=8081

IP为服务器地址。

用户名见配置./conf/azkaban-users.xml, 具备admin角色的用户名是azkaban,密码是azkaban:

详细配置方法内容见:azkaban.github.io/azkaban/doc…

img

2、Azkaban与数仓集群的网络互通

目前Azkaban与云产品Snova网络互通基于两个事实:1,Azkaban Executor的服务器可以访问外网或者可以访问Snova的服务端IP。2,Snova提供外网IP访问的能力。下图为网络连通示意图:

img

Azkaban Executor在执行运行job时,其脚本或者命令经过公网IP访问Snova。

接下来分步骤讲解如何基于Azkaban的工做流。

3、前期准备工做

3.1 Snova集群建立外网IP

在Snova集群控制台,基础配置页面,点击“申请外网地址”,等待运行成功后,会看到访问该集群的外网IP地址。

img

3.2 添加Snova访问地址白名单

在Snova控制台,集群详情页,配置页,新建白名单以下所示。

img

为何要建这个访问白名单?

为了系统安全,Snova默认状况是拒毫不在白名单的地址或者用户访问数据库。

即配置IP白名单CIDR地址为xx.xx.xx.xx/xx,包括全部Azkaban Executor的全部IP或者网段。

3.3 用户受权

3.2章节中,建议单首创建一个用户用于SCF的任务调度和计算。所以须要受权该用户访问对应数据库和表的权限。

建立用户
CREATE USER scf_visit WITH LOGIN PASSWORD 'scf_passwd';
复制代码

并设置用户访问密码。

数据库表受权
GRANT ALL on t1 to scf_visit;
复制代码

4、定时调度任务

http://node1:8081/index

登陆Azkaban,Create Project=>Upload 上一步生成的zip包 =>execute flow执行一步步操做便可。

具体步骤能够见 参考文档:

www.cnblogs.com/qingyunzong…

4.1 建立工程

img

4.2 建立job
job1

文件名:job.job,必须以.job结尾。内容以下:

type=command

command=echo "job1"

retries=5
复制代码

注:type类型及使用方式见azkaban.github.io/azkaban/doc…

job2
type=command

dependencies=job1

retries=5

command=echo "job2 xx"

command.1=ls –al
复制代码

注:dependencies为该job依赖的任务文件名(不包括.job后缀)。若是依赖多个,则以逗号分隔,如job2,job5。

job3
type=command

dependencies=job2,job5

command=sleep 60
复制代码
job5
type=command

dependencies=job1

command=pwd
复制代码
job6
type=command

dependencies=job3

command=sh /data/shell/admin.sh psqlx
复制代码

其中/data/shell/admin.sh ,注意做用能够封装用户功能代码,脚本内容以下,实现读取表中的数据,并进行打印:

function psqlx() {  result=PGPASSWORD=scf_passwd  psql -h xx.xx.xx.xx  -p xx -U scf_visit   -d postgres <<EOF select * from t1; EOF  echo $result }
复制代码
4.3上传job压缩包

压缩全部job文件到一个zip包中。注意:全部文件必须在压缩包的根目录中,没有子目录,以下:

img

img

4.3运行

img

查询执行过程和结果。

img

4.4设置周期调度

在调试成功完成后,能够设置周期调度计划,好比天天定时进行工做流的调度,完成运行计划。

img

5、实践总结

对市面上最流行的两种调度器,给出如下详细对比。知名度比较高的应该是Apache Oozie。

5.1 对比

从功能上来对比

  二者都可以调度linux命令、mapreduce、spark、pig、java、hive、java程序、脚本工做流任务

  二者都可以定时执行工做流任务

从工做流定义上来对比

  一、Azkaban使用Properties文件定义工做流

  二、Oozie使用XML文件定义工做流

从工做流传参上来对比

  一、Azkaban支持直接传参,例如${input}

  二、Oozie支持参数和EL表达式,例如${fs:dirSize(myInputDir)}

从定时执行上来对比

  一、Azkaban的定时执行任务是基于时间的

  二、Oozie的定时执行任务基于时间和输入数据

从资源管理上来对比

  一、Azkaban有较严格的权限控制,如用户对工做流进行读/写/执行等操做

  二、Oozie暂无严格的权限控制

5.2 应用场景

对于数据分析基本上能够归纳为三个步骤: 1、数据导入。2、数据计算。3、数据导出。

三个类型的任务多是多个并发运行,且任务依赖。所以Azkaban基本上能知足以上的任务调度管理和运行场景需求。

首先建立一个job1,用于用户数据导入,好比从cos导入,任务内容执行如下SQL命令。

insert into gp_table select * from cos_table;

数据的导入也能够经过其余导入工具,如DataX将其余数据库的数据周期性的导入Snova数据仓库中。所以只需把DataX部署到Azkaban Executor机器对应目录,并进行调用便可

其次,建立job2,用户数据计算分析。该步骤能够是多个job屡次运行的结果,也能够是并发运行。

最后,能够把计算结果出库到应用数据库。

insert into cos_table select * from gp_table;

5.2 不足

1,Azkaban目前Job粒度的失败重试理解相对复杂,在Projects->Executions找到对应的执行失败的Id,选择该执行实例ID,进入详情,点击从新运行,则会生成一个全新的工做流实例ID,而不是从新运行原来失败的实例ID,新的实例ID从失败的job开始运行,已经成功运行的直接跳过,再也不运行。

2,job经过shell命令启动复杂的程序,shell返回成功,并不表明程序运行成功。

3,job运行管理容错性不足,当一个job提交一个运行任务后,此时重启或者executor进程挂掉,该任务将出现状态失败的状况,实际可能任务已经运行成功。

此文已由腾讯云+社区在各渠道发布

获取更多新鲜技术干货,能够关注咱们腾讯云技术社区-云加社区官方号及知乎机构号

相关文章
相关标签/搜索