不管是在业务开发仍是在大数据开发中,脚本都是必不可少的存在,在初期咱们会使用crontab来解决问题,那么当发现规模变大监控需求可视化需求的到来Crontab已经显然知足不了需求,抱着一颗解决大数据任务脚本和业务任务脚本难题的心态最终在oozie和Azkaban选择了使用Azkaban来做为公共任务调度系统,那么就随着笔者一同来学习Azkaban的基础搭建场景和基本使用吧.java
附上:python
喵了个咪的博客:w-blog.cnmysql
Azkaban官网: https://azkaban.github.iolinux
官方文档地址: http://azkaban.github.io/azkaban/docs/latestc++
一个完整的数据分析系统(业务系统)一般都是由大量任务单元组成:git
各任务单元之间存在时间前后及先后依赖关系 为了很好地组织起这样的复杂执行计划,须要一个工做流调度系统来调度执行;github
一、 经过Hadoop先将原始数据同步到HDFS上;web
二、 借助MapReduce计算框架对原始数据进行转换,生成的数据以分区表的形式存储到多张Hive表中;sql
三、 须要对Hive中多个表的数据进行JOIN处理,获得一个明细数据Hive大表 ; 四、 将明细数据进行复杂的统计分析,获得结果报表信息;shell
五、 须要将统计分析获得的结果数据同步到业务系统中,供业务调用使用。
每个任务都依赖于上一个任务的结构,在这样的一个复杂度下显然Crontab已经知足不了需求,应为复杂度的提高还会出现失败处理分支和重试机制等
Azkaban是一套简单的任务调度服务,总体包括三部分webserver、dbserver、executorserver
使用系统组件版本以下:
首先修改主机名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的编译出来的可执行文件
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任务zip包
> vim command.job #command.job type=command command=echo 'hello' > zip -r command.zip command.job
经过右上角的uplad上传
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
而后在尝试执行任务已经可以正常执行了
咱们先关闭本机上的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上来回的切换