介绍
Azkaban 是由 Linkedin 开源的一个批量工作流任务调度器。用于在一个工作流内以一个特定的顺序运行一组工作和流程。Azkaban 定义了一种 KV 文件格式来建立任务之间的依赖关系,并提供一个易于使用的 web 用户界面维护和跟踪你的工作流。
- Azkaban 官网地址:http://azkaban.github.io/
- Azkaban 的下载地址:http://azkaban.github.io/downloads.html
Azkaban 包括三个关键组件:
关系数据库:使用 Mysql数据库,主要用于保存流程、权限、任务状态、任务计划等信息。AzkabanWebServer:为用户提供管理留存、任务计划、权限等功能。AzkabanExecutorServer:执行任务,并把任务执行的输出日志保存到 Mysql;可以同时启动多个 AzkabanExecutorServer ,他们通过 mysql 获取流程状态来协调工作。
二进制文件安装
编译源码
在 2.5 版本之后,Azkaban 提供了两种模式来安装:
- 一种是 standalone 的 “solo-server” 模式;
- 另一种是两个 server 的模式,分别为 AzkabanWebServer 和 AzkabanExecutorServer。
这里主要介绍第二种模式的安装方法。
wget https://github.com/azkaban/azkaban/archive/3.84.8.zipunzip 3.84.8.zipcd azkaban-3.84.8./gradlew distTar
编译后的文件:
azkaban-exec-server/build/distributions/azkaban-exec-server-0.1.0-SNAPSHOT.zipazkaban-web-server/build/distributions/azkaban-web-server-0.1.0-SNAPSHOT.zip
安装 MySql
目前 Azkaban 只支持 MySql ,故需安装 MySql 服务器,安装 MySql 的过程这里不作介绍。
安装之后,创建 azkaban 数据库,并创建 azkaban 用户,密码为 azkaban,并设置权限。
mysql> CREATE DATABASE azkaban;mysql> CREATE USER 'azkaban'@'%' IDENTIFIED BY 'azkaban';mysql> GRANT all ON azkaban.* to 'azkaban'@'%' WITH GRANT OPTION;mysql> flush privileges;
修改 /etc/my.cnf 文件,设置 max_allowed_packet 值:
[mysqld]...max_allowed_packet=1024M
安装 azkaban-web-server
解压缩 azkaban-web-server-0.1.0-SNAPSHOT.zip。
unzip azkaban-web-server-0.1.0-SNAPSHOT.zipmv azkaban-web-server-0.1.0-SNAPSHOT /opt/azkaban-web-server
创建 SSL 配置,命令:
keytool -keystore keystore -alias jetty -genkey -keyalg RSA
密码均输入azkaban,最后在当前目录生成 keystore 证书文件。将 keystore 考贝到 azkaban web 目录中
mv keystore /opt/azkaban-web-server
修改 azkaban web 服务器配置conf/azkaban.properties,主要包括:
a. 修改时区和首页名称:
# Azkaban Personalization Settingsazkaban.name=ETL Taskazkaban.label=By BIazkaban.color=#FF3601azkaban.default.servlet.path=/indexweb.resource.dir=web/default.timezone.id=Asia/Shanghai
b. 修改 MySql 数据库配置
database.type=mysqlmysql.port=3306mysql.host=localhostmysql.database=azkabanmysql.user=azkabanmysql.password=azkabanmysql.numconnections=100
c. 修改 Jetty 服务器属性,包括 keystore 的相关配置
# Azkaban Jetty server properties.jetty.hostname=0.0.0.0jetty.maxThreads=25jetty.port=8081jetty.keystore=keystorejetty.password=azkabanjetty.keypassword=azkabanjetty.truststore=keystorejetty.trustpassword=azkaban
d. 开启SSL
jetty.use.ssl=truejetty.ssl.port=8443
e.修改邮件设置(可选)
# mail settingsmail.sender=admin@javachen.spacemail.host=javachen.spacemail.user=adminmail.password=admin
f. 解压缩azkaban-db-0.1.0-SNAPSHOT.zip,然后进入 mysql 命令行模式:
unzip azkaban-db-0.1.0-SNAPSHOT.zip$ mysql -uazkaban -pazkabanmysql> use azkabanmysql> source azkaban-db-0.1.0-SNAPSHOT/create-all-sql-0.1.0-SNAPSHOT.sql
g. 设置Executor:
#Multiple Executorazkaban.use.multiple.executors=true#azkaban.executorselector.filters=StaticRemainingFlowSize,MinimumFreeMemory,CpuStatusazkaban.executorselector.filters=StaticRemainingFlowSize,CpuStatusazkaban.executorselector.comparator.NumberOfAssignedFlowComparator=1azkaban.executorselector.comparator.Memory=1azkaban.executorselector.comparator.LastDispatched=1azkaban.executorselector.comparator.CpuUsage=1executor.port=12321
安装 azkaban-exec-server
解压缩 azkaban-exec-server-0.1.0-SNAPSHOT.zip
unzip azkaban-exec-server-0.1.0-SNAPSHOT.zipmv azkaban-exec-server-0.1.0-SNAPSHOT /opt/azkaban-exec-server
然后修改配置文件conf/azkaban.properties,包括:
a. 修改时区为:default.timezone.id=Asia/Shanghai
b. 修改 MySql 数据库配置
database.type=mysqlmysql.port=3306mysql.host=localhostmysql.database=azkabanmysql.user=azkabanmysql.password=azkabanmysql.numconnections=100
c. 设置executor端口为12321
executor.maxThreads=50executor.port=12321executor.flow.threads=30
用户设置
进入 azkaban web 服务器 conf 目录,修改 azkaban-users.xml ,增加管理员用户:
<azkaban-users><user groups="azkaban" password="admin027" roles="admin" username="azkaban"/><user password="metrics" roles="metrics" username="metrics"/><user groups="test" username="test" password="123456" roles="read"/><role name="admin" permissions="ADMIN"/><role name="metrics" permissions="METRICS"/><role name="read" permissions="READ"/><role name="write" permissions="WRITE"/><role name="execute" permissions="EXECUTE"/><role name="schedule" permissions="SCHEDULE"/><role name="createprojects" permissions="CREATEPROJECTS"/></azkaban-users>
启动服务
azkaban-exec-server,需要在 azkaban-exec-server 目录下执行下面命令:
sh bin/start-exec.sh
激活当前executor:
$ curl -G "localhost:$(<./executor.port)/executor?action=activate" && echo{"status":"success"}
azkaban-web-server,需要在 azkaban-web-server 目录下执行下面命令:
sh bin/start-web.sh
Docker安装
关于azkaban的docker镜像,可以参考:
- https://gitee.com/datatech/docker-azkaban
- https://github.com/jfim/data-platform-demo/blob/master/dockerfiles/Dockerfile-azkaban
- https://github.com/wilson-lauw/azkaban
这里,我参考上面文章自己制作了azkaban的相关镜像,地址:azkaban-web-server 和 azkaban-exec-server
azkaban-web-server镜像
azkaban-web-server镜像制作过程:
1、首先从源码编译得到打包后的文件 azkaban-web-server-0.1.0-SNAPSHOT.tar.gz
mkdir azkaban-exec-server azkaban-web-serverwget https://github.com/azkaban/azkaban/archive/3.84.8.zipunzip 3.84.8.zipcd azkaban-3.84.8./gradlew distTarcp azkaban-exec-server/build/distributions/azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz ../azkaban-exec-server/cp azkaban-web-server/build/distributions/azkaban-web-server-0.1.0-SNAPSHOT.tar.gz ../azkaban-web-server/
2、创建Dockerfile:
FROM javachen/alpine-jdk:8# Azkaban web server portEXPOSE 8443COPY azkaban-web-server-0.1.0-SNAPSHOT.tar.gz .RUN set -eux \&& tar zxf azkaban-web-server-0.1.0-SNAPSHOT.tar.gz \&& mv azkaban-web-server-0.1.0-SNAPSHOT azkaban-web-server \&& rm -rf azkaban-web-server-0.1.0-SNAPSHOT.tar.gz# Define default workdirWORKDIR azkaban-web-serverCOPY conf/* conf/COPY run.sh run.shRUN chmod +x run.shCMD ./run.sh && tail -f /dev/null
3、创建conf目录,存储配置文件:
- azkaban-users.xml
- azkaban.properties
- keystore
4、创建run.sh文件,主要用于设置等待mysql启动之后再启动服务并修改启动服务的命令
#!/bin/bashDB_LOOPS="20"MYSQL_HOST="mysql"MYSQL_PORT="3306"START_CMD="bin/start-web.sh"#wait for mysqli=0while ! nc $MYSQL_HOST $MYSQL_PORT >/dev/null 2>&1 < /dev/null; doi=`expr $i + 1`if [ $i -ge $DB_LOOPS ]; thenecho "$(date) - ${MYSQL_HOST}:${MYSQL_PORT} still not reachable, giving up"exit 1fiecho "$(date) - waiting for ${MYSQL_HOST}:${MYSQL_PORT}..."sleep 1done# Work around to run container as a daemonsed -i "s/ &//" $START_CMDcurl -G "executor:12321/executor?action=activate" && echo# mysql -h mysql -uazkaban -pazkaban -e "update executors set active=1 where host='executor';"# Work around to run container as a daemonexec $START_CMD
注意:
- 从run.sh可以看到 azkaban-web-server 依赖 mysql 数据库,其主机名为 mysql ,所以需要部署一个mysql容器,容器名称设置为mysql,当然,你如果想用外置的sql,则可以设置为ip或者域名。
5、编译上传镜像:
docker build -t javachen/azkaban-web-server .docker push javachen/azkaban-web-server
azkaban-exec-server镜像
同理,azkaban-exec-server镜像制作过程:
1、首先从源码编译得到打包后的文件 azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz 以及sql文件 create-all-sql-0.1.0-SNAPSHOT.sql
2、创建Dockerfile:
FROM javachen/alpine-jdk:8# Azkaban executor portEXPOSE 12321COPY azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz .# coreutils https://www.cnblogs.com/shansongxian/p/10531439.htmlRUN apk add --no-cache git coreutils mysql-client mongodb-tools postgresql-client redis \&& tar zxf azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz \&& mv azkaban-exec-server-0.1.0-SNAPSHOT azkaban-exec-server \&& rm -rf azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz# Define default workdirWORKDIR azkaban-exec-serverCOPY conf/* conf/COPY run.sh run.shRUN chmod +x run.shCMD ./run.sh && tail -f /dev/null
3、创建conf目录,存储配置文件:
- azkaban.properties
4、创建run.sh文件
#!/bin/bashDB_LOOPS="20"MYSQL_HOST="mysql"MYSQL_PORT="3306"START_CMD="bin/start-exec.sh"i=0while ! nc $MYSQL_HOST $MYSQL_PORT >/dev/null 2>&1 < /dev/null; doi=`expr $i + 1`if [ $i -ge $DB_LOOPS ]; thenecho "$(date) - ${MYSQL_HOST}:${MYSQL_PORT} still not reachable, giving up"exit 1fiecho "$(date) - waiting for ${MYSQL_HOST}:${MYSQL_PORT}..."sleep 1donesed -i "s/ &//" $START_CMD# echo "import azkaban create-all-sql.sql to $MYSQL_HOST"# mysql -h $MYSQL_HOST -uazkaban -pazkaban azkaban < create-all-sql-0.1.0-SNAPSHOT.sql# Work around to run container as a daemonexec $START_CMD
注意:
- 从run.sh可以看到 azkaban-web-server 依赖 mysql 数据库,其主机名为 mysql ,所以需要部署一个mysql容器,容器名称设置为mysql,当然,你如果想用外置的sql,则可以设置为ip或者域名。
5、编译上传镜像:
docker build -t javachen/azkaban-exec-server .docker push javachen/azkaban-exec-server
docker-compose
创建一个网络:
docker create network traefik
Docker-compose.yaml编排文件:
version: '3'services:mysql:command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ciimage: mysql:5.7restart: alwaysenvironment:MYSQL_DATABASE: azkabanMYSQL_USER: azkabanMYSQL_PASSWORD: azkabanMYSQL_ROOT_PASSWORD: 123456ports:- "3306:3306"volumes:- mysql:/var/lib/mysqlexecutor:image: javachen/azkaban-exec-serverrestart: always# 和服务名称保持一致hostname: executorenvironment:AZKABAN_OPTS: "-Xmx2048m"ports:- "12321:12321"volumes:- /data/bi_etl:/data/bi_etl- /data/ods:/data/ods #自定义的数据目录networks:- traefikwebserver:image: javachen/azkaban-web-serverrestart: alwaysenvironment:AZKABAN_OPTS: "-Xmx512m"depends_on:- executornetworks:- traefikports:- "8081:8081"networks:traefik:external: true
可以先启动mysql:
docker-compose up -d mysql
然后需要初始化数据库,执行脚本:
docker exec -it mysql_1 bashmysql -h localhost -uazkaban -pazkaban azkaban < create-all-sql-0.1.0-SNAPSHOT.sql
然后,启动azkaban:
docker-compose up -d
