Azkaban安装部署及踩坑记录
零.说明
本次部署采用了Azkaban3.81.0版本,Azkaban从3.x开始官方只提供源码包,不再提供编译后的包,需要我们自己编译
源码包和编译后的包见本页面附件
一.下载源码
下载地址:https://github.com/azkaban/azkaban/releases/tag/3.81.0
二.编译
2.1 解压
sudo tar -xvf /home/tianyafu/azkaban-3.81.0.tar.gz -C /application/
sudo mv azkaban-3.81.0 azkaban_source
2.2 配置gradle
2.2.1 配置gradle镜像仓库
cd /application/azkaban_source
sudo cp ~/build.gradle /application/azkaban_source/
---这里主要是配置为阿里镜像--------------------------------------------------------------------------------------------------------------------------
build.gradle文件中有两处repositories{} 两处都需要修改,删除原先的配置 改为 maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
具体如下:
buildscript {
repositories {
maven{url 'http://maven.aliyun.com/nexus/content/groups/public/'}
}
dependencies {
classpath 'com.cinnober.gradle:semver-git:2.2.3'
classpath 'net.ltgt.gradle:gradle-errorprone-plugin:0.0.14'
classpath 'com.github.jengelman.gradle.plugins:shadow:4.0.0'
}
}
allprojects {
apply plugin:'jacoco'
repositories {
maven{url 'http://maven.aliyun.com/nexus/content/groups/public/'}
}
}
---这里主要是配置为阿里镜像--------------------------------------------------------------------------------------------------------------------------
2.2.2 上传gradle包
cd /application/azkaban_source/gradle/wrapper/
cat gradle-wrapper.properties
里面有如下一行:
distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
说明他会去下载 https://services.gradle.org/distributions/gradle-4.6-all.zip这个包 所以提前下载好 这样方便
拷贝事先下载好的包
sudo cp /home/tianyafu/gradle-4.6-all.zip /application/azkaban_source/gradle/wrapper/
修改配置文件 注释掉原来的配置 改为本地相对路径 编译时就会在本地找到包 不再去下载
sudo vim /application/azkaban_source/gradle/wrapper/gradle-wrapper.properties
distributionUrl=gradle-4.6-all.zip
#distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
2.3 编译
做完上面2步 就万事具备 开始编译 阿里的镜像编译较快 如果中间有编译失败的情况 多为网络原因导致jar包下载失败 多试几次即可
cd /application/azkaban_source
sudo ./gradlew distTar
三.部署
3.1 创建azkaban的目录并创建软连接
cd /application/
sudo mkdir /application/azkaban-3.81.0
sudo ln -s /application/azkaban-3.81.0/ /application/azkaban
3.2 拷贝编译好的tar包
sudo cp /application/azkaban_source/azkaban-exec-server/build/distributions/azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz /application/azkaban/
sudo cp /application/azkaban_source/azkaban-web-server/build/distributions/azkaban-web-server-0.1.0-SNAPSHOT.tar.gz /application/azkaban/
sudo cp /application/azkaban_source/azkaban-db/build/distributions/azkaban-db-0.1.0-SNAPSHOT.tar.gz /application/azkaban
3.3 解压并创建软连接
cd /application/azkaban
sudo tar -xvf azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz
sudo ln -s azkaban-exec-server-0.1.0-SNAPSHOT azkaban-exec-server
sudo tar -xvf azkaban-web-server-0.1.0-SNAPSHOT.tar.gz
sudo ln -s azkaban-web-server-0.1.0-SNAPSHOT azkaban-web-server
sudo tar -xvf azkaban-db-0.1.0-SNAPSHOT.tar.gz
sudo ln -s azkaban-db-0.1.0-SNAPSHOT azkaban-db
3.4 准备azkaban的元数据库
使用mysql
建库
CREATE DATABASE azkaban;
建用户
CREATE USER 'username'@'%' IDENTIFIED BY 'password';
开放远程权限
GRANT SELECT,INSERT,UPDATE,DELETE ON azkaban.* to '<username>'@'%' IDENTIFIED BY 'password' ;
刷新权限
flush privileges ;
执行sql语句:执行create-all-sql-XXX.sql 这个sql文件
source /application/azkaban/azkaban-db/create-all-sql-0.1.0-SNAPSHOT.sql
3.5 配置 executor
cd azkaban-exec-server
3.5.1 创建logs extlib目录
sudo mkdir logs extlib
3.5.2 配置azkaban.properties文件
---------------------主要修改项为-------------------------------------------------------------
#时区改为上海
default.timezone.id=Asia/Shanghai
#修改了web界面的端口与原来保持一致
jetty.port=8082
azkaban.webserver.url=http://xxx:8082
#mysql相关的连接信息
mysql.port=3306
mysql.host=xxx
mysql.database=azkaban
mysql.user=azkaban
mysql.password=数据库密码
#其他配置
azkaban.executorselector.filters=StaticRemainingFlowSize,CpuStatus
azkaban.executorselector.comparator.NumberOfAssignedFlowComparator=1
azkaban.executorselector.comparator.Memory=1
azkaban.executorselector.comparator.LastDispatched=1
azkaban.executorselector.comparator.CpuUsage=1
#指定executor的端口
executor.port=12321
#指定为多executor任务
azkaban.use.multiple.executors=true
---------------------主要修改项为-------------------------------------------------------------
3.6 配置web
cd azkaban-web-server
3.6.1 创建logs extlib plugins temp目录
sudo mkdir logs extlib plugins temp
3.6.2 配置azkaban.properties文件
---------------------主要修改项为-------------------------------------------------------------
#时区改为上海
default.timezone.id=Asia/Shanghai
#修改了web界面的端口与原来保持一致
jetty.port=8082
#mysql相关的连接信息
mysql.port=3306
mysql.host=dsd
mysql.database=azkaban
mysql.user=azkaban
mysql.password=数据库密码
---------------------主要修改项为-------------------------------------------------------------
3.6.3 配置azkaban-users.xml文件
这个主要是配置角色和添加用户 为用户配置角色的xml
3.7 配置环境变量
sudo vim /etc/profile
# AZKABAN_ENV
export AZKABAN_EXECUTOR_HOME=/application/azkaban/azkaban-exec-server
export AZKABAN_WEB_HOME=/application/azkaban/azkaban-web-server
export PATH=${AZKABAN_EXECUTOR_HOME}/bin:${AZKABAN_WEB_HOME}/bin:$PATH
3.8 解压azkaban-solo-server
这个是后面踩了坑才发现有些文件需要从这个里面去拷贝
sudo cp azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz /application/azkaban
sudo tar -xvf azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz
sudo ln -s azkaban-solo-server-0.1.0-SNAPSHOT azkaban-solo-server
3.9 启动和关闭
3.9.1 executor启动和关闭
启动
必须在bin目录外面启动和关闭
因为启动的时候需要生成日志文件 但坑的地方是如果在别的目录下启动 azkaban会在该目录下生成executions目录 projects目录 temp目录 logs目录 executor.port文件 及 日志文件
所以如果不注意启动目录的话 一段时间后你会在各种目录下见到上述4个目录和相应的文件 简直是到处都是
cd $AZKABAN_EXECUTOR_HOME
sudo ./bin/start-exec.sh
关闭:
cd $AZKABAN_EXECUTOR_HOME
sudo ./bin/shutdown-exec.sh
3.9.2 激活executor
curl -G "dsf:12321/executor?action=activate" && echo
curl -G "dsd:12321/executor?action=activate" && echo
curl -G "dse:12321/executor?action=activate" && echo
3.9.3 web启动和关闭
启动WEB界面
必须在bin目录外面起
cd $AZKABAN_WEB_HOME
sudo ./bin/start-web.sh
关闭web:
cd $AZKABAN_WEB_HOME
sudo ./bin/shutdown-web.sh
四.踩坑
4.1 gradle镜像问题
一定要修改为阿里镜像或其他好用的镜像 默认的配置下载jar包非常慢并且经常容易失败
4.2 executor激活
executor每次启动都会在元数据表executors表中插入数据 该表中active字段标识是否激活 该字段给了默认值为0 表示默认不激活
而executor在启动的时候是不会往该字段中插入值的 用的就是默认值 如果没有可用的已激活的executor 那么启动web服务会启动不起来
所以可以将executors表中active字段的默认值修改为1 直接改建表语句且初次部署完成之后还是需要使用上面的激活语句去激活
也可以在启动executor后再shell脚本中将active值update成1 详见 4.9 azkaban executor的id号自增的问题 中的启动脚本
4.3 executor需要分别启动
首先需要先启动executor 才能再启动web服务
既然是分布式executor 但azkaban并没有提供一键启动executor的脚本 需要分别在每台服务器上启动
4.4 executor id是自增的
在元数据表executors表中 executor的id是主键自增的 所以每次重启executor之后id都会变化 如果在任务中指定了具体的executor id
那么 原先的任务就会找不到对应的executor 所以需要固定这个id
4.5 建表语句的坑
原来测试环境的azkaban库默认是latin1字符集的 根据使用习惯,手动改成了utf8mb4字符集 然后执行建表语句的sql文件 出现: Specified key was too long; max key length is 767 bytes错误信息
原因是建表语句中有个varchar(512)字段(建表语句如下),在mysql中 utf8mb4字符集下每个字符最大的字节数为4个字节 而测试环境mysql禁用了innodb_large_prefix参数不管是什么表,索引键前缀限制为767字节
而显然 512*4 超出了767字节 建表语句中类似的表还有很多 所以只好将库的字符集默认为latin1
CREATE TABLE execution_jobs (
exec_id INT NOT NULL,
project_id INT NOT NULL,
version INT NOT NULL,
flow_id VARCHAR(128) NOT NULL,
job_id VARCHAR(512) NOT NULL,
attempt INT,
start_time BIGINT,
end_time BIGINT,
status TINYINT,
input_params LONGBLOB,
output_params LONGBLOB,
attachments LONGBLOB,
PRIMARY KEY (exec_id, job_id, flow_id, attempt)
);
4.6 执行任务出现错误提示Missing required property 'azkaban.native.lib'
azkaban.utils.UndefinedPropertyException: Missing required property 'azkaban.native.lib'
该错误是因为azkaban-exec-server和azkaban-web-server下的plugins/jobtypes目录下的commonprivate.properties文件中没有azkaban.native.lib=false的配置
当然可能连这个commonprivate.properties文件都没有 需要从azkaban-solo-server中去拷贝
sudo cp -r /application/azkaban/azkaban-solo-server/plugins/* /application/azkaban/azkaban-web-server/plugins/
sudo vim/application/azkaban/azkaban-web-server/plugins/jobtypes/commonprivate.properties
添加一行配置项:azkaban.native.lib=false
sudo cp /application/azkaban/azkaban-web-server/plugins/jobtypes/commonprivate.properties /application/azkaban/azkaban-exec-server/plugins/jobtypes/
重启azkaban
4.7 关于azkaban日志的问题
发现azkaban的日志到处都是 甚至在conf目录下也有 仿佛没有固定目录
azkaban的启动脚本/application/azkaban/azkaban-exec-server/bin/start-exec.sh中可以看出在哪个目录下启动executor 日志就产生在哪个目录下
script_dir=$(dirname $0)
# pass along command line arguments to the internal launch script.
${script_dir}/internal/internal-start-executor.sh "$@" >executorServerLog__`date +%F+%T`.out 2>&1 &
所以需要修改start-exec.sh脚本,将日志重定向到一个固定目录 改成如下
script_dir=$(dirname $0)
# pass along command line arguments to the internal launch script.
${script_dir}/internal/internal-start-executor.sh "$@" >${script_dir}/../logs/executorServerLog__`date +%F+%T`.out 2>&1 &
4.8 启动路径的问题
必须在bin目录外面启动和关闭
因为启动的时候需要生成日志文件 但坑的地方是如果在别的目录下启动 azkaban会在该目录下生成executions目录 projects目录 temp目录 logs目录 executor.port文件 及 日志文件
所以如果不注意启动目录的话 一段时间后你会在各种目录下见到上述4个目录和相应的文件 简直是到处都是
4.9 azkaban executor的id号自增的问题
CREATE TABLE `executors` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`host` varchar(64) COLLATE latin1_german1_ci NOT NULL,
`port` int(11) NOT NULL,
`active` tinyint(1) DEFAULT '1',
PRIMARY KEY (`id`),
UNIQUE KEY `host` (`host`,`port`),
KEY `executor_connection` (`host`,`port`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci;
在azkaban的元数据表executors中 executor的id字段是主键自增的 所以当每次重启azkaban的时候 executor id 都会变 而有时我们会使用 useExecutor参数去指定任务在哪台机器上去执行 所以id最好是不变的
如果通过修改上面的建表语句 去掉自增属性 那么azkaban启动的时候是不会往表中写入数据的
所以改成在启动脚本中去修改表中的数据 相当于写死 id
--------------------------------shell脚本--------------------------------
#!/bin/bash
# Start service for azkaban
# source env
. /etc/profile
# Base Env
SCRIPTS_DIR=$(dirname $0)
# User Env For MySQL
HOSTNAME=`hostname -f`
PORT="3306"
USERNAME="xxxxxx"
PASSWORD="xxxxxx"
DBNAME="azkaban"
HOST="xxxxxx"
# Azkaban Status
ACTIVE=1
ID=2
# pass along command line arguments to the internal launch script.
${SCRIPTS_DIR}/internal/internal-start-executor.sh "$@" >${SCRIPTS_DIR}/../logs/executorServerLog__`date +%F+%T`.out 2>&1 &
wait
# MySQL Exc
MYSQL="mysql -u${USERNAME} -p${PASSWORD} -h${HOST} ${DBNAME}"
select_sql="select count(1) from executors where host='${HOSTNAME}'"
update_sql="update executors set id=${ID},active=${ACTIVE} where host='${HOSTNAME}';"
while true
do
res_exec=$($MYSQL -e "$select_sql" 2>/dev/null | sed 1d)
if [[ $res_exec -eq 1 ]];then
break
fi
sleep 3
echo -e "...."
done
# Update
$MYSQL -e "$update_sql" 2>/dev/null
[ $? -eq 0 ] && echo "start ......" || {
echo "stop ......"
}
--------------------------------shell脚本--------------------------------
上面的shell脚本中 不同的机器上需要修改 id值 需要配置mysql的连接信息 需要机器上部署mysql client