Azkaban 3.48 编译安装测试(自己总结)

Azkaban 3.48 编译安装测试(自己总结)

Azkaban 运行模式

Azkaban分为三种模式

模式 说明
SoloServer 一个SoloServer进程包含了WebServerExecutor,使用自带的H2数据库。
WebServer + Executor WebServerExecutor两个进程,仍部署在同一台机器上,可使用第三方数据库。
WebServer + 多个Executor 一个WebServer配合Executor集群,通过配置的筛选方式选择由哪个Executor执行。

以下配置工作先在一个节点上完成SoloServerWebServer + Executor,测试完毕后,再加上另一个节点实现WebServer + 多个Executor的模式。

环境准备

JAVA 安装

# 下载
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

MySQL 安装

# 更新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 掉。

安装配置

部署azkaban

# 获取编译文件包,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

导入MySQL 元数据

# 创建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 最新官方配置说明](#Azkaban 最新官方配置说明)对ExecutorWebServer进行配置。
官方文档会清楚地指出在什么文件例如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/

配置 Executor

# 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

配置 WebServer

# 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'
<azkaban-users>
  <user username="azkaban" password="azkaban" roles="admin" groups="azkaban"/>
  <user username="metrics" password="metrics" roles="metrics"/>
  <user username="admin" password="admin" roles="admin,metrics"/>
  <role name="admin" permissions="ADMIN" />
  <role name="metrics" permissions="METRICS"/>
</azkaban-users>
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

# SoloServer 解压就可以直接启动了,使用自带的H2 数据库
/opt/modules/azkaban/soloserver && bin/start-solo.sh  # 启动solo
/opt/modules/azkaban/soloserver && bin/shutdown-solo.sh  # 停止solo

# 浏览器访问
http://hadoop114:8081
# 默认用户名密码都是azkaban

WebServer+Executor

# 启动,先启动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

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 为设置定时任务

调用shell

# 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  # 查看其内容是否符合预期

调用javaprocess

1. 使用IDEA 创建jar 包

创建新的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 Projectspackage打包,位置在target/javajob-1.0.jar

2. 创建job 文件

cat > java.job << 'EOF'
type=javaprocess
java.class=abc.com.JavaJob
classpath=./javajob-1.0.jar
EOF

3. 将jar 文件、job 文件打成zip 包

# 用Gui 的压缩软件打包也是可以的
zip java.job.zip javajob-1.0.jar java.job

4. 在Azkaban 网页上操作

# 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,即参数传进去了

Executor 集群

集群配置

# 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 最新官方配置说明

发布了27 篇原创文章 · 获赞 4 · 访问量 9690

猜你喜欢

转载自blog.csdn.net/yoshubom/article/details/104721176