第1节概述
1.1工作流调度系统
一个完整的数据分析系统通常都是由大量任务单元组成:
●shel脚本程序
●java程序
●mapreduce程序
●hive脚本等
各任务单单之间存在时间先后及前后依赖关系为了很好地组织起这样的复杂执行计划,需要一个工作流调度系统来调度任务的执行。
假如,我有这样一个需求, 某个业务系统每天产生20G原始数据,每天都要对其进行处理,处理步骤如下所际:
●通过Hadoop先将原始数据同步到HDFS上;
●借助MapReduce计算框架对原始数据进行转换,生成的数据以分区表的形式存储到多张Hive表中;
●需要对Hive中多个表的数据进行JOIN处理,得到一个明细数据Hive大表;
●将明细数据进行各种统计分析,得到结果报表信息;
●需要将统计分析得到的结果数据同步到业务系统中,供业务调用使用。
1.2工作流调度实现方式
●简单的任务调度
。直接使用linux的crontab;
●复杂的任务调度
。开发调度平台或使用现成的开源调度系统,比如Ooize. Azkaban. Airflow等
1.3 Azkaban与0ozie对比
对市面上最流行的两种调度器,进行对比分析。总体来说,Ooize相比Azkaban是一个重量级的任务调度系统,功能全面,但配置使用
也更复杂。如果可以不在意某些功能的缺失,轻量级调度器Azkaban是很不错的候选对象。
●功能
两者均可以调度mapreduce,pig,java,脚本工作流任务
两者均可以定时执行工作流任务
●工作流定义
Azkaban使用Properties文件定义工作流
Oozie使用XML文件定义工作流
●工作流传参
Azkaban支持直接传参,例如 i n p u t O o z i e 支 持 参 数 和 E L 表 达 式 , 例 如 {input} Oozie支持参数和EL表达式,例如 inputOozie支持参数和EL表达式,例如{s:dirSize(myInputDir))
●定时执行
Azkaban的定时执行任务是基于时间的
Oozie的定时执行任务基于时间和输入数据
●资源管理
Azkaban有较严格的权限控制,如用户对工作流进行读/写/执行等操作
Oozie暂无严格的权限控制
●工作流执行
Azkaban有两种运行模式,分别是solo server mode(executor server和web server部署在同一台节点)和multi server
mode(executor server和web server可以部署在不同节点)
Oozie作为工作流服务器运行,支持多用户和多工作流
1.4 Azkaban特点。
1)兼容任何版本的hadoop.
2)易于使用的Web用户界面。
3)简单的工作流的上传。
4)方便设置任务之间的关系。
5)调度工作流
6)模块化和可插拔的插件机制.
7)认证/授权(权限的工作)。
8)能够杀死并重新启动工作流
9)有关失败和成功的电子邮件提醒.
Azbaban介绍:
Azkaban是由linkedin (领英)公司推出的一个批量工作流任务调度器,用于在-个工作流内以-一个特定的顺序运行一组工作和流程。
Azkaban使用job配置文件建立任务之间的依赖关系,并提供一个易于 使用的web用户界面维护和跟踪你的工作流。
Azkaban定义了-种KV文件(properties)格式来建立任务之间的依赖关系,并提供一个易 于使用的web用户界面维护和跟踪你的工作流。
有如下功能特点:
●Web用户界面
●方便上传工作流
●方便设置任务之间的关系
●调度工作流
架构角色:
mysq|服务器:存储元数据,如项目名称、项目描述、项目权限、任务状态、SLA规则等
AzkabanWebServer:对外提供web服务,使用户可以通过web页面管理。职责包括项目管理、权限授权、任务调度、监控executor.
AzkabanExecutorServer:负责具体的工作流的提交、执行。
第3节Azkaban安装部署
3.1 Azkaban的安装准备工作
下载azkaban :
wget https://github.com/azkaban/azkaban/archive/refs/tags/3.59.0.tar.gz
下载ant
wget https://mirrors.bfsu.edu.cn/apache//ant/binaries/apache-ant-1.9.15-bin.tar.gz
下载maven:
wget https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.tar.gz
下载gradle:
wget https://services.gradle.org/distributions/gradle-7.1-all.zip
安装maven:
cd /usr/local/src
chown hadoop:hadoop apache-ant-1.9.15-bin.tar.gz apache-maven-3.8.1-bin.tar.gz gradle-7.1-all.zip 3.85.4.tar.gz
tar -zxvf apache-maven-3.8.1-bin.tar.gz -C /usr/local/
mv apache-maven-3.8.1 maven
配置环境变量:
vim /etc/profile
##maven
export MAVEN_HOME=/usr/local/maven
export PATH=$PATH:$MAVEN_HOME/bin
source /ect/profile
检查:
mvn -v
创建maven的本地仓位置:
mkdir -p /usr/local/src/m2/repository
配置vim /usr/local/maven/conf/settings.xml文件:
##添加
/usr/local/src/m2/repository
alimaven
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
central
拉取java项目,打包看maven是否成功:
项目地址:https://github.com/yangshilei/java-springboot-learn.git
上传到:/chen/
解压: unzip java-springboot-learn-master.zip
进入learn目录:
cd /chen/java-springboot-learn-master/learn
项目打包:mvn package
安装gradle:
wget https://services.gradle.org/distributions/gradle-7.1-all.zip
发布版本下载:
https://gradle.org/releases/
修改用户组:
chown -R hadoop:hadoop /usr/local/src
解压:
unzip /usr/local/src/gradle-7.1-all.zip -d /usr/local/
mv gradle-7.1 gradle
配置环境变量:
vim /etc/profile
##添加
##gradle
export GRADLE_HOME=/usr/local/gradle
export PATH=$PATH:$GRADLE_HOME/bin
export GRADLE_USER_HOME=/usr/local/src/m2/repository ####gradle需要下载的包,去maven的本地仓库找,若有就不需要再从网上下载,可以提高编译的速度
source /etc/profile
检查环境变量:
gradle -version
ant的安装部署:
下载ant
wget https://mirrors.bfsu.edu.cn/apache//ant/binaries/apache-ant-1.9.15-bin.tar.gz
解压:
tar -xvf /usr/local/src/apache-ant-1.9.15-bin.tar.gz -C /usr/local/
mv /usr/local/apache-ant-1.9.15 /usr/local/ant
配置环境变量:
vim /etc/profile
##ant
export ANT_HOME=/usr/local/ant
export PATH=$PATH:$ANT_HOME/bin
source /etc/profile
检查:
1)ant -version
2)ant -v
开始安装编译azkaban
下载:
cd /usr/local/src
wget https://github.com/azkaban/azkaban/archive/refs/tags/3.59.0.tar.gz
修改用户组:
chown hadoop:hadoop 3.59.0.tar.gz
解压缩:
tar -zxvf /usr/local/src/3.59.0.tar.gz -C /usr/local/
编译:
cd /usr/local/azkaban-3.59.0
#### 修改gradle-wrapper.properties配置文件:【目的:防止从网上下载gradle-4.6-all.zip包】
#### vim /usr/local/azkaban-3.59.0/gradle/wrapper/gradle-wrapper.properties
#### ##找到修改为:distributionUrl=gradle-7.1-all.zip
####
#### 拷贝gradle-7.1-all.zip:
#### cp /usr/local/src/gradle-7.1-all.zip /usr/local/azkaban-3.59.0/gradle/wrapper
安装依赖:
yum -y install git glibc-headers gcc-c++
/usr/local/azkaban-3.59.0/
./gradlew distTar或者./gradlew build installDist -x test
查找编译完成的5个包:
[root@localhost azkaban-3.59.0]# find /usr/local/azkaban-3.59.0 -name "azkaban*.tar.gz"
./azkaban-db/build/distributions/azkaban-db-0.1.0-SNAPSHOT.tar.gz
./azkaban-exec-server/build/distributions/azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz
./azkaban-hadoop-security-plugin/build/distributions/azkaban-hadoop-security-plugin-0.1.0-SNAPSHOT.tar.gz
./azkaban-solo-server/build/distributions/azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz
./azkaban-web-server/build/distributions/azkaban-web-server-0.1.0-SNAPSHOT.tar.gz
相关包作用:
azkaban-db-0.1.0-SNAPSHOT.tar.gz ###初始化数据库相关
azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz ##执行调度相关
azkaban-hadoop-security-plugin-0.1.0-SNAPSHOT.tar.gz ###
azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz ###单机版
azkaban-web-server-0.1.0-SNAPSHOT.tar.gz ###web界面相关
新建azkban-3.59.tar.gz文件夹,将编译好的包复制进去:
mkdir /usr/local/azkaban-3.59.0/azkban-3.59.tar.gz
cp -r `find /usr/local/azkaban-3.59.0 -name "azkaban*.tar.gz"` /usr/local/azkaban-3.59.0/azkban-3.59.tar.gz/
Gradle是一个基于Apache Ant和Apache Maven的项目自动化构建工具。-x test跳过测试(注意联网 下载jar可能会失败、慢)
安装azkabna:
mkdir /usr/local/azkaban
tar -zxvf /usr/local/src/azkaban-web-server-0.1.0-SNAPSHOT.tar.gz -C /usr/local/azkaban/
tar -zxvf /usr/local/src/azkaban-db-0.1.0-SNAPSHOT.tar.gz -C /usr/local/azkaban/
tar -zxvf /usr/local/src/azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz -C /usr/local/azkaban/
cd /usr/local/azkaban/
mv azkaban-db-0.1.0-SNAPSHOT azkaban-sql
mv azkaban-web-server-0.1.0-SNAPSHOT azkaban-web
mv azkaban-exec-server-0.1.0-SNAPSHOT azkaban-exec
chown -R hadoop:hadoop /usr/local/azkaban
修改数据库的配置:
vim /etc/my.cnf
###添加
[mysqld]
max_allowed_packet=1024M
重启数据库:
systemctl restart mysqld
执行sql文件:
scp /usr/local/azkaban/azkaban-sql/create-all-sql-0.1.0-SNAPSHOT.sql master:/usr/local/src/
mysql> show databases;
mysql> create database azkaban;
mysql> use azkaban;
mysql> show tables;
mysql> source /usr/local/src/create-all-sql-0.1.0-SNAPSHOT.sql
mysql> show tables;
生成密钥库【可以不配置】:
keystore 是java的一个工具,生成密钥库后直接拷贝到azkaban的web服务里面
cd /usr/local/azkaban
keytool -keystore keystore -alias jetty -genkey -keyalg RSA 【密码为root123,前后一致即可】
[root@slave2 azkaban]# keytool -keystore keystore -alias jetty -genkey -keyalg RSA
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]:
您的组织单位名称是什么?
[Unknown]:
您的组织名称是什么?
[Unknown]:
您所在的城市或区域名称是什么?
[Unknown]:
您所在的省/市/自治区名称是什么?
[Unknown]:
该单位的双字母国家/地区代码是什么?
[Unknown]:
CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown是否正确?
[否]: y【只能是y,不能是yes,否则会无限循环】
输入 的密钥口令
(如果和密钥库口令相同, 按回车):
再次输入新口令:
Warning:
JKS 密钥库使用专用格式。建议使用 “keytool -importkeystore -srckeystore keystore -destkeystore keystore -deststoretype pkcs12” 迁移到行业标准格式 PKCS12。
将生成的keystore文件放到web中:
mv /usr/local/azkaban/keystore /usr/local/azkaban/azkaban-web/
修改azkaban-web的配置文件:
vim /usr/local/azkaban/azkaban-web/conf/azkaban.properties
###找到修改为绝对路径:
web.resource.dir=/usr/local/azkaban/azkaban-web/web/
default.timezone.id=Asia/Shanghai 【时区改为上海】
user.manager.xml.file=/usr/local/azkaban/azkaban-web/conf/azkaban-users.xml
executor.global.properties=/usr/local/azkaban/azkaban-exec/conf/global.properties
mysql.host=master
mysql.user=root
mysql.password=root123
##配置了keystore需要添加:
jetty.use.ssl=true.
jetty.maxThreads=25
jetty.ssl.port=8443
jetty.port=8081.
jetty.keystore=/usr/local/azkaban/azkaban-web/keystore
jetty.password=root123
jetty.keypassword=root123
jetty.truststore=/usr/local/azkaban/azkaban-web/keystore
jetty.trustpassword=root123
vim /usr/local/azkaban/azkaban-web/conf/azkaban-users.xml
##添加
修改azkaban-exec配置文件:
vim /usr/local/azkaban/azkaban-exec/conf/azkaban.properties
##修改
default.timezone.id=Asia/Shanghai
executor.global.properties=/usr/local/azkaban/azkaban-exec/conf/global.properties
azkaban.webserver.url=http://192.168.1.20:8081 【配置了keystore需要将端口换为8443】
mysql.host=master
mysql.database=azkaban
mysql.user=root
mysql.password=root123
##添加:
executor.port=12321
executor.metirc.reports=true
executor.metirc.milisecinterval.default=60000
vim /usr/local/azkaban/azkaban-exec/plugins/jobtypes/commonprivate.properties
##添加:
azkaban.native.lib=false
memCheck.enable=false
分发azkaban-exec:
rsync -r /usr/local/azkaban/azkaban-exec master:/usr/local/azkaban/
rsync -r /usr/local/azkaban/azkaban-exec slave1:/usr/local/azkaban/
启动azkaban:
先启动azkaban-exec,在启动azkaban-web
cd /usr/local/azkaban/azkaban-exec/bin
./start-exec.sh
##通过sql语句来激活executors:
mysql> use azkaban;
mysql> select * from executors;
mysql> update executors set active=1 where id=1;
###或者通过curl激活
cd /usr/local/azkaban/azkaban-exec
curl -G “slave1:$(<./executor.port)/executor?action=activate” && echo
启动azkaban-web:
cd /usr/local/azkaban/azkaban-web/bin
./start-web.sh
web界面访问不了,看日志显示连接不上数据库:
ERROR [MySQLDataSource] [Azkaban] Failed to find write-enabled DB connection. Wait 15 seconds and retry. No.Attempt = 1
解决思路,先看mysql的权限:mysql> select host,user from user;【所有的机器都可以登录,正常】
再看连接的文件:
azkaban-exec中的连接文件为:mysql-connector-java-5.1.28.jar
我所用的mysql为:mysql-connector-java-8.0.23.jar
打包azkaban-exec下的连接文件,然后替换
启动:azkaban-exec
cd /usr/local/azkaban/azkaban-exec
/usr/local/azkaban/azkaban-exec/bin/start-exec.sh
启动:azkaban-web
cd /usr/local/azkaban/azkaban-web
/usr/local/azkaban/azkaban-web/bin/start-web.sh
在浏览器中输入:
http://192.168.1.20:8081/
用户:admin
密码:admin
azkaban启动脚本:
#!/bin/bash
user=whoami
#hadoop=hadoop
case $1 in
“start”){
for i in master slave1 slave2
do
echo ”============ start u s e r @ user@ user@i azkaban-exec =“
ssh u s e r @ user@ user@i “cd /usr/local/azkaban/azkaban-exec;bin/start-exec.sh”
sleep 5s
ssh u s e r @ user@ user@i “cd /usr/local/azkaban/azkaban-exec;curl -G “$i:$(<./executor.port)/executor?action=activate” && echo”
done
echo ”======== start azkaban-web =“
ssh master “cd /usr/local/azkaban/azkaban-web;bin/start-web.sh”
};;
“stop”){
echo ”======== stop azkaban-web =“
ssh master “cd /usr/local/azkaban/azkaban-web;bin/shutdown-web.sh”
for i in master slave1 slave2
do
echo ”======== stop u s e r @ user@ user@i azkaban-exec =====“
ssh u s e r @ user@ user@i “cd /usr/local/azkaban/azkaban-exec;bin/shutdown-exec.sh”
sleep 5s
done
};;
*){
echo “输入的参数出错”
};;
esac
创建job:【创建流程参考:https://azkaban.readthedocs.io/en/latest/createFlows.html】
job文件中的语法为yaml语法:参考https://www.runoob.com/w3cnote/yaml-intro.html
1)cd /usr/local/azkaban/
mkdir jobs
cd jobs/
touch base.project
vim base.project 【以.project结尾】
##添加
azkaban-flow-version: 2.0 【固定的版本】
vim base.flow 【以.flow结尾】
##添加
nodes:
2)打包:
zip base.zip base.flow base.project
下载到windows本地
3)在azkaban的web界面创建项目:
create project(右上角) -->输入项目的名字和描述
选中这个项目->upload(右上角)