Azkaban 任务调度系统(安装搭建)-阿里云开发者社区

开发者社区> 喵了个咪_> 正文

Azkaban 任务调度系统(安装搭建)

简介: 无论是在业务开发还是在大数据开发中,脚本都是必不可少的存在,在初期我们会使用crontab来解决问题,那么当发现规模变大监控需求可视化需求的到来Crontab已经显然满足不了需求,抱着一颗解决大数据任务脚本和业务任务脚本难题的心态最终在oozie和Azkaban选择了使用Azkaban来作为公共任务调度系统,那么就随着笔者一同来学习Azkaban的基础搭建场景和基本使用吧.
+关注继续查看

无论是在业务开发还是在大数据开发中,脚本都是必不可少的存在,在初期我们会使用crontab来解决问题,那么当发现规模变大监控需求可视化需求的到来Crontab已经显然满足不了需求,抱着一颗解决大数据任务脚本和业务任务脚本难题的心态最终在oozie和Azkaban选择了使用Azkaban来作为公共任务调度系统,那么就随着笔者一同来学习Azkaban的基础搭建场景和基本使用吧.

附上:

喵了个咪的博客:w-blog.cn

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

官方文档地址: http://azkaban.github.io/azkaban/docs/latest

一 ,基础介绍

为什么需要任务调度?

一个完整的数据分析系统(业务系统)通常都是由大量任务单元组成:

  • shell脚本程序
  • java,python程序
  • mapreduce程序
  • hive脚本等
  • ...等等

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

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

每一个任务都依赖于上一个任务的结构,在这样的一个复杂度下显然Crontab已经满足不了需求,应为复杂度的提升还会出现失败处理分支和重试机制等

Azkaban的三种模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xea7QAva-1597140191452)(http://pic.w-blog.cn/1094291-20170822164058402-1585957165.jpg)]

Azkaban是一套简单的任务调度服务,整体包括三部分webserver、dbserver、executorserver

  • solo-server模式:exec进程和web进程为同一个进程,存放元数据的数据库为H2
  • two-server模式:与之前的单机版本类似,exec进程和web进程分开,存放元数据的数据库为mysql
  • multiple-executor模式:exec进程和web进程在不同的机器上,存放元数据的数据库为mysql

二, 安装

使用系统组件版本如下:

  • centos-7.4
  • mysql-5.7
  • azkaban-3.50.0

首先修改主机名Azkaban(方便配置时直接配置主机名即可)

> hostnamectl --static set-hostname azkaban

安装Mysql 推荐使用oneinstack的方式安装,它会把基础的依赖安装好,比如ntp时间同步,git和gcc-c++

> mkdir -p /app/install
> cd /app/install
> wget http://mirrors.linuxeye.com/oneinstack-full.tar.gz && tar xzf oneinstack-full.tar.gz && ./oneinstack/install.sh --db_option 2 --dbinstallmethod 1 --dbrootpwd Sunmi388
# 当然还需要安装一下java环境,可以通过yum安装或者手动安装都行
> yum install java

下载Azkaban-3.50.0以及修改邮件代码

> wget https://github.com/azkaban/azkaban/archive/3.50.0.tar.gz
> tar -zxvf 3.50.0.tar.gz
> cd azkaban-3.50.0
# azkaban关于通知邮件存在一个问题需要修改一段代码
> vim azkaban-common/src/main/java/azkaban/utils/EmailMessage.java
# 找到邮件参数配置的地方
:/props
# 增加如下语句
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
#Gradle是一个基于Apache Ant和Apache Maven的项目自动化构建工具。-x test 跳过测试

使用gradle开始编译,并且吧编译出来的tar包从文件的深层次拷贝出来

> ./gradlew build installDist -x test 
> ll azkaban-*/build/distributions/*.tar.gz
> cp azkaban-*/build/distributions/*.tar.gz ./

编译完成之后我们就可以获取到solo,web,exec,db的编译出来的可执行文件

三, Azkaban-Solo 方式运行

solo方式其实就是单机模式,运行起来非常简单,可以简单地体验Azkaban的使用,数据库使用的是内置的H2数据库

> tar -zxvf azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz
> mv azkaban-solo-server-0.1.0-SNAPSHOT /usr/local/azkaban-solo-server

修改配置文件

> vim /usr/local/azkaban-solo-server/conf/azkaban.properties
default.timezone.id=Asia/Shanghai

启动

# 一定要在azkaban更目录运行,它的配置文件默认是相对路径
> cd /usr/local/azkaban-solo-server/
> bin/start-solo.sh

访问8081就可以看到具体的页面了,用户名密码默认就是Azkaban,可以通过编辑配置文件中的azka`ban-user.xml更改

如果需要关闭可以执行如下指令

> /usr/local/azkaban-solo-server/bin/shutdown-solo.sh

四, 简单的job任务

生成job任务zip包

> vim  command.job
#command.job
type=command
command=echo 'hello' 

> zip -r command.zip command.job

通过右上角的uplad上传

五 two-server 方式运行

tow和solo最大的不同在于solo是在一个进程下启动的,tow模式分别启动了web-service和exec-server,虽然都是在同一台机器启动,tow需要使用mysql作为数据库
解压

> cd /app/install/azkaban-3.50.0/
> tar -zxvf azkaban-web-server-0.1.0-SNAPSHOT.tar.gz 
> tar -zxvf azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz 
> tar -xzvf azkaban-db-0.1.0-SNAPSHOT.tar.gz

初始化Mysql用户表.权限.数据

> mysql -u root -p
mysql > CREATE DATABASE azkaban_two_server;
mysql > CREATE USER 'azkaban'@'%' IDENTIFIED BY 'azkaban';
mysql > GRANT SELECT,INSERT,UPDATE,DELETE ON azkaban_two_server.* to 'azkaban'@'%' WITH GRANT OPTION;

mysql > use azkaban_two_server;
mysql > source /app/install/azkaban-3.50.0/azkaban-db-0.1.0-SNAPSHOT/create-all-sql-0.1.0-SNAPSHOT.sql;

配置web-server

> mv azkaban-web-server-0.1.0-SNAPSHOT /usr/local/azkaban-web-server
# 因为web-server 和 exec-server都没有默认配置文件我们需要复制solo的配置文件
> cp -r /usr/local/azkaban-solo-server/conf/ /usr/local/azkaban-web-server
> cp /app/install/azkaban-3.50.0/azkaban-web-server/src/test/resources/log4j.properties /usr/local/azkaban-web-server/conf
> vim /usr/local/azkaban-web-server/conf/azkaban.properties 

#需要修改的地方
default.timezone.id=Asia/Shanghai
#database.type=h2
#h2.path=./h2
#h2.create.tables=true
database.type=mysql
mysql.port=3306
mysql.host=azkaban
mysql.database=azkaban_two_server
mysql.user=azkaban
mysql.password=azkaban
mysql.numconnections=100

添加azkaban.native.lib=false 和 execute.as.user=false属性

> mkdir -p plugins/jobtypes
> vim commonprivate.properties 

azkaban.native.lib=false
execute.as.user=false

启动web-serrver并验证

# 先关闭之前启动的solo实例
> /usr/local/azkaban-solo-server/bin/shutdown-solo.sh
> cd /usr/local/azkaban-web-server
> bin/start-web.sh

可以正常登陆即可

因为我们只运行了web没有运行exec节点如果执行任务会出现如下报错

启动exec

> mv /app/install/azkaban-3.50.0/azkaban-exec-server-0.1.0-SNAPSHOT /usr/local/azkaban-exec-server
> cd /usr/local/azkaban-exec-server
> cp -r ../azkaban-web-server/conf/ ./
> cp -r ../azkaban-web-server/plugins/ ./

# 运行exec
> bin/start-exec.sh

然后在尝试执行任务已经能够正常执行了

六 , multiple-executor 方式运行

我们先关闭本机上的exec

> /usr/local/azkaban-exec-server/bin/shutdown-exec.sh 

笔者这边准备了之前搭建好的CDH集群下的master-1 和 master-2 节点作为exec运行节点

首先互相配置好hosts在master-1 和 master-2 中配置 Azkaban的IP

> vim /etc/hosts
192.168.1.158 azkaban

在Azkaban服务器上配置master-1和master-2的IP

> vim /etc/hosts
192.168.3.21 master-1
192.168.3.22 master-2

拷贝exec到master-1和master-2节点

> scp -r /usr/local/azkaban-exec-server root@master-1:/usr/local/azkaban-exec-server
> scp -r /usr/local/azkaban-exec-server root@master-2:/usr/local/azkaban-exec-server

关闭web-server修改配置文件

> /usr/local/azkaban-web-server/bin/shutdown-web.sh
> vim /usr/local/azkaban-web-server/conf/azkaban.properties
#启用multiple-executor模式
azkaban.use.multiple.executors=true

两种节点选择规则,我们因为不一定资源非常的空闲我们选择第二种对比选择的方式选择执行任务的节点

#在每次分发job时,先过滤出满足条件的executor,然后再做比较筛选
#如最小剩余内存,MinimumFreeMemory,过滤器会检查executor空余内存是否会大于6G,如果不足6G,则web-server不会将任务交由该executor执行。可参考Azkaban Github源码
#如CpuStatus,过滤器会检查executor的cpu占用率是否达到95%,若达到95%,web-server也不会将任务交给该executor执行。可参考Azkaban Github源码。
#参数含义参考官网说明http://azkaban.github.io/azkaban/docs/latest/#configuration
#azkaban.executorselector.filters=StaticRemainingFlowSize,MinimumFreeMemory,CpuStatus
# 由于是虚拟机,不需要过滤,只需要比较即可
# 某个任务是否指定了executor id
azkaban.executorselector.comparator.NumberOfAssignedFlowComparator=1
# 是否比较内存
azkaban.executorselector.comparator.Memory=1
# 是否最后一次被分发
azkaban.executorselector.comparator.LastDispatched=1
# 是否比较CPU
azkaban.executorselector.comparator.CpuUsage=1

在azkaban_two_server库executors表中添加executor

> mysql -u root -p
mysql > use azkaban_two_server;
mysql > insert into executors(host,port,active) values("master-1",12321,1);
mysql > insert into executors(host,port,active) values("master-2",12321,1);

然后可以启动程序了,顺序为web-server -> master-1 exec-server -> master-2 exec-server

> cd /usr/local/azkaban-web-server/
> ./bin/start-web.sh
> cd /usr/local/azkaban-exec-server/
> bin/start-exec.sh

我们在运行一下test的job发现已经是在其他节点执行了,多跑几次会发现它会在master-1和master-2上来回的切换

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
独家下载 | “伏羲”神算!阿里巴巴经济体核心调度系统揭秘
阿里巴巴 9 位技术专家为你深度解析阿里巴巴经济体核心调度系统“伏羲”。伏羲(Fuxi)作为十年前最初创立飞天平台时的三大服务之一(分布式存储 Pangu,分布式计算 MaxCompute,分布式调度 Fuxi),十年来,在技术能力上持续演进。本书从面向大数据、云计算的调度挑战出发,介绍伏羲调度系统及各子领域的关键技术进展,并以双11为典型场景进行最佳实践的介绍,为你呈现大数据分布式调度技术的深水区玩法。— 《“伏羲”神算》现在可以免费下载阅读啦,快来先睹为快吧。
34165 0
在redhat6.4下安装 Oracle® Database 11g Release 2
OS版本: 安装过程的相关信息: pdksh     安装好后根据需要设置oracle开机自启动http://www.cnblogs.com/softidea/p/3761671.
832 0
【云周刊】 第210期:阿里巴巴复杂搜索系统的可靠性优化之路
本期头条 欢迎关注云周刊 阿里巴巴复杂搜索系统的可靠性优化之路 搜索引擎是电商平台成交链路的核心环节,搜索引擎的高可用直接影响成交效率。闲鱼搜索引擎作为闲鱼关键系统,复杂度和系统体量都非常高,再加上闲鱼所有导购场景都依靠搜索赋能,搜索服务的稳定可靠成为了闲鱼大部分业务场景可用能力的衡量标准;如何保障搜索服务的稳定和高可用成为了极大的挑战。
3770 0
ubuntu16定时任务crontab
最近在ubuntu16上配置了个定时任务,好长时间没配置好,后来发现问题,cron配置文件换行符必须是 unix格式,否则执行不成功
2579 0
调度系统设计精要
本文会介绍调度系统的常见场景以及设计过程中的一些关键问题,调度器的设计最终都会归结到一个问题上 — 如何对资源高效的分配和调度以达到我们的目的,可能包括对资源的合理利用、最小化成本、快速匹配供给和需求。
800 0
调度系统设计精要
本文会介绍调度系统的常见场景以及设计过程中的一些关键问题,调度器的设计最终都会归结到一个问题上 — 如何对资源高效的分配和调度以达到我们的目的,可能包括对资源的合理利用、最小化成本、快速匹配供给和需求。
129 0
第8周-任务1-方案3-复数类中运算符重载(与实数运算)
  接:第8周-任务1-方案2-复数类中运算符重载(非成员函数实现)   本文在方案2的基础上,扩展+、-、*、/运算符的功能,使之能与double型数据进行运算。设Complex c; double d; c?d和d?c的结果为“将d视为实部为d的复数同c运算”的结果(其中?为+、-、*、/之一)。另外,再定义一目运算符 -,-c相当于0-c。 【讲解视频】 【参考解答
1165 0
第8周-任务1-方案1-复数类中运算符重载(成员函数实现)
【题目】实现复数类中的运算符重载:定义一个复数类重载运算符+、-、*、/,使之能用于复数的加减乘除。 方案一:请用类的成员函数完成运算符的重载;class Complex { public: Complex(){real=0;imag=0;} Complex(double r,double i){real=r;imag=i;} Complex operator+(Compl
988 0
+关注
喵了个咪_
后端程序员,开源PHP框架PhalApi核心开发者,编写录制phalapi教程,phalcon爱好者编写phalcon教程以及zephir文档翻译,热爱交流沟通,喜欢go语言,欢迎大家一起交流沟通,探讨技术,座右铭:代码即真理,你的真理是什么呢?
166
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载