Azkaban
分为三种模式
模式 | 说明 |
---|---|
SoloServer | 一个SoloServer 进程包含了WebServer 和Executor ,使用自带的H2 数据库。 |
WebServer + Executor | 分WebServer 和Executor 两个进程,仍部署在同一台机器上,可使用第三方数据库。 |
WebServer + 多个Executor | 一个WebServer 配合Executor 集群,通过配置的筛选方式选择由哪个Executor 执行。 |
以下配置工作先在一个节点上完成
SoloServer
和WebServer + Executor
,测试完毕后,再加上另一个节点实现WebServer + 多个Executor
的模式。
# 下载
wget --no-cookies --no-check-certificate --header \
"Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" \
"http://download.oracle.com/otn-pub/java/jdk/8u241-b07/1f5b5a70bf22433b84d0e960903adac8/jdk-8u241-linux-x64.tar.gz" -P ~/
# 解压
sudo tar -xf jdk-8u241-linux-x64.tar.gz -C /usr/local/
# 配置
echo -e '\n\n# JDK 1.8' >> ~/.bashrc
echo 'export JAVA_HOME=/usr/local/jdk1.8.0_241' >> ~/.bashrc
echo 'export JRE_HOME=${JAVA_HOME}/jre' >> ~/.bashrc
echo 'export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib' >> ~/.bashrc
echo 'export PATH=$PATH:${JAVA_HOME}/bin' >> ~/.bashrc
# 验证
source ~/.bashrc && java -version
# 更新Apt 并安装,可装在本机,这里装在另一台机器hadoop112 上
ssh hadoop112
sudo apt-get update
sudo apt-get install -y mysql-server # 需设置root 用户密码,这里设为root
# 取消地址绑定,即本机的任何地址都可以连上来
sudo sed -i 's/bind-address/#bind-address/' /etc/mysql/my.cnf
# 允许远程root 用户登录
mysql -u root -proot -e \
"grant all on *.* to root@'%' identified by 'root' with grant option; \
flush privileges; "
# 重启MySQL 服务
sudo service mysql restart
# 安装必要程序
sudo apt update
sudo apt install -y git zip unzip
# 创建操作目录,操作用户为abc
sudo mkdir -p /opt/modules
sudo chown -R `id -u`:`id -g` /opt/modules
# 使用Git Checkout 来编译Release 版,下载zip 包编译出来的是SNAPSHOT 版
# 功能上一样,但发行版看着顺眼,参考https://github.com/azkaban/azkaban 的说明
cd && git clone https://github.com/azkaban/azkaban.git
cd azkaban
git checkout 3.48.0
git branch # 查看本地分支,* (detached from 3.48.0),* 表所在分支
./gradlew clean build -x test # 忽略测试,否则编译不通过,生成tar.gz 和zip 包
./gradlew clean distTar # 推荐,只生成tar.gz 且忽略测试,过程会快一点
# 编译后会出现GradleDaemon 进程,可以jps 获取其进程号然后kill 掉。
# 获取编译文件包,db、web-server、exec-server,solo-server
cd ~/azkaban
cp azkaban-db/build/distributions/azkaban-db-3.48.0.tar.gz ../
cp azkaban-web-server/build/distributions/azkaban-web-server-3.48.0.tar.gz ../
cp azkaban-exec-server/build/distributions/azkaban-exec-server-3.48.0.tar.gz ../
cp azkaban-solo-server/build/distributions/azkaban-solo-server-3.48.0.tar.gz ../
# 主要共三个组件,db、web-server、exec-server,另solo-server 是后面配置备用的
# 解压azkaban 组件包
cd && ls azkaban-*.tar.gz | xargs -n1 tar -xf
# 清理多余的文件
cd && rm -rf azkaban azkaban-*.tar.gz
# 部署azkaban 组件
mkdir /opt/modules/azkaban
mv ~/azkaban-*-3.48.0 /opt/modules/azkaban
cd /opt/modules/azkaban
mv azkaban-db-3.48.0 dbsql
mv azkaban-web-server-3.48.0 webserver
mv azkaban-exec-server-3.48.0 executor
mv azkaban-solo-server-3.48.0 soloserver
# 创建Azkaban MySQL 数据库,注意:-p 后面紧跟密码,不能有空格
#mysql -h hadoop112 -u root -proot -e 'drop database azkaban;' # 删除旧数据库
mysql -h hadoop112 -u root -proot -e 'create database azkaban;'
# 检查数据库azkaban 是否已存在
mysql -h hadoop112 -u root -proot -e 'show databases;'
# 创建Azkaban 相关元数据
mysql -h hadoop112 -u root -proot -D azkaban < /opt/modules/azkaban/dbsql/create-all-sql-3.48.0.sql
# 查看相关Azkaban 的表是否已创建
mysql -h hadoop112 -u root -proot -D azkaban -e 'show tables;'
按照[Azkaban 最新官方配置说明](#Azkaban 最新官方配置说明)对Executor
和WebServer
进行配置。
官方文档会清楚地指出在什么文件例如conf/azkaban.properties
需要设置什么属性及该属性的默认值是什么。
# 配置SSL 证书,keytool 是JDK 提供的工具,除了密码000000,其他都可不填,直接回车跳过
keytool -keystore /opt/modules/azkaban/webserver/keystore -alias jetty -genkey -keyalg RSA
# 如果SSL 证书创建不成功会导致WebServer 的jetty.ssl.port 无法绑定,WebServer 无法启动
# 目录补全,从soloserver 复制文件夹到executor、webserver
cd /opt/modules/azkaban/soloserver
cp -a conf/ plugins/ ../executor
cp -a conf/ plugins/ ../webserver
# 感觉只需要复制plugins 就好
# 创建Executor 和WebServer 的extlib 并拷贝MySQL 驱动
cd /opt/modules/azkaban/executor && mkdir extlib && \
cp lib/mysql-connector-java-5.1.28.jar extlib/
cd /opt/modules/azkaban/webserver && mkdir extlib && \
cp lib/mysql-connector-java-5.1.28.jar extlib/
# 1. executor/conf/azkaban.properties,均使用绝对路径
# 注意,参数=后面不能有空格和写注释
cat > /opt/modules/azkaban/executor/conf/azkaban.properties << 'EOF'
# Azkaban 时区,默认为美国,使用tzselect 命令查看有哪些可用时区
default.timezone.id=Australia/Melbourne
# Azkaban JobTypes Plugins 插件所在位置
azkaban.jobtype.plugin.dir=/opt/modules/azkaban/executor/plugins/jobtypes
# Loader for projects
executor.global.properties=/opt/modules/azkaban/executor/conf/global.properties
azkaban.project.dir=projects
# MySQL参数
database.type=mysql
mysql.port=3306
mysql.host=hadoop112
mysql.database=azkaban
mysql.user=root
mysql.password=root
mysql.numconnections=100
# Azkaban Executor settings
# 最大线程数
executor.maxThreads=50
# 端口号(如修改,请与WebServer 中一致)
executor.port=12321
# 线程数
executor.flow.threads=30
EOF
# 2. executor/conf/log4j.properties
cat > /opt/modules/azkaban/executor/conf/log4j.properties << 'EOF'
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
EOF
# 3. plugins/jobtypes/commonprivate.properties
# 关闭内存检查,避免任务一直处于Running 状态
# executor/conf/azkaban.properties 文件中写上azkaban.jobtype.plugin.dir=plugins/jobtypes
cat > /opt/modules/azkaban/executor/plugins/jobtypes/commonprivate.properties << 'EOF'
# set execute-as-user
execute.as.user=false
# 关闭内存检查
memCheck.enabled=false
EOF
# 1. webserver/conf/azkaban.properties,均使用绝对路径
cat > /opt/modules/azkaban/webserver/conf/azkaban.properties << 'EOF'
# Azkaban Personalization Settings
# 服务器UI 名称,用于服务器上方显示的名字
azkaban.name=Test
# 描述
azkaban.label=My Local Azkaban
# UI 颜色
azkaban.color=#FF3601
azkaban.default.servlet.path=/index
# 默认web server 存放web 文件的目录
web.resource.dir=/opt/modules/azkaban/webserver/web
# 默认时区,默认为美国,使用tzselect 命令查看有哪些可用时区
default.timezone.id=Australia/Melbourne
# Azkaban UserManager class
user.manager.class=azkaban.user.XmlUserManager
# 用户权限管理默认类(绝对路径)
user.manager.xml.file=/opt/modules/azkaban/webserver/conf/azkaban-users.xml
# Loader for projects
# global 配置文件所在位置(绝对路径)
executor.global.properties=/opt/modules/azkaban/webserver/conf/global.properties
azkaban.project.dir=projects
# 数据库类型
database.type=mysql
# 端口号
mysql.port=3306
# 数据库连接主机名或IP
mysql.host=hadoop112
# 数据库实例名
mysql.database=azkaban
# 数据库用户名
mysql.user=root
# 数据库密码
mysql.password=root
# 最大连接数
mysql.numconnections=100
# Velocity dev mode
velocity.dev.mode=false
# Azkaban Jetty server properties.
# Jetty 服务器属性.
# 最大线程数
jetty.maxThreads=25
# Jetty SSL 端口
jetty.ssl.port=8443
# Jetty 端口
jetty.port=8081
# SSL 文件名(绝对路径)
jetty.keystore=/opt/modules/azkaban/webserver/keystore
# SSL 文件密码
jetty.password=000000
# Jetty 主密码与keystore 文件相同
jetty.keypassword=000000
# SSL 文件名(绝对路径)
jetty.truststore=/opt/modules/azkaban/webserver/keystore
# SSL 文件密码
jetty.trustpassword=000000
# Azkaban Executor settings
executor.port=12321
lockdown.create.projects=false
cache.directory=cache
EOF
# 2. webserver/conf/azkaban-users.xml
cat > /opt/modules/azkaban/webserver/conf/azkaban-users.xml << 'EOF'
EOF
# 3. webserver/conf/log4j.properties
cat > /opt/modules/azkaban/webserver/conf/log4j.properties << 'EOF'
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
EOF
# SoloServer 解压就可以直接启动了,使用自带的H2 数据库
/opt/modules/azkaban/soloserver && bin/start-solo.sh # 启动solo
/opt/modules/azkaban/soloserver && bin/shutdown-solo.sh # 停止solo
# 浏览器访问
http://hadoop114:8081
# 默认用户名密码都是azkaban
# 启动,先启动exec-server(执行器),然后启动web-server(web服务)
cd /opt/modules/azkaban/executor && bin/start-exec.sh
cd /opt/modules/azkaban/webserver && bin/start-web.sh
# 在哪里执行就会在哪里产生日志文件及temp、executions、projects 等目录
# 停止,先停web-server,再停executor
cd /opt/modules/azkaban/executor && bin/shutdown-exec.sh
cd /opt/modules/azkaban/webserver && bin/shutdown-web.sh
# 浏览器访问
https://hadoop114:8443
# 用户名密码设置在webserver/conf/azkaban-users.xml 文件中
command是最通用的形式,特别是调用脚本,所有的命令都可以写成shell 脚本
来执行。
# 1. 创建job 文件
cat > first.job << 'EOF'
type=command
command=echo 'This is my first job!'
EOF
# 2. 将job 文件打成zip 包
zip first.job.zip first.job # 生成first.job.zip 文件
## 用什么方式打包zip 都可以,这里用命令行演示
# 3. 在Azkaban 网页上操作
# 3.1 创建Project
## Projects ->Create Project ->Name:first,Description:first ->Create Project
# 3.2 上传任务
## 选择刚创建的'first',Upload ->选择first.job.zip ->Upload
# 3.3 执行任务
## 选择刚创建的'first',Execute Flow ->可看到任务流程,Execute 为执行,Schedule 为设置定时任务
# 0. 创建shell 文件
cat > t.sh << 'EOF'
date > /tmp/1.txt
echo 'shell job done!' >> /tmp/1.txt
EOF
# 1. 创建job 文件
cat > shell.job << 'EOF'
type=command
command=sh ./t.sh
EOF
## 当前路径下执行t.sh
# 2. 将shell 文件、job 文件打成zip 包
zip shell.job.zip t.sh shell.job # 生成shell.job.zip 文件
## 用什么方式打包zip 都可以,这里用命令行演示
# 3. 在Azkaban 网页上操作
# 3.1 创建Project
## Projects ->Create Project ->Name:shelljob,Description:shelljob ->Create Project
# 3.2 上传任务
## 选择刚创建的'shelljob',Upload ->选择shell.job.zip ->Upload
# 3.3 执行任务
## 选择刚创建的'shelljob',Execute Flow ->可看到任务流程,Execute 为执行,Schedule 为设置定时任务
# 3.4 检查任务
## 在Azkaban 部署的节点上
cat /tmp/1.txt # 查看其内容是否符合预期
创建新的Maven 工程
GroupId: abc.com
ArtifactId: javajob
Version: 1.0
Java 代码如下:
package abc.com;
import java.io.FileOutputStream;
public class JavaJob {
public static void main(String[] args) throws Exception {
FileOutputStream fos = new FileOutputStream("/tmp/javajob.txt");
fos.write("JavaJob is done!\r\n".getBytes());
fos.close();
}
}
使用Maven Projects
的package
打包,位置在target/javajob-1.0.jar
。
cat > java.job << 'EOF'
type=javaprocess
java.class=abc.com.JavaJob
classpath=./javajob-1.0.jar
EOF
# 用Gui 的压缩软件打包也是可以的
zip java.job.zip javajob-1.0.jar java.job
# 4.1 创建Project
## Projects ->Create Project ->Name:javajob,Description:javajob ->Create Project
# 4.2 上传任务
## 选择刚创建的'javajob',Upload ->选择java.job.zip ->Upload
# 4.3 执行任务
## 选择刚创建的'javajob',Execute Flow ->可看到任务流程,Execute 为执行,Schedule 为设置定时任务
# 4.4 检查任务
## 在Azkaban 部署的节点上
cat /tmp/javajob.txt # 查看其内容是否符合预期
# 停止WebServer
cd /opt/modules/azkaban/webserver && bin/shutdown-web.sh
# WebServer 配置追加以下邮件提醒内容,注意操作的时候别把原文件给删除了
cd /opt/modules/azkaban/webserver/conf/ && cp azkaban.properties azkaban.properties.bak
cat >> /opt/modules/azkaban/webserver/conf/azkaban.properties << 'EOF'
# 邮件提醒设置
[email protected]
mail.host=smtp.exmail.qq.com
[email protected]
# password 根据提供商不同有可能是邮箱密码或授权码
mail.password=Pass@w0rd
EOF
# 启动WebServer
cd /opt/modules/azkaban/webserver && bin/start-web.sh
# 在Azkaban Web 上
## 选择要执行的Project,例如Projects ->之前创建的shelljob ->Execute Flow
## Notification,勾选以下两项
### Failure Emails 的Override flow email settings.
### Success Emails 的Override flow email settings.
### 并在它们下面的输入框中输入收件人的邮箱地址,两个输入框对应成功和失败两种情况
#### 邮箱地址以分号间隔,例如:[email protected]; [email protected]
# 1. 创建job1
cat > job1.job << 'EOF'
type=command
command=echo 'job1'
EOF
# 2. 创建job2、job3,它们依赖job1
cat > job2.job << 'EOF'
type=command
command=echo 'job2'
dependencies=job1
EOF
cat > job3.job << 'EOF'
type=command
command=echo 'job3'
dependencies=job1
EOF
# 3. 创建job4,它们依赖job2、job3
cat > job4.job << 'EOF'
type=command
command=echo 'job4'
dependencies=job2, job3
EOF
# 4. 将所有job 文件打成zip 包
zip jobs.job.zip job1.job job2.job job3.job job4.job
# 5. 在Azkaban 网页上操作
# 5.1 创建Project
## Projects ->Create Project ->Name:jobs,Description:jobs ->Create Project
# 5.2 上传任务
## 选择刚创建的'jobs',Upload ->选择jobs.job.zip ->Upload
# 5.3 执行任务
## 选择刚创建的'jobs',Execute Flow ->可看到各个job 的依赖关系,点Execute 执行
# 5.4 检查任务
## 任务执行后,所有job 均为绿色且依赖关系正确即可。
# 1. Projects 里点击之前创建的first
# 2. 点一下在Flow 标签下有个向下箭头V,再点击展开的shell
# 3. Job Properties 右边有个蓝色的Edit 按钮,按下它可以修改执行的命令
# 4. 将command 对应的值改为echo ${param},这和编辑.job 文件是一样的操作
# 5. 点击Set/Change Job Description,保存操作
# 6. 回到执行任务的Execute Flow,选择Flow Parameters 添加执行时的参数
# 7. Add Row,添加个param 值为123,Execute 执行任务
# 8. 在首页的History 中找到刚执行的任务,Job List 中Detail 可以看到echo 123,即参数传进去了
# 1. 停止WebServer
cd /opt/modules/azkaban/webserver && bin/shutdown-web.sh
# 2. WebServer 配置追加以下邮件提醒内容,注意操作的时候别把原文件给删除了
cd /opt/modules/azkaban/webserver/conf/ &&\
cp azkaban.properties azkaban.properties.bak &&\
cat >> azkaban.properties << 'EOF'
# Multiple Executor Mode
azkaban.use.multiple.executors=true
# 其他集群属性均使用默认值,更多关于Executor 选择的设置请参考官方文档
EOF
# 3. 停止Executor,删除日志并复制到其他节点,这里是hadoop114 --> hadoop113
cd /opt/modules/azkaban/executor && bin/shutdown-exec.sh
rm -rf *.out # 删除日志文件
ssh hadoop113 'mkdir -p /opt/modules/azkaban' ## 为了统一先创建好目录
scp -r /opt/modules/azkaban/executor hadoop113:/opt/modules/azkaban
# 在Executor 节点上执行,这里是hadoop113 和hadoop114
# 1. 进入Executor 目录
cd /opt/modules/azkaban/executor
# 2. 启动Executor
bin/start-exec.sh
# 3. 查看Executor 状态,MySQL 在hadoop112 上
mysql -h hadoop112 -u root -proot -D azkaban -e 'select * from executors;'
## 没启动一个Executor 表executors 就多一条记录,默认有一条localhost 的
## 查询需要客户端 sudo apt update && sudo apt install -y mysql-client
# 4. 激活Executor 加入到集群中,每个Executor 节点都需要执行
curl -G "localhost:$(<./executor.port)/executor?action=activate" && echo
## -G 表get 方式,$(<./executor.port) 表读取文件内容作为临时变量值,最后echo 换行用
## 此时再查看Executor 状态Active 应该从0 变成1 了
## 另外,吊销Executor 则在该节点上执行,退出集群,实际测试感觉停止Executor 比较靠谱
#curl -G "localhost:$(<./executor.port)/executor?action=deactivate" && echo
# 5. 启动WebServer
cd /opt/modules/azkaban/webserver && bin/start-web.sh
# 1. 创建一个测试job,让其每分钟执行一次
cat > ms.job << 'EOF'
type=command
command=sh -c 'date >> /tmp/ms.txt'
EOF
# 2. 将job 打包成zip
zip ms.job.zip ms.job
# 3. 在Azkaban 网页上操作
# 3.1 创建Project
## Projects ->Create Project ->Name:msjob,Description:msjob ->Create Project
# 3.2 上传任务
## 选择刚创建的'msjob',Upload ->选择ms.job.zip ->Upload
# 3.3 执行任务
## 选择刚创建的'msjob',Execute Flow ->可看到任务流程,Schedule 为设置定时任务,每分钟执行一次
## 创建完定时任务后可以在主页面Projects 右边的Scheduling 里看到,History 里可看到历史执行情况
# 3.4 检查任务
## 过几分钟后,在Executor 的节点上
cat /tmp/ms.txt # 查看其内容是否符合预期
## 发现Web 会一直指派任务到同一个节点,即使该节点deactive,只好停掉其Executor 进程才分配给另一个节点
Azkaban 简介及安装(3.x)
解决Azkaban 执行任务一直Running 状态
Azkaban 多个Executor 部署
Azkaban-3.x 配置信息说明
Azkaban 集群模式安装与execute-as-user 配置
Azkaban 最新官方配置说明