azkaban
的配置
①将以下三个jar包上传到linux系统中 /root/software/
azkaban-executor-server-2.5.0.tar.gz
azkaban-sql-script-2.5.0.tar.gz
azkaban-web-server-2.5.0.tar.gz
②在/usr/local
下创建azkaban
目录
mkdir /usr/local/azkaban
③将三个jar包解压到/usr/local/azkaban
下
tar -zxvf azkaban-executor-server-2.5.0.tar.gz -C /usr/local/azkaban
tar -zxvf azkaban-sql-script-2.5.0.tar.gz -C /usr/local/azkaban
tar -zxvf azkaban-web-server-2.5.0.tar.gz -C /usr/local/azkaban
④更名
cd /usr/local/azkaban
mv azkaban-executor-2.5.0 executor
mv azkaban-web-2.5.0 server
⑤azkaban脚本导入
#获取需要执行的sql的脚本全路径
cd azkaban-2.5.0/
ll
#---->下面是查看到的sql脚本,后面需要执行的是create-all-sql-2.5.0.sql,这个主要是一些建表语句
-rwxr-xr-x 1 root root 129 4月 22 2014 create.active_executing_flows.sql
-rwxr-xr-x 1 root root 216 4月 22 2014 create.active_sla.sql
-rwxr-xr-x 1 root root 4694 4月 22 2014 create-all-sql-2.5.0.sql
-rwxr-xr-x 1 root root 610 4月 22 2014 create.execution_flows.sql
-rwxr-xr-x 1 root root 519 4月 22 2014 create.execution_jobs.sql
-rwxr-xr-x 1 root root 358 4月 22 2014 create.execution_logs.sql
-rwxr-xr-x 1 root root 224 4月 22 2014 create.project_events.sql
-rwxr-xr-x 1 root root 227 4月 22 2014 create.project_files.sql
-rwxr-xr-x 1 root root 280 4月 22 2014 create.project_flows.sql
-rwxr-xr-x 1 root root 285 4月 22 2014 create.project_permissions.sql
-rwxr-xr-x 1 root root 294 4月 22 2014 create.project_properties.sql
-rwxr-xr-x 1 root root 380 4月 22 2014 create.projects.sql
-rwxr-xr-x 1 root root 325 4月 22 2014 create.project_versions.sql
-rwxr-xr-x 1 root root 155 4月 22 2014 create.properties.sql
-rwxr-xr-x 1 root root 498 4月 22 2014 create.schedules.sql
-rwxr-xr-x 1 root root 189 4月 22 2014 create.triggers.sql
-rwxr-xr-x 1 root root 22 4月 22 2014 database.properties
-rwxr-xr-x 1 root root 671 4月 22 2014 update-all-sql-2.1.sql
-rwxr-xr-x 1 root root 156 4月 22 2014 update-all-sql-2.2.sql
-rwxr-xr-x 1 root root 395 4月 22 2014 update.execution_logs.2.1.sql
-rwxr-xr-x 1 root root 59 4月 22 2014 update.project_properties.2.1.sql
#获取当前路径
pwd
#---->路径为
/usr/local/azkaban/azkaban-2.5.0
#进入mysql
mysql -uroot -pRoot123*
#创建azkaban数据库
mysql> create database azkaban;
mysql> use azkaban;
#加载脚本create-all-sql-2.5.0.sql
source /usr/local/azkaban/azkaban-2.5.0/create-all-sql-2.5.0.sql
#查看以下都有哪些表,可以看到建表成功了
mysql> show tables;
+------------------------+
| Tables_in_azkaban |
+------------------------+
| active_executing_flows |
| active_sla |
| execution_flows |
| execution_jobs |
| execution_logs |
| project_events |
| project_files |
| project_flows |
| project_permissions |
| project_properties |
| project_versions |
| projects |
| properties |
| schedules |
| triggers |
+------------------------+
#退出mysql
exit;
⑥生成密钥对和证书
#在server根目录下执行以下命令
cd /usr/local/azkaban/server
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
输入 <jetty> 的密钥口令
(如果和密钥库口令相同, 按回车): #这里博主选择的是y
#到这里密钥对和证书就成功生成了,先在查看一下,公钥存在证书中,私钥存在jetty中
#在server的根路径下生成了keystore文件XXX
[root@hadoop01 server]#keytool -keystore keystore -list
输入密钥库口令: #输入之前设置的密码
密钥库类型: XXX #值做了脱敏处理
密钥库提供方: XXX #值做了脱敏处理
您的密钥库包含 1 个条目
jetty, 2020-7-22, XXX,
证书指纹 (SHA1): XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
⑦配置webServer
#
cd /usr/local/azkaban/server/conf
vi azkaban.properties
#---->下面是文件内容
#Azkaban Personalization Settings
azkaban.name=Test
azkaban.label=My Local Azkaban
azkaban.color=#FF3601
azkaban.default.servlet.path=/index
web.resource.dir=web/ #<--- 修改为绝对路径 web是在 /usr/local/azkaban/server/web/
default.timezone.id=America/Los_Angeles #<---修改时区为 Asia/Shanghai
#Azkaban UserManager class
user.manager.class=azkaban.user.XmlUserManager
user.manager.xml.file=conf/azkaban-users.xml #<---这里是设置用户名密码的配置文件,路径修改为全路径 /usr/local/azkaban/server/conf/azkaban-users.xml
#Loader for projects
executor.global.properties=conf/global.properties
azkaban.project.dir=projects
database.type=mysql
mysql.port=3306
mysql.host=localhost #<---主机名改为配置azkaban服务端的节点的主机名
mysql.database=azkaban
mysql.user=azkaban #用户修改为 root
mysql.password=azkaban #填写mysql的密码
mysql.numconnections=100
# Velocity dev mode
velocity.dev.mode=false
# Azkaban Jetty server properties.
jetty.maxThreads=25
jetty.ssl.port=8443
jetty.port=8081
jetty.keystore=keystore #<---修改为全路径,/usr/local/azkaban/server/keystore #<---
jetty.password=password #<---修改为之前配置的密码 这里是123456
jetty.keypassword=password #<---修改为之前配置的密码 这里是123456
jetty.truststore=keystore #<---可设置为与jetty.keystore相同的路径,/usr/local/azkaban/server/keystore
jetty.trustpassword=password #<---可设置为与jetty.password相同的密码
# Azkaban Executor settings
executor.port=12321
# mail settings
mail.sender=
mail.host=
job.failure.email=
job.success.email=
lockdown.create.projects=false
cache.directory=cache
#---->保存退出
#配置azkaban-users.xml文件,添加用户admin
vi azkaban-users.xml
#----->下面是文件内容
<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"/> <!-- 此行为新增内容,添加用户admin,密码admin,角色为admin -->
<role name="admin" permissions="ADMIN" />
<role name="metrics" permissions="METRICS"/>
</azkaban-users>
-------------------------azkaban的webServer配置完成--------------------------
⑧配置executor的配置文件
cd /usr/local/azkaban/executor/conf
vi azkaban.properties
#--->下面是文件内容
#Azkaban
default.timezone.id=America/Los_Angeles #<----修改时区 Asia/Shanghai
# Azkaban JobTypes Plugins
azkaban.jobtype.plugin.dir=plugins/jobtypes
#Loader for projects
executor.global.properties=conf/global.properties #<---更改为全路径 /usr/local/azkaban/executor/conf/global.properties
azkaban.project.dir=projects
database.type=mysql
mysql.port=3306
mysql.host=localhost #<----修改为配置executor节点的主机名
mysql.database=azkaban2 #这里修改为azkaban
mysql.user=azkaban #<---用户修改为 root
mysql.password=azkaban #<----密码修改为mysql密码
mysql.numconnections=100
# Azkaban Executor settings
executor.maxThreads=50
executor.port=12321
executor.flow.threads=30
#保存退出
⑨时间同步(时间同步前有开启集群的需要先关闭集群,否则可能会导致节点异常,azkaban的时间就是服务所在节点的时间)
方法一:
#所有节点同时执行,拷贝Asia/Shanghai时区文件到/etc/下,并覆盖之前的localtime
cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
方法二(自动同步网络时间,需要网络)
美国标准技术院时间服务器:time.nist.gov(192.43.244.18)
上海交通大学网络中心NTP服务器地址:ntp.sjtu.edu.cn(202.120.2.101)
中国国家授时中心服务器地址:cn.pool.ntp.org(210.72.145.44)
ntpdate cn.pool.ntp.org
方法三:搭建时间服务器
-------------------------azkaban的executor配置完成--------------------------
⑨启动azkaban web服务端
cd /usr/local/azkaban/
./server/bin/azkaban-web-start.sh
#启动起来后回车,继续下面的操作
jps
#---->能看到下面的进程启动了
AzkabanWebServer
⑩启动executor
./executor/bin/azkaban-executor-start.sh
#jps查看进程是否启动
jps
#---->可以看到有下面的进程
AzkabanExecutorServer
测试是否能够在浏览器打开azkaban的网页
在地址栏需要手动输入https://hostname:8443
选择高级
点击继续前往,会出现登录页面,输入配置azkaban时定义的用户名和密码,点击login,完成登录
成功登录azkaban
azkaban的停止命令
先停止executor
cd /usr/local/azkaban
executor/bin/azkaban-executor-shutdown.sh
#可以通过jps查看executor进程是否停止
在停止server
server/bin/azkaban-web-shutdown.sh
#可以通过jps查看executor进程是否停止
azkaban实战
azkaban内置的任务类型支持command,java
command任务类型即可支持很多类型的任务,例如hive,sqoop,mr等
任务要求
需要写一个.job结尾的文件,文件格式为
type=command
command=命令
文件最后打成zip压缩包,然后上传到azkaban网页上,然后可以选择调度执行(schedule)或立即执行(execute)
执行一个shell脚本
方法一,在job中指定脚本的绝对路径
在.job文件中定义脚本的绝对路径,使得最后只对.job文件打包即可
①定义脚本
cd /usr/local
vi test.sh
#脚本内容如下
#!/bin/bash
date >> /usr/local/date.txt
②创建job文件
在windows系统中创建test.job
内容为
type=command
#绝对路径
command=/usr/local/test.sh
③只将test.job打包成zip文件
④上传至azkaban,然后每一分钟执行一次,最后可以在linux系统中的date.txt文件中查看打印的时间信息
方法二,在job中指定脚本的相对路径
这种方式要求.job文件和脚本打成一个zip包,并且文件是在同级目录
①在windows系统中定义脚本test2.sh
#!/bin/bash
date >> /usr/local/date2.txt
②创建job文件
在windows系统中创建test2.job
内容为
type=command
#绝对路径
command=sh test2.sh
③对test2.job和test2.sh打成zip包,并上传,执行,查看date2.txt
多任务工作流
一共四个任务,任务的执行先后如下
首先执行first.job,然后second.job和third.job是并行执行的,这两个任务执行结束,最后执行fourth.job
在windows系统中创建四个job文件,内容如下
①first.job
type=command
command=echo 'this is the first job'
②
type=command
command=echo 'this is the second job'
dependencies=first
③
type=command
command=echo 'this is the third job'
dependencies=first
④
type=command
command=echo 'this is the fourth job'
dependencies=second,third
最后把四个.job文件打包成zip,上传azkaban,运行
可以看到azkaban页面自动识别出四个作业的先后关系并执行
调度java程序
①写个java程序
package com.baidu;
import java.io.FileOutputStream;
import java.io.IOException;
public class JavaJob {
public static void main(String[] args) {
FileOutputStream fo = null;
try {
fo = new FileOutputStream("/usr/local/java.txt");
fo.write("hello world".getBytes());
fo.flush();
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(fo != null){
fo.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
②maven打包,生成一个jar包java_job-1.jar
③创建一个java.job文件
type=javaprocess
java.class=com.baidu.JavaJob
classpath=java_job-1.jar
④将jar包和.job文件打包,上传到azkaban,执行后查看/usr/local/java.txt是否打印出"hello world"
调度HDFS操作任务
①准备一个文件word.txt
并上传到hdfs的/input
目录
hine, bright morning light
now in the air the spring is coming
sweet blowing wind
singing down the hills and valleys
keep your eyes on me
now we're on the edge of hell
dear my love, sweet morning light
wait for me, you've gone much farther, too far
②创建一个hdfs.job
type=command
command=hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar wordcount /input /output
③将job打包成zip,上传zakaban,运行,可以在hdfs的/output目录下下载输出结果,查看
调度一个hive任务
在linux系统中准备一个/usr/local/student.txt文件
zhangsan 15
lisi 12
wangwu 20
hanmei 17
honghong 15
创建一个hive.sql
use default;
drop table if exists student;
create table if not exists student(
sname string,
age int
)
row format delimited fields terminated by '\t';
load data local inpath '/usr/local/student.txt' overwrite into table student;
insert overwrite local directory 'usr/local/result.txt'
row format delimited fields terminated by '\t'
select * from student;
创建一个hive.job
type=command
command=hive -f './hive.sql'
将hive.job和hive.sql打成zip包,上传azkaban,运行前需要启动hive,执行成功后,查看是否生成了result.txt文件并有内容
文件目录在/usr/local/azkaban/executions/下
配置邮件发送方
不建议使用126邮箱,因为它会将azkaban发送的邮件认为是垃圾邮件。
cd /usr/local/zakaban/server/conf
vi azkaban.properties
#---->修改以下内容
# mail settings
#发送方邮箱,这里使用163邮箱
mail.sender=[email protected]
#163邮箱的服务器域名或ip
mail.host=smtp.163.com
#添加以下内容
#邮箱的用户,使用发送方的邮箱
mail.user=[email protected]
#注意这里不是邮箱的密码,而是360邮箱的客户端授权码
mail.password=VVVVVV
邮件的接收方是在azkaban的页面上配置的
设置步骤如下
①在azkaban页面上进入flows界面,点击Execute Flow
②点击Notification 消息按钮
③在下面的页面设置邮件接收方的地址
azkaban的传参功能
①
②
③
④
⑤现在你会发现再次执行这个任务会失败,并且抛出异常
#日志如下
23-07-2020 16:26:55 CST first INFO - Starting job first at 1595492815886
23-07-2020 16:26:55 CST first INFO - Building command job executor.
23-07-2020 16:26:56 CST first ERROR - Failed to build job executor for job firstCould not find variable substitution for variable(s) [command->param]
23-07-2020 16:26:56 CST first ERROR - Failed to build job type
23-07-2020 16:26:56 CST first ERROR - Job run failed preparing the job.
23-07-2020 16:26:56 CST first INFO - Finishing job first at 1595492816078 with status FAILED
意思就是找不到我们定义的变量param的值,因为我们没有设置
⑥点击executor Flow
23-07-2020 16:35:27 CST first INFO - Starting job first at 1595493327441
23-07-2020 16:35:27 CST first INFO - Building command job executor.
23-07-2020 16:35:27 CST first INFO - 1 commands to execute.
23-07-2020 16:35:27 CST first INFO - Command: echo this is a changed value
23-07-2020 16:35:27 CST first INFO - Environment variables: {JOB_OUTPUT_PROP_FILE=/usr/local/azkaban/executions/28/first_output_885397311363421316_tmp, JOB_PROP_FILE=/usr/local/azkaban/executions/28/first_props_604602477140506059_tmp, JOB_NAME=first}
23-07-2020 16:35:27 CST first INFO - Working directory: /usr/local/azkaban/executions/28
23-07-2020 16:35:27 CST first INFO - this is a changed value <-----看这里
23-07-2020 16:35:27 CST first INFO - Process completed successfully in 0 seconds.
23-07-2020 16:35:27 CST first INFO - Finishing job first at 1595493327508 with status SUCCEEDED