首页 » 系统软件 » 正文

AZKBAN——开源任务调度系统

azkaban是一个开源的任务调度系统,用于负责任务的调度运行(如数据仓库调度),用以替代linux中的crontab。官网:https://azkaban.github.io/

azkaban主要有三部分构成:
1. MySQL:Azkaban使用MySQL来存储项目和执行。
2. Azkaban Web Server:Azkaban使用Jetty作为Web服务器,用作控制器以及提供Web界面
3. Azkaban Executor Server:Azkaban执行服务器执行提交工作流。

本文主要使用的是azkaban3.43,如果您从github源代码生成编译tar包时候可以留言,我可以给您分享我已经测试通过的安装包文件。
安装包文件主要有:
1. azkaban-db-3.43.0.tar.gz
2. azkaban-solo-server-3.43.0.tar.gz
3. azkaban-exec-server-3.43.0.tar.gz
4. azkaban-web-server-3.43.0.tar.gz
5. azkaban-hadoop-security-plugin-3.43.0.tar.gz
其中solo是单机版本,我搭建的是多执行节点,单web server节点的版本。

注意:本文默认azkaban的目录位于/azkaban

数据库
首先需要安装MySQL数据库,然后创建一个叫azkaban的数据库。mysql中执行

source /azkaban/azkaban-db/create-all-sql-0.1.0-SNAPSHOT.sql

配置文件
0. 配置keystore,keystore的位置位于/azkaban/azkaban-web/conf/(需要与配置文件中路径对应)

keytool -keystore keystore -alias jetty -genkey -keyalg RSA
输入密钥库口令: azkaban
再次输入新口令: azkaban
您的名字与姓氏是什么? [Unknown]: 略过
您的组织单位名称是什么? [Unknown]: 略过
您的组织名称是什么? [Unknown]: 略过
您所在的城市或区域名称是什么? [Unknown]: 略过
您所在的省/市/自治区名称是什么? [Unknown]: 略过
该单位的双字母国家/地区代码是什么? [Unknown]: CN
CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN是否正确?
[否]: Y
输入 <jetty> 的密钥口令 (如果和密钥库口令相同, 按回车):

1. /azkaban/azkaban-web/conf/azkaban.properties

# Azkaban Personalization Settings
azkaban.name=Allin
azkaban.label=My Local Azkaban
azkaban.color=#FF3601
azkaban.default.servlet.path=/index
web.resource.dir=/azkaban/azkaban-web-server/web/
default.timezone.id=Asia/Shanghai
 
# Azkaban UserManager class
user.manager.class=azkaban.user.XmlUserManager
user.manager.xml.file=/azkaban/azkaban-web-server/conf/azkaban-users.xml
 
# Loader for projects
executor.global.properties=/azkaban/azkaban-web-server/conf/global.properties
azkaban.project.dir=/azkaban/azkaban-web-server/projects
 
# Velocity dev mode
velocity.dev.mode=false
 
# Azkaban Jetty server properties.
jetty.use.ssl=false
jetty.maxThreads=25
jetty.port=8443
jetty.keystore=//azkaban/azkaban-web-server/conf/keystore
jetty.password=yourpassword
jetty.keypassword=yourpassword
jetty.truststore=//azkaban/azkaban-web-server/conf/keystore
jetty.trustpassword=yourpassword
 
# Azkaban Executor settings
executor.port=12321
 
# mail settings
mail.sender=
mail.host=
# 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=/azkaban/azkaban-web-server/plugins/jobtypes
 
database.type=mysql
mysql.port=3306
mysql.host=127.0.0.1
mysql.database=azkaban
mysql.user=root
mysql.password=yourmysqlpassword
mysql.numconnections=100

2. /azkaban/azkaban-exec/conf/azkaban.properties

# Azkaban Personalization Settings
default.timezone.id=Asia/Shanghai
 
# Loader for projects
executor.global.properties=/azkaban/azkaban-exec-server/conf/global.properties
azkaban.project.dir=/azkaban/azkaban-exec-server/projects
azkaban.jobtype.plugin.dir=/azkaban/azkaban-exec-server/plugins/jobtypes
 
database.type=mysql
mysql.port=3306
mysql.host=127.0.0.1
mysql.database=azkaban
mysql.user=root
mysql.password=yourpassword
mysql.numconnections=100
 
# Azkaban Executor settings
executor.maxThreads=50
executor.port=12321
executor.flow.threads=30

3. /azkaban/azkaban-web/conf/log4j.properties /azkaban/azkaban-exec/conf/log4j.properties

log4j.rootLogger=INFO,C 
log4j.appender.C=org.apache.log4j.ConsoleAppender 
log4j.appender.C.Target=System.err 
log4j.appender.C.layout=org.apache.log4j.PatternLayout 
log4j.appender.C.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

4. 如果是多执行节点,需要在/azkaban/azkaban-web/conf/azkaban.properties中追加以下配置,并且在数据库中插入对应执行节点的ip和端口号

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

插入执行节点ip和端口号:

insert into executors(host,port) values("your ip1",12321);
insert into executors(host,port) values("your ip2",12321);

5. 配置用户名密码/azkaban/azkaban-web/conf/azkaban-users.xml
只要有一些计算机基础,打开这个配置文件,一目了然。

6. 创建日志文件夹

mkdir /azkaban/azkaban-web/logs
mkdir /azkaban/azkaban-exec/logs

7. 启动

azkaban/azkaban-exec/bin/start-exec.sh
azkaban/azkaban-web/bin/start-web.sh

遇到的坑
1. keystore的位置需要与配置文件中keystore设置的文件路径对应。
2. azkaban3以上才支持多执行节点。
3. 7中启动方式是静默方式,开始测试的时候建议使用:

azkaban/azkaban-exec/bin/azkaban-web-start.sh
azkaban/azkaban-exec/bin/azkaban-exec-start.sh

这样能看到是否报错,什么原因报错。
4. 根据报错说明,有可能没有正确创建logs文件夹或者路径不对。
5. 因为web server会去检查exec server,所以建议先启动exec server。
6. 如果多节点任务不执行,有可能是执行节点的资源不够。注意查看配置,该配置指定服务器在什么内存、CPU等资源条件下才执行任务,以及如果不指定节点,如果分配执行节点。如果不限制资源,请修改或者注释相关配置。

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

7. 如何指定节点执行job:
在 flow params中设置”useExecutor” = EXECUTOR_ID即可
详情请查看:
https://www.jianshu.com/p/ffb7bbc1988f

本文共 1 个回复

  • 匿名 2019/07/26 10:18

    指定节点执行job如何写到配置文件中

发表评论

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax