Azkaban 任务调度系统部署及应用
Learning Spaces
Table of Contents
1 基础介绍 3
1.1 为什么需要任务调度? 3
1.2 Azkaban的三种模式 3
2 安装 5
2.1 OneinStack方式安装Mysql 5
2.2 下载编译Azkaban 5
3 Azkaban-Solo 方式运行 7
4 two-server 方式运行 8
5 multiple-executor 方式运行 11
6 测试示例(仅支持command、java) 15
6.1 相对路径执行shelll脚本 15
6.2 绝对路径测试Java脚本 16
7 问题处理 18
7.1 azkaban执行job时一直处于preparing状态问题 18
一个完整的数据分析系统(业务系统)通常都是由大量任务单元组成:
- shell脚本程序
- java,python程序
- mapreduce程序
- hive脚本等
- …等等
各任务单元之间存在时间先后及前后依赖关系 为了很好地组织起这样的复杂执行计划,需要一个工作流调度系统来调度执行;
- 通过Hadoop先将原始数据同步到HDFS上;
- 借助MapReduce计算框架对原始数据进行转换,生成的数据以分区表的形式存储到多张Hive表中;
- 需要对Hive中多个表的数据进行JOIN处理,得到一个明细数据Hive大表;
- 将明细数据进行复杂的统计分析,得到结果报表信息;
- 需要将统计分析得到的结果数据同步到业务系统中,供业务调用使用。
每一个任务都依赖于上一个任务的结构,在这样的一个复杂度下显然Crontab已经满足不了需求,应为复杂度的提升还会出现失败处理分支和重试机制等
Azkaban是一套简单的任务调度服务,整体包括三部分webserver、dbserver、executorserver
- solo-server模式:exec进程和web进程为同一个进程,存放元数据的数据库为H2
- two-server模式:与之前的单机版本类似,exec进程和web进程分开,存放元数据的数据库为mysql
- multiple-executor模式:exec进程和web进程在不同的机器上,存放元数据的数据库为mysql
本页面包含的内容:
相关链接:
Azkaban官网: https://azkaban.github.io
官方文档地址: http://azkaban.github.io/azkaban/docs/latest
- Install Java JDK
# Java environment - Install Mysql
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
- 下载Azkaban
> wget https://github.com/azkaban/azkaban/archive/3.50.0.tar.gz |
# azkaban关于通知邮件存在一个问题需要修改一段代码 > vim azkaban-common/src/main/java/azkaban/utils/EmailMessage.java # 增加如下语句(:/props 查找邮件参数配置) props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); |
- 编译Azkaban(需联网)
# -x test 跳过测试 > tar -zxvf 3.50.0.tar.gz && cd azkaban-3.50.0 && ./gradlew build installDist -x test # 拷贝编译好的solo,web,exec,db安装包 cp azkaban-*/build/distributions/*.tar.gz /path/to/azkaban |
- Extract the package into a directory. The install path should be different from the AzkabanExecutorServer. After extraction, there should be the following directories:
Folder | Description |
bin | The scripts to start Azkaban jetty server |
conf | The configurations for Azkaban solo server |
lib | The jar dependencies for Azkaban |
extlib | Additional jars that are added to extlib will be added to Azkaban's classpath |
plugins | the directory where plugins can be installed |
web | The web (css, javascript, image) files for Azkaban web server. |
In the conf directory, there should be three files
-
- azkaban.properties - Used by Azkaban for runtime parameters
- global.properties - Global static properties that are passed as shared properties to every workflow and job.
- azkaban-users.xml - Used to add users and roles for authentication. This file is not used if the XmLUserManager is not set up to use it.
The azkaban.properties file will be the main configuration file that is necessary to setup Azkaban.
solo方式其实就是单机模式,可以简单地体验Azkaban的使用,数据库使用的是内置的H2数据库
- 解压azkaban:tar -zxvf azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz
- 修改时区:sed -i 's/America\/Los_Angeles/Asia\/Shanghai/' /path/to/azkaban-solo-server/conf/azkaban.properties
- 启动azkaban:cd /path/to/azkaban-solo-server/ && ./bin/start-solo.sh
- WebUrl(根据实际填写,默认用户名及密码:azkaban):http://azkaban.rsfy.com:8081
two-server和solo最大的不同在于solo是在一个进程下启动的,two模式分别启动了web-service和exec-server,虽然都是在同一台机器启动,two需要使用mysql作为数据库
- 解压azkaban
> tar -zxvf azkaban-web-server-0.1.0-SNAPSHOT.tar.gz |
- 初始化数据库
> mysql -u root -p # 导入方法一 # 导入方法二 |
- 配置web-server
a. 不使用SSL:
# 因为web-server 和 exec-server都没有默认配置文件我们需要复制solo的配置文件 > cp -r /path/to/azkaban-solo-server/conf/ /path/to/azkaban-web-server # 配置log4j日志(从编译后的源码包拷贝) # 修改配置文件azkaban.properties default.timezone.id=Asia/Shanghai # 填写实际hostname # 添加plugins属性 > mkdir -p /path/to/azkaban-web-server/plugins/jobtypes > echo -e "azkaban.native.lib=false\nexecute.as.user=false" > /path/to/azkaban-web-server/plugins/jobtypes |
b. 使用SSL,在上面的基础上添加以下配置:
# 生成RSA(记住填写密码) # 修改配置文件 > vim /path/to/azkaban-web-server/conf/azkaban.properties jetty.use.ssl=true # 发送给客户端证书,密码填写生成证书时使用的密码 |
- 配置登陆用户文件azkaban-users.xml
# azkaban-web-server/conf目录下的azkaban-users.xml文件主要定义登录用户账号密码及权限,这里我们使用默认的配置信息 <user password="test" roles="admin" username="test"/> # roles 对应下方所写的权限 <user password="metrics" roles="metrics" username="metrics"/><role name="admin" permissions="ADMIN"/><role name="metrics" permissions="METRICS"/></azkaban-users> |
- 配置并启动executor
# 复制web-server的配置文件至executor的目录 > cp -r /path/to/azkaban-web-server/conf/ /path/to/azkaban-exec-server # 先关闭之前启动的solo实例 # 启动exectuor |
- 启动web-server并访问azkaban
# 启动web-server # 访问azkaban(根据实际主机名填写) |
multiple-executor是分布式的,executor在不同的机器运行,使用mysql作为数据库
- 将web-server的conf目录、plugins目录拷贝至exectuor的目录
> cp -r /path/to/azkaban-exec-server/conf /path/to/azkaban-exec-server |
- 将exector复制到需要执行的集群机器
> scp -r /path/to/azkaban-exec-server root@exec-1:/path/to/azkaban-exec-server |
- 修改web-server修改配置文件
# 在每次分发job时,先过滤出满足条件的executor,然后再做比较筛选 |
> vim /usr/local/azkaban-web-server/conf/azkaban.properties # 启用multiple-executor模式 azkaban.executorselector.filters=StaticRemainingFlowSize,MinimumFreeMemory,CpuStatus |
- 在azkaban_two_server库executors表中添加executor
> mysql -u root -p |
- 启动exector及web-server
# 启动exector > cd /path/to/azkaban-exec-server/ && ./bin/start-exec.sh > cd /path/to/azkaban-web-server/ && ./bin/start-web.sh |
- 示例Conf
a. web-server conf:
# Azkaban Personalization Settings azkaban.name=Test azkaban.label=My Local Azkaban azkaban.color=#FF3601 azkaban.default.servlet.path=/index web.resource.dir=/usr/local/azkaban-web-server/web/ # default.timezone.id=America/Los_Angeles default.timezone.id=Asia/Shanghai
# Azkaban UserManager class user.manager.class=azkaban.user.XmlUserManager user.manager.xml.file=/usr/local/azkaban-web-server/conf/azkaban-users.xml
# Loader for projects executor.global.properties=/usr/local/azkaban-web-server/conf/global.properties azkaban.project.dir=projects # database.type=h2 # h2.path=./h2 # h2.create.tables=true database.type=mysql mysql.port=3306 mysql.host=192.168.1.61 mysql.database=azkaban_two_server mysql.user=azkaban mysql.password=azkaban mysql.numconnections=100
# 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=/usr/local/azkaban-web-server/keystore jetty.password=123456 jetty.keypassword=123456 jetty.truststore=/usr/local/azkaban-web-server/keystore jetty.trustpassword=123456
# Azkaban Executor settings executor.port=12321
# mail settings # mail.sender=邮件发送者 # mail.host=发送邮件服务器 腾讯企业邮箱的host是:smtp.exmail.qq.com 126邮箱的host是:smtp.126.com 163邮箱的host是:smtp.163.com mail.sender=XXXXXXXX@163.com mail.host=smtp.163.com mail.user=XXXXXXXX@136.com # 密码为邮件授权码 mail.password=XXXXXXX
# 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 servers 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=/usr/local/azkaban-web-server/plugins/jobtypes
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 |
b. exector conf:
#Azkaban #时区 default.timezone.id=Asia/Shanghai
# Azkaban JobTypes Plugins # jobtype 插件所在位置 azkaban.jobtype.plugin.dir=plugins/jobtypes
#Loader for projects executor.global.properties=/opt/modules/azkaban/executor/conf/global.properties azkaban.project.dir=projects
database.type=mysql mysql.port=3306 mysql.host=node01 mysql.database=azkaban mysql.user=root mysql.password=hadoop mysql.numconnections=100
# Azkaban Executor settings # 最大线程数 executor.maxThreads=50 # 端口号(如修改,请与web服务中一致) executor.port=12321 # 线程数 executor.flow.threads=30 |
Shell Job 创建Job及shell脚本(Job需以.job结尾)
# 失败重试3次 # 每次重试间隔,单位为毫秒
zip压缩Job文件及shell脚本
|
Java Job 创建Job及Java脚本(Job需以.job结尾)
type=javaprocess # 失败重试3次 # 每次重试间隔,单位为毫秒
package azkaban; import java.io.FileOutputStream; public class AzkabanTest { public static void main(String[] args) throws IOException { zip压缩Job文件及shell脚本
|
- 考虑内存问题
修改azkaban-web下的azkaban.properties配置文件
去掉MinimumFreeMemory,过滤器会检查 executor 主机空余内存是否会大于 6G,如果不足 6G,则 web-server 不会将任务交由该主机执行
即为:
azkaban.executorselector.filters=StaticRemainingFlowSize,CpuStatus - 手动修改exec-srver为激活状态
> msyql -uroot -p
mysql> use azkaban
mysql> select * from executors;
mysql> update executors set active=1 where host='exec-1';