Azkaban安装部署及踩坑记录

2020-05-09  本文已影响0人  guaren2009

零.说明

本次部署采用了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

上一篇下一篇

猜你喜欢

热点阅读