Azkaban安装部署及使用

本文详细介绍了LinkedIn开发的Azkaban任务调度系统,包括其三大组件WebServer、execServer和Mysql的职责,以及从下载编译包、部署规划、数据库配置到实际操作的步骤,还展示了两种配置方式和示例应用。
摘要由CSDN通过智能技术生成

一、概述

Azkaban 是由 Linkedin 公司推出的一个批量工作流任务调度器,主要用于在一个工作流
内以一个特定的顺序运行一组工作和流程,它的配置是通过简单的 key:value 对的方式,通
过配置中的 Dependencies 来设置依赖关系。Azkaban 使用 job 配置文件建立任务之间的依赖
关系,并提供一个易于使用的 web 用户界面维护和跟踪你的工作流。

1、azkaban三大组件

(1)WebServer: 暴露restful, 提供分发作业和调度作业的功能

(2)execServer: 对WebServer暴露api, 提供执行作业的功能

(3)Mysql :数据存储,  实现web和exec之间的数据共享和部分状态的同步

二、安装部署

不建议编译源码安装(有点坎坷!!!)

已提供编译后的tar.gz包(azkaban3.90.0),百度网盘链接如下:

链接:https://pan.baidu.com/s/1bw5TdQCm5ATcrOzhbjWmYQ 
提取码:xiao

0、部署规划

node1:web-server、exe-server、mysql

node2:exe-server

node3:exe-server

1、解压tar.gz

在node1解压:azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz、

azkaban-web-server-0.1.0-SNAPSHOT.tar.gz到安装目录:

/export/server/azkaban-3.90.0/,分别重命名为:azkaban-exec、azkaban-web

2、在node1创建azkaban相关的库/表/用户

# MySQL节点中登陆
mysql -uroot -p
# 配置用户规则
set global validate_password_policy=LOW;
set global validate_password_length=6;
# 创建azkaban用户
create user 'azkaban'@'%' identified by 'azkaban';
# 授权
grant all privileges on *.* to 'azkaban'@'%' identified by 'azkaban';
flush privileges;
# 创建元数据库
source create-all-sql-0.1.0-SNAPSHOT.sql
# 创建表
source /root/reate-all-sql-2.5.0.sql

3、修改mysql配置文件

# vim /etc/my.cnf
max_allowed_packet=1024M

4、 重启mysql

systemctl restart mysqld

5、配置executor-server

路径:在node1的 /export/server/azkaban-3.90.0/azkaban-exec/conf/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/
default.timezone.id=Asia/Shanghai
# Azkaban UserManager class
user.manager.class=azkaban.user.XmlUserManager
user.manager.xml.file=conf/azkaban-users.xml
# Loader for projects
executor.global.properties=conf/global.properties
azkaban.project.dir=projects
# Velocity dev mode
velocity.dev.mode=false
# Azkaban Jetty server properties.
jetty.use.ssl=false
jetty.maxThreads=25
jetty.port=8081
# Where the Azkaban web server is located
azkaban.webserver.url=http://node1:8081
# mail settings
mail.sender=
mail.host=
# User facing web server configurations used to construct the user facing server URLs. They are useful when there is a reverse proxy between Azkaban web servers and users.
# enduser -> myazkabanhost:443 -> proxy -> localhost:8081
# when this parameters set then these parameters are used to generate email links.
# if these parameters are not set then jetty.hostname, and jetty.port(if ssl configured jetty.ssl.port) are used.
# azkaban.webserver.external_hostname=myazkabanhost.com
# azkaban.webserver.external_ssl_port=443
# azkaban.webserver.external_port=8081
job.failure.email=
job.success.email=
lockdown.create.projects=false
cache.directory=cache
# JMX stats
jetty.connector.stats=true
executor.connector.stats=true
# Azkaban plugin settings
azkaban.jobtype.plugin.dir=plugins/jobtypes
# Azkaban mysql settings by default. Users should configure their own username and password.
database.type=mysql
mysql.port=3306
mysql.host=node1
mysql.database=azkaban
mysql.user=azkaban
mysql.password=azkaban
mysql.numconnections=100
# Azkaban Executor settings
executor.maxThreads=50
executor.flow.threads=30
executor.port=12321

分发 /export/server/azkaban-3.90.0/azkaban-exec/ 到其他节点node2、node3的/export/server/azkaban-3.90.0/

6.配置ssl认证

在node1的azkaban-web根目录执行  

路径:/export/server/azkaban-3.90.0/azkaban-web

keytool -keystore keystore -alias jetty -genkey -keyalg RSA

配置密码  hadoop,  再一步步回车就行, 最后yes, 再回车

7、配置web-server

路径:在node1的/export/server/azkaban-3.90.0/azkaban-web/conf/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/
default.timezone.id=Asia/Shanghai

#Azkaban UserManager class
user.manager.class=azkaban.user.XmlUserManager
user.manager.xml.file=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=node1
mysql.database=azkaban
mysql.user=root
mysql.password=hadoop
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
jetty.password=hadoop
jetty.keypassword=hadoop
jetty.truststore=keystore
jetty.trustpassword=hadoop

# Azkaban Executor settings
executor.port=12321

# mail settings
mail.sender=*@163.com
mail.host=smtp.163.com
mail.user=*@163.com
# 邮箱授权码(不是密码)
mail.password=**
lockdown.create.projects=false

cache.directory=cache

8、配置user

路径:在node1的/export/server/azkaban-3.90.0/azkaban-web/conf/azkaban-users.xml

<azkaban-users>
  <user groups="azkaban" password="azkaban" roles="admin" username="azkaban"/>
  <user password="metrics" roles="metrics" username="metrics"/>
  <user password="admin" roles="admin" username="admin"/>

  <role name="admin" permissions="ADMIN"/>
  <role name="metrics" permissions="METRICS"/>
</azkaban-users>

8、在node1、node2、node3的/export/server/azkaban-3.90.0/azkaban-exec/目录分别启动executor

./bin/start-exec.sh

9、激活executor,在node1执行

curl -G 'node1:12321/executor?action=activate' && echo
curl -G 'node2:12321/executor?action=activate' && echo
curl -G 'node3:12321/executor?action=activate' && echo

10、在node1的export/server/azkaban-3.90.0/azkaban-web目录启动web服务

./bin/start-web.sh

11、在web界面:http://node1:8081/

三、案例(一代配置方式)

job文件和sh文件等一起打包到zip

案例一 : 定时打印日志

编写job文件如下 

#job
type=command
command=echo "azkaban"

压缩成zip包,在web界面新建project

上传zip包到azkaban的web界面

点击调度或执行即可(如果点击调度,需要配置调度的时间及周期)

案例二 : 执行脚本

编写脚本及job文件如下

#!/bin/bash
echo '***哈哈哈***' >> /export/server/azkaban/logs/job2.log
#job
type=command
command=sh job02-script.sh

案例三: 多个有依赖关系的job

编写job文件如下

#job1
type=command
command= echo "哈哈哈1" >> /export/server/azkaban/logs/job031.log
#job2
type=command
command= echo "哈哈哈2" >> /export/server/azkaban/logs/job032.log
#job3
type=command
dependencies=job031,job032
command= echo "哈哈哈3" >> /export/server/azkaban/logs/job033.log

案例四: 定时调度jar作业

编写job文件如下(指定待执行的class,  指定jar的位置)

#job
type=javaprocess
java.class=org.example.AzkabanExample
classpath=/export/server/azkaban/lib/*

案例五: 操作hdfs

编写job文件如下

#job
type=command 
command=/opt/module/hadoop-2.7.2/bin/hadoop fs -mkdir /azkaban

案例六: 调度hive脚本

编写hive脚本及job文件如下 (提前把hive脚本等文件放到指定目录)

#!/bin/bash
use default;
drop table student;
create table student(id int, name string) row format delimited fields terminated by ',';
load data local inpath '/root/student.txt' into table student;
select * from student;
#job
type=command
command=/export/server/hive/bin/hive -f /root/job05-hivesql.sql

案例七: 调度spark脚本

编写spark脚本及job文件如下 (提前把hive脚本等文件放到指定目录)

#!/bin/bash
/export/server/spark/bin/spark-submit \
--class com.xiaotian.s05_saveDF.s04_toJDBC \
--master yarn \
--deploy-mode cluster \
--num-executors 1 \
--driver-memory 512m \
--driver-cores 1 \
--executor-memory 512m \
--executor-cores 1 \
/root/scala-project-1.0-SNAPSHOT.jar
#job
type=command
command=sh /root/job06-spark.sh

四、案例(二代配置方式)

注意:project文件和flow文件等一起打包到zip

案例1: 多个job有依赖关系

配置文件一: first.project

#表示使用2代配置文件格式解析flow配置文件
azkaban-flow-version: 2.0

配置文件二: first.flow

nodes: 
    - name: job1
      type: command
      config: 
        command: echo "a------" 
    - name: job2
      type: command
      config: 
        command: echo "b------" 
    - name: job3
      type: command
      # job3依赖job1和job2
      dependsOn: 
        - job1
        - job2
      config: 
        command: echo "c------" 

案例2: 自动失败重试

#表示使用2代配置文件格式解析flow配置文件
azkaban-flow-version: 2.0
nodes:
    - name: job1
      type: command
      config:
        command: sh /root/hh.sh
        retries: 3
        retry.backoff: 5000


案例3: 手动失败重试

一个flow中共有3个job, 在执行到第二个job时失败了, 经修复后, 重新执行flow,  跳过前两个job
或者重新执行,  在重新执行之前把已经执行过的job置灰, 如下图

五、azkaban进阶

条件工作流案例

父job在输出时, 把判断条件保存到 $JOB_OUTPUT_PROP_FILE
子job在运行前先判断 ${job1:wk} 的值是否符合预期

#!/bin/bash
#job1.sh
echo "job1------"
wk=`date +%w`
echo "{\"wk\":$wk}" > $JOB_OUTPUT_PROP_FILE
#!/bin/bash
#job2.sh
echo "job2------"
#flow03.flow
nodes: 
  - name: job1
    type: command
    config: 
      command: sh job1.sh
  - name: job2
    type: command
    dependsOn:
      - job1
    config: 
      command: sh job1.sh
    condition: ${job1:wk} == 1


预定义宏案例

预定义宏会根据父job的完成情况进行判断,  再决定是否执行
可用的预定义宏如下:
all_success 父job全部成功 ,才执行(默认)
all_done 父job全部完成 ,才执行
all_failed 父job全部失败 ,才执行
one_success 父job至少一个成功 ,才执行
one_failed 父job至少一个失败 ,才执行

需求: 有3个job, job1和job2是job3的父job,  只要job1和job2中有一个成功, 则job3才执行

#!/bin/bash
#job1.sh
echo "job1------"
#!/bin/bash
#job2.sh
echo "job2------"
#!/bin/bash
#Job3.sh
echo "job3------"
#flow04.flow
nodes: 
  - name: job1
    type: command
    config: 
      command: sh job1.sh
  - name: job2
    type: command
    config: 
      command: sh job2.sh
  - name: job3
    type: command
    dependsOn:
      - job1
      - job2
    config: 
      command: sh job3.sh
    condition: one_success


邮箱告警/电话告警

配合睿象云实现电话告警

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值