Azkaban 任务调度系统部署及应用

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

 

 

  1. 基础介绍
    1. 为什么需要任务调度?

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

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

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

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

    1. Azkaban的三种模式

 

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

  1. 安装
    1. OneinStack方式安装Mysql
  1. Install Java JDK
    # Java environment
  2. 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
    1. 下载编译Azkaban
  1. 下载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");

  1. 编译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

  1. 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.

  1. Azkaban-Solo 方式运行

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

  1. 解压azkaban:tar -zxvf azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz
  2. 修改时区:sed -i 's/America\/Los_Angeles/Asia\/Shanghai/' /path/to/azkaban-solo-server/conf/azkaban.properties
  3. 启动azkaban:cd /path/to/azkaban-solo-server/ && ./bin/start-solo.sh
  4. WebUrl(根据实际填写,默认用户名及密码:azkaban):http://azkaban.rsfy.com:8081
  1. two-server 方式运行

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

  1. 解压azkaban

> 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

  1. 初始化数据库

> 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 /path/to/azkaban-3.50.0/azkaban-db-0.1.0-SNAPSHOT/create-all-sql-0.1.0-SNAPSHOT.sql;

# 导入方法二
mysql -uazkaban -p --database=azkaban_two_server < /path/to/azkaban/azkaban-db/create-all-sql-0.1.0-SNAPSHOT.sql

  1. 配置web-server
    a. 不使用SSL:

# 因为web-server 和 exec-server都没有默认配置文件我们需要复制solo的配置文件

> cp -r /path/to/azkaban-solo-server/conf/ /path/to/azkaban-web-server

# 配置log4j日志(从编译后的源码包拷贝)
cp /path/to/azkaban-3.50.0/azkaban-web-server/src/test/resources/log4j.properties /path/to/azkaban-web-server/conf

# 修改配置文件azkaban.properties
# 该配置文件主要定义Azkaban-web-server服务的基本信息、数据库信息、监听端口、Executor设置以及插件目录配置等
> vim /path/to/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

# 填写实际hostname
mysql.host=mysql-hostname
mysql.database=azkaban_two_server
mysql.user=azkaban
mysql.password=azkaban
mysql.numconnections=100

# 添加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(记住填写密码)
cd  /path/to/azkaban-web-server && keytool -keystore keystore -alias jetty -genkey -keyalg RSA

# 修改配置文件

> vim /path/to/azkaban-web-server/conf/azkaban.properties

jetty.use.ssl=true
jetty.maxThreads=25
# jetty.port=8081
jetty.ssl.port=8443

# 发送给客户端证书,密码填写生成证书时使用的密码
jetty.keystore=/path/to/azkaban-web-server /keystore
jetty.password=azkaban
jetty.keypassword=azkaban
# 客户端发给Server证书
jetty.truststore= /path/to/azkaban-web-server /keystore
jetty.trustpassword=azkaban

  1. 配置登陆用户文件azkaban-users.xml

# azkaban-web-server/conf目录下的azkaban-users.xml文件主要定义登录用户账号密码及权限,这里我们使用默认的配置信息
vim /path/to/azkaban-web-server/azkaban-users.xml
<azkaban-users><user groups="azkaban" password="azkaban" roles="admin" username="azkaban"/>

<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>

 

 

  1. 配置并启动executor

# 复制web-server的配置文件至executor的目录

> cp -r /path/to/azkaban-web-server/conf/ /path/to/azkaban-exec-server
> cp -r /path/to/azkaban-web-server/plugins/ /path/to/azkaban-exec-server

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

# 启动exectuor
> cd /path/to/azkaban-exec-server && ./bin/start-exec.sh

  1. 启动web-server并访问azkaban

# 启动web-server
> cd /usr/local/azkaban-web-server && ./bin/start-web.sh

# 访问azkaban(根据实际主机名填写)
http://azkaban.rsfy.com:8081

  1. multiple-executor 方式运行

multiple-executor是分布式的,executor在不同的机器运行,使用mysql作为数据库

  1. 将web-server的conf目录、plugins目录拷贝至exectuor的目录

> cp -r /path/to/azkaban-exec-server/conf /path/to/azkaban-exec-server
> cp -r /path/to/azkaban-exec-server/plugins /path/to/azkaban-exec-server

  1. 将exector复制到需要执行的集群机器

> scp -r /path/to/azkaban-exec-server root@exec-1:/path/to/azkaban-exec-server
> scp -r /path/to/azkaban-exec-server root@exec-2:/path/to/azkaban-exec-server

  1. 修改web-server修改配置文件

# 在每次分发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

 

> vim /usr/local/azkaban-web-server/conf/azkaban.properties

# 启用multiple-executor模式 
azkaban.use.multiple.executors=true

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

  1. 在azkaban_two_server库executors表中添加executor

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

 

 

  1. 启动exector及web-server

# 启动exector

> cd /path/to/azkaban-exec-server/ && ./bin/start-exec.sh
> ……

> cd /path/to/azkaban-web-server/ && ./bin/start-web.sh

  1. 示例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

  1. 测试示例(仅支持command、java)
    1. 相对路径执行shelll脚本

Shell Job

创建Job及shell脚本(Job需以.job结尾)

  1. forTest.job
    # azkabanShell Job
    vim  forTest.job
    type=command
    command=sh forTest.sh

# 失败重试3次
# retries=3 

# 每次重试间隔,单位为毫秒
# retry.backoff=30000 

  1. forTest.sh
    vim forTest.sh
    date > /opt/fortest.txt

 zip压缩Job文件及shell脚本

  1. 压缩fortest.job与fortest.sh
    zip fortest.zip fortest.job fortest.sh

 

 

 

 

 

    1. 绝对路径测试Java脚本

Java Job

创建Job及Java脚本(Job需以.job结尾)

  1. forTest.job
    vim  forTest.job

type=javaprocess
java.class=AzkabanTest(全类名)
classpath=/opt/module/azkaban/lib/*

# 失败重试3次
# retries=3 

# 每次重试间隔,单位为毫秒
# retry.backoff=30000 

  1. forTest.java
    vim forTest.java

package azkaban;

import java.io.FileOutputStream;
import java.io.IOException;

public class AzkabanTest {
public void run() throws IOException {
// 根据需求编写具体代码
FileOutputStream fos = new FileOutputStream("/opt/module/azkaban/output.txt");
fos.write("this is a java progress".getBytes());
fos.close();
}

public static void main(String[] args) throws IOException {
AzkabanTest azkabanTest = new AzkabanTest();
azkabanTest.run();
}
}

 zip压缩Job文件及shell脚本

  1. 压缩fortest.job与fortest.java
    zip fortest.zip fortest.job fortest.java

 

 

  1. 问题处理
    1. azkaban执行job时一直处于preparing状态问题
  1. 考虑内存问题
    修改azkaban-web下的azkaban.properties配置文件
    去掉MinimumFreeMemory,过滤器会检查 executor 主机空余内存是否会大于 6G,如果不足 6G,则 web-server 不会将任务交由该主机执行
    即为:
    azkaban.executorselector.filters=StaticRemainingFlowSize,CpuStatus
  2. 手动修改exec-srver为激活状态
    > msyql -uroot -p
    mysql> use azkaban
    mysql> select * from executors;
    mysql> update executors set active=1 where host='exec-1';
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值