介绍

Azkaban 是由 Linkedin 开源的一个批量工作流任务调度器。用于在一个工作流内以一个特定的顺序运行一组工作和流程。Azkaban 定义了一种 KV 文件格式来建立任务之间的依赖关系,并提供一个易于使用的 web 用户界面维护和跟踪你的工作流。

Azkaban 包括三个关键组件:

  • 关系数据库:使用 Mysql数据库,主要用于保存流程、权限、任务状态、任务计划等信息。
  • AzkabanWebServer:为用户提供管理留存、任务计划、权限等功能。
  • AzkabanExecutorServer:执行任务,并把任务执行的输出日志保存到 Mysql;可以同时启动多个 AzkabanExecutorServer ,他们通过 mysql 获取流程状态来协调工作。

Azkaban - 图1

二进制文件安装

编译源码

在 2.5 版本之后,Azkaban 提供了两种模式来安装:

  • 一种是 standalone 的 “solo-server” 模式;
  • 另一种是两个 server 的模式,分别为 AzkabanWebServer 和 AzkabanExecutorServer。

这里主要介绍第二种模式的安装方法。

  1. wget https://github.com/azkaban/azkaban/archive/3.84.8.zip
  2. unzip 3.84.8.zip
  3. cd azkaban-3.84.8
  4. ./gradlew distTar

编译后的文件:

  1. azkaban-exec-server/build/distributions/azkaban-exec-server-0.1.0-SNAPSHOT.zip
  2. azkaban-web-server/build/distributions/azkaban-web-server-0.1.0-SNAPSHOT.zip

安装 MySql

目前 Azkaban 只支持 MySql ,故需安装 MySql 服务器,安装 MySql 的过程这里不作介绍。
安装之后,创建 azkaban 数据库,并创建 azkaban 用户,密码为 azkaban,并设置权限。

  1. mysql> CREATE DATABASE azkaban;
  2. mysql> CREATE USER 'azkaban'@'%' IDENTIFIED BY 'azkaban';
  3. mysql> GRANT all ON azkaban.* to 'azkaban'@'%' WITH GRANT OPTION;
  4. mysql> flush privileges;

修改 /etc/my.cnf 文件,设置 max_allowed_packet 值:

  1. [mysqld]
  2. ...
  3. max_allowed_packet=1024M

然后重启 MySql。

安装 azkaban-web-server

解压缩 azkaban-web-server-0.1.0-SNAPSHOT.zip。

  1. unzip azkaban-web-server-0.1.0-SNAPSHOT.zip
  2. mv azkaban-web-server-0.1.0-SNAPSHOT /opt/azkaban-web-server

创建 SSL 配置,命令:

  1. keytool -keystore keystore -alias jetty -genkey -keyalg RSA

密码均输入azkaban,最后在当前目录生成 keystore 证书文件。将 keystore 考贝到 azkaban web 目录中

  1. mv keystore /opt/azkaban-web-server

修改 azkaban web 服务器配置conf/azkaban.properties,主要包括:
a. 修改时区和首页名称:

  1. # Azkaban Personalization Settings
  2. azkaban.name=ETL Task
  3. azkaban.label=By BI
  4. azkaban.color=#FF3601
  5. azkaban.default.servlet.path=/index
  6. web.resource.dir=web/
  7. default.timezone.id=Asia/Shanghai

b. 修改 MySql 数据库配置

  1. database.type=mysql
  2. mysql.port=3306
  3. mysql.host=localhost
  4. mysql.database=azkaban
  5. mysql.user=azkaban
  6. mysql.password=azkaban
  7. mysql.numconnections=100

c. 修改 Jetty 服务器属性,包括 keystore 的相关配置

  1. # Azkaban Jetty server properties.
  2. jetty.hostname=0.0.0.0
  3. jetty.maxThreads=25
  4. jetty.port=8081
  5. jetty.keystore=keystore
  6. jetty.password=azkaban
  7. jetty.keypassword=azkaban
  8. jetty.truststore=keystore
  9. jetty.trustpassword=azkaban

d. 开启SSL

  1. jetty.use.ssl=true
  2. jetty.ssl.port=8443

e.修改邮件设置(可选)

  1. # mail settings
  2. mail.sender=admin@javachen.space
  3. mail.host=javachen.space
  4. mail.user=admin
  5. mail.password=admin

f. 解压缩azkaban-db-0.1.0-SNAPSHOT.zip,然后进入 mysql 命令行模式:

  1. unzip azkaban-db-0.1.0-SNAPSHOT.zip
  2. $ mysql -uazkaban -pazkaban
  3. mysql> use azkaban
  4. mysql> source azkaban-db-0.1.0-SNAPSHOT/create-all-sql-0.1.0-SNAPSHOT.sql

g. 设置Executor:

  1. #Multiple Executor
  2. azkaban.use.multiple.executors=true
  3. #azkaban.executorselector.filters=StaticRemainingFlowSize,MinimumFreeMemory,CpuStatus
  4. azkaban.executorselector.filters=StaticRemainingFlowSize,CpuStatus
  5. azkaban.executorselector.comparator.NumberOfAssignedFlowComparator=1
  6. azkaban.executorselector.comparator.Memory=1
  7. azkaban.executorselector.comparator.LastDispatched=1
  8. azkaban.executorselector.comparator.CpuUsage=1
  9. executor.port=12321

安装 azkaban-exec-server

解压缩 azkaban-exec-server-0.1.0-SNAPSHOT.zip

  1. unzip azkaban-exec-server-0.1.0-SNAPSHOT.zip
  2. mv azkaban-exec-server-0.1.0-SNAPSHOT /opt/azkaban-exec-server

然后修改配置文件conf/azkaban.properties,包括:
a. 修改时区为:default.timezone.id=Asia/Shanghai
b. 修改 MySql 数据库配置

  1. database.type=mysql
  2. mysql.port=3306
  3. mysql.host=localhost
  4. mysql.database=azkaban
  5. mysql.user=azkaban
  6. mysql.password=azkaban
  7. mysql.numconnections=100

c. 设置executor端口为12321

  1. executor.maxThreads=50
  2. executor.port=12321
  3. executor.flow.threads=30

用户设置

进入 azkaban web 服务器 conf 目录,修改 azkaban-users.xml ,增加管理员用户:

  1. <azkaban-users>
  2. <user groups="azkaban" password="admin027" roles="admin" username="azkaban"/>
  3. <user password="metrics" roles="metrics" username="metrics"/>
  4. <user groups="test" username="test" password="123456" roles="read"/>
  5. <role name="admin" permissions="ADMIN"/>
  6. <role name="metrics" permissions="METRICS"/>
  7. <role name="read" permissions="READ"/>
  8. <role name="write" permissions="WRITE"/>
  9. <role name="execute" permissions="EXECUTE"/>
  10. <role name="schedule" permissions="SCHEDULE"/>
  11. <role name="createprojects" permissions="CREATEPROJECTS"/>
  12. </azkaban-users>

启动服务

azkaban-exec-server,需要在 azkaban-exec-server 目录下执行下面命令:

  1. sh bin/start-exec.sh

激活当前executor:

  1. $ curl -G "localhost:$(<./executor.port)/executor?action=activate" && echo
  2. {"status":"success"}

azkaban-web-server,需要在 azkaban-web-server 目录下执行下面命令:

  1. sh bin/start-web.sh

Docker安装

关于azkaban的docker镜像,可以参考:

这里,我参考上面文章自己制作了azkaban的相关镜像,地址:azkaban-web-serverazkaban-exec-server

azkaban-web-server镜像

azkaban-web-server镜像制作过程:
1、首先从源码编译得到打包后的文件 azkaban-web-server-0.1.0-SNAPSHOT.tar.gz

  1. mkdir azkaban-exec-server azkaban-web-server
  2. wget https://github.com/azkaban/azkaban/archive/3.84.8.zip
  3. unzip 3.84.8.zip
  4. cd azkaban-3.84.8
  5. ./gradlew distTar
  6. cp azkaban-exec-server/build/distributions/azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz ../azkaban-exec-server/
  7. cp azkaban-web-server/build/distributions/azkaban-web-server-0.1.0-SNAPSHOT.tar.gz ../azkaban-web-server/

2、创建Dockerfile:

  1. FROM javachen/alpine-jdk:8
  2. # Azkaban web server port
  3. EXPOSE 8443
  4. COPY azkaban-web-server-0.1.0-SNAPSHOT.tar.gz .
  5. RUN set -eux \
  6. && tar zxf azkaban-web-server-0.1.0-SNAPSHOT.tar.gz \
  7. && mv azkaban-web-server-0.1.0-SNAPSHOT azkaban-web-server \
  8. && rm -rf azkaban-web-server-0.1.0-SNAPSHOT.tar.gz
  9. # Define default workdir
  10. WORKDIR azkaban-web-server
  11. COPY conf/* conf/
  12. COPY run.sh run.sh
  13. RUN chmod +x run.sh
  14. CMD ./run.sh && tail -f /dev/null

3、创建conf目录,存储配置文件:

  • azkaban-users.xml
  • azkaban.properties
  • keystore

4、创建run.sh文件,主要用于设置等待mysql启动之后再启动服务并修改启动服务的命令

  1. #!/bin/bash
  2. DB_LOOPS="20"
  3. MYSQL_HOST="mysql"
  4. MYSQL_PORT="3306"
  5. START_CMD="bin/start-web.sh"
  6. #wait for mysql
  7. i=0
  8. while ! nc $MYSQL_HOST $MYSQL_PORT >/dev/null 2>&1 < /dev/null; do
  9. i=`expr $i + 1`
  10. if [ $i -ge $DB_LOOPS ]; then
  11. echo "$(date) - ${MYSQL_HOST}:${MYSQL_PORT} still not reachable, giving up"
  12. exit 1
  13. fi
  14. echo "$(date) - waiting for ${MYSQL_HOST}:${MYSQL_PORT}..."
  15. sleep 1
  16. done
  17. # Work around to run container as a daemon
  18. sed -i "s/ &//" $START_CMD
  19. curl -G "executor:12321/executor?action=activate" && echo
  20. # mysql -h mysql -uazkaban -pazkaban -e "update executors set active=1 where host='executor';"
  21. # Work around to run container as a daemon
  22. exec $START_CMD

注意:

  • 从run.sh可以看到 azkaban-web-server 依赖 mysql 数据库,其主机名为 mysql ,所以需要部署一个mysql容器,容器名称设置为mysql,当然,你如果想用外置的sql,则可以设置为ip或者域名。

5、编译上传镜像:

  1. docker build -t javachen/azkaban-web-server .
  2. 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:

  1. FROM javachen/alpine-jdk:8
  2. # Azkaban executor port
  3. EXPOSE 12321
  4. COPY azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz .
  5. # coreutils https://www.cnblogs.com/shansongxian/p/10531439.html
  6. RUN apk add --no-cache git coreutils mysql-client mongodb-tools postgresql-client redis \
  7. && tar zxf azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz \
  8. && mv azkaban-exec-server-0.1.0-SNAPSHOT azkaban-exec-server \
  9. && rm -rf azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz
  10. # Define default workdir
  11. WORKDIR azkaban-exec-server
  12. COPY conf/* conf/
  13. COPY run.sh run.sh
  14. RUN chmod +x run.sh
  15. CMD ./run.sh && tail -f /dev/null

3、创建conf目录,存储配置文件:

  • azkaban.properties

4、创建run.sh文件

  1. #!/bin/bash
  2. DB_LOOPS="20"
  3. MYSQL_HOST="mysql"
  4. MYSQL_PORT="3306"
  5. START_CMD="bin/start-exec.sh"
  6. i=0
  7. while ! nc $MYSQL_HOST $MYSQL_PORT >/dev/null 2>&1 < /dev/null; do
  8. i=`expr $i + 1`
  9. if [ $i -ge $DB_LOOPS ]; then
  10. echo "$(date) - ${MYSQL_HOST}:${MYSQL_PORT} still not reachable, giving up"
  11. exit 1
  12. fi
  13. echo "$(date) - waiting for ${MYSQL_HOST}:${MYSQL_PORT}..."
  14. sleep 1
  15. done
  16. sed -i "s/ &//" $START_CMD
  17. # echo "import azkaban create-all-sql.sql to $MYSQL_HOST"
  18. # mysql -h $MYSQL_HOST -uazkaban -pazkaban azkaban < create-all-sql-0.1.0-SNAPSHOT.sql
  19. # Work around to run container as a daemon
  20. exec $START_CMD

注意:

  • 从run.sh可以看到 azkaban-web-server 依赖 mysql 数据库,其主机名为 mysql ,所以需要部署一个mysql容器,容器名称设置为mysql,当然,你如果想用外置的sql,则可以设置为ip或者域名。

5、编译上传镜像:

  1. docker build -t javachen/azkaban-exec-server .
  2. docker push javachen/azkaban-exec-server

docker-compose

创建一个网络:

  1. docker create network traefik

Docker-compose.yaml编排文件:

  1. version: '3'
  2. services:
  3. mysql:
  4. command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
  5. image: mysql:5.7
  6. restart: always
  7. environment:
  8. MYSQL_DATABASE: azkaban
  9. MYSQL_USER: azkaban
  10. MYSQL_PASSWORD: azkaban
  11. MYSQL_ROOT_PASSWORD: 123456
  12. ports:
  13. - "3306:3306"
  14. volumes:
  15. - mysql:/var/lib/mysql
  16. executor:
  17. image: javachen/azkaban-exec-server
  18. restart: always
  19. # 和服务名称保持一致
  20. hostname: executor
  21. environment:
  22. AZKABAN_OPTS: "-Xmx2048m"
  23. ports:
  24. - "12321:12321"
  25. volumes:
  26. - /data/bi_etl:/data/bi_etl
  27. - /data/ods:/data/ods #自定义的数据目录
  28. networks:
  29. - traefik
  30. webserver:
  31. image: javachen/azkaban-web-server
  32. restart: always
  33. environment:
  34. AZKABAN_OPTS: "-Xmx512m"
  35. depends_on:
  36. - executor
  37. networks:
  38. - traefik
  39. ports:
  40. - "8081:8081"
  41. networks:
  42. traefik:
  43. external: true

可以先启动mysql:

  1. docker-compose up -d mysql

然后需要初始化数据库,执行脚本:

  1. docker exec -it mysql_1 bash
  2. mysql -h localhost -uazkaban -pazkaban azkaban < create-all-sql-0.1.0-SNAPSHOT.sql

然后,启动azkaban:

  1. docker-compose up -d