2021-12-30 迈向程序猿的第五十八步

目录

一、azkaban的简介

二、azkaban的系统架构

三、azkaban的安装方式

3.1 Solo Server安装

3.1.1 Solo Server简介

3.1.2 安装步骤

3.2 Multi exec Server安装方式

3.2.1 节点布局

3.2.2 配置mysql

3.2.3 配置web server

3.2.4 配置exec server

四、azkaban的应用

4.1、Flow1.0版本的job流

4.1.1 说明

4.1.2 案例演示1:打印hello world

4.1.3 案例演示2之调用shell指令

4.1.4 案例演示2之执行mr程序

4.1.5 案例演示4之工作流演示

4.1.6 azkaban调度hive脚本

4.1.7 azkaban定时调度任务

4.2、 Flow2.0版本的flow流

五、 azkaban的邮箱警报

六、azkaban的电话报警


一、azkaban的简介

1)官网

https://azkaban.github.io/
Azkaban是LinkedIn创建的批处理工作流任务调度程序,用于运行Hadoop任务。阿兹卡班通过工作依赖关系来解决排序问题,并提供一个易于使用的web用户界面来维护和跟踪您的工作流程。

2)产生背景

1. 一个完整的大数据分析系统通常都是由大量任务单元组成:shell脚本程序,mapreduce程序、hive脚本、spark程序等。
2. 各任务单元之间存在时间先后及前后依赖关系:先后关系、依赖关系、定时执行。
3. 为了很好地组织起这样的复杂执行计划,需要一个工作流调度系统来调度执行。    

3)azkaban的特点

兼容Hadoop的任何版本
易于使用的web UI
简单的web和http工作流上传
项目工作区
调度的工作流
模块化和pluginable
身份验证和授权
跟踪用户操作
邮件提醒失败和成功
SLA警报和自动杀死
重新尝试失败的作业

4)azkaban有oozie的比较

两者在功能方面大致相同,只是Oozie底层在提交Hadoop Spark作业是通过org.apache.hadoop的封装好的接口进行提交,而Azkaban可以直接操作shell语句。在安全性上可能Oozie会比较好。

工作流定义:Oozie是通过xml定义的而Azkaban为properties来定义。

部署过程:Oozie的部署相对困难些,同时它是从Yarn上拉任务日志。

Azkaban中如果有任务出现失败,只要进程有效执行,那么任务就算执行成功,这是BUG,但是Oozie能有效的检测任务的成功与失败。

操作工作流:Azkaban使用Web操作。Oozie支持Web,RestApi,Java API操作。

权限控制:Oozie基本无权限控制,Azkaban有较完善的权限控制,供用户对工作流读写执行操作。

Oozie的action主要运行在hadoop中而Azkaban的actions运行在Azkaban的服务器中。

记录workflow的状态:Azkaban将正在执行的workflow状态保存在内存中,Oozie将其保存在Mysql中。

出现失败的情况:Azkaban会丢失所有的工作流,但是Oozie可以在继续失败的工作流运行

5)常见的调度系统

简单的任务调度:直接使用linux的crontab来定义、shell和python脚本实现

现成开源任务调度: oozie、azkaban和airflow等

复杂的任务调度:自研调度平台

二、azkaban的系统架构

azkaban由三个组件构成

1. web server:   提供了webui接口,用于接收客户端传入的job作业,以及向exec server分发作业
2. exec server : 接收web server分发的作业,并执行。
3. mysql :用于管理Web 和 Exec之间的数据共享和部分状态的同步。

三、azkaban的安装方式

三种方式,分别是源码安装方式、solo模式、multi exec server模式
1.源码安装模式,参考文档。
2.solo模式:  单机模式,指的是azkaban的所有的进程都在一台机器上,而且只有一个exec server
3.multi exec server模式 :指的是exec server有多个,分布在不同的机器节点上

3.1 Solo Server安装

3.1.1 Solo Server简介

这种Solo Server服务是azkaban的单机版,即是单实例,它安装简单,便于学习。他的优点如下:

- 安装简单:不需要mysql实例,它内置h2来做存储。
- 启动简单:web server和executor server都运行在相同进程中。
- 功能齐全:它包含所有azkaban的特征。你可以使用azkaban用这种通用方法并为其安装插件。

3.1.2 安装步骤

1)上传、解压、并更名

[root@xxx01 ~]# tar -zxvf azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz -C /usr/local/
[root@xxx01 ~]# cd /usr/local/
[root@xxx01 local]# mv azkaban-solo-server-0.1.0-SNAPSHOT/ azkaban-solo

2)配置环境变量

[root@xxx01 ~]#  vim /etc/profile
​
#azkaban environment
export AZKABAN_HOME=/usr/local/azkaban-solo
export PATH=$AZKABAN_HOME/bin:$PATH
​
​
[root@xxx01 ~]#  source /etc/profile

3)添加用户

[root@xxx01 ~]# vim $AZKABAN_HOME/conf/azkaban-users.xml
在第四行上添加如下内容:
<user password="admin" roles="metrics,admin" username="admin"/>

到此为止,solo模式安装成功

4)启动azkaban : 注意 必须在azkaban的家里运行启动脚本

[root@xxx01 azkaban-solo]# ./bin/start-solo.sh 

5)打开浏览器

输入ip:8081     如果能打开,就表示安装成功

3.2 Multi exec Server安装方式

3.2.1 节点布局

xxx01    webserver
xxx02    execserver
xxx03    execserver

3.2.2 配置mysql

步骤1)找到create-all-sql-0.1.0-SNAPSHOT.sql脚本

方式1:
    上传安装包里的azkaban-db-0.1.0-SNAPSHOT.tar.gz,在linux上解压,进入里面去找
方式2:
    在windows上解压,然后进入里面找到脚本

步骤2)进入mysql,创建一个azkaban库

create database azkaban;

步骤3)执行脚本

use azkaban;
source /root/create-all-sql-0.1.0-SNAPSHOT.sql

步骤4)保证azkaban这个库是远程授权的

grant all privileges on *.* to root@'%' identified by '@Mmforu45';

步骤5) 修改mysql的配置

(建议修改,如果在重启服务时,报错,就不要修改了)

[root@xxx03 azkaban]# vi /etc/my.cnf
在[mysqld]下添加
max_allowed_packet=1024M
[root@xxx03 ~]# systemctl restart mysqld

3.2.3 配置web server

步骤1)上传、解压、更名

[root@xxx01 ~]# tar -zxvf azkaban-web-server-0.1.0-SNAPSHOT.tar.gz -C /usr/local/
[root@xxx01 ~]# cd /usr/local/
[root@xxx01 local]# mv azkaban-web-server-0.1.0-SNAPSHOT/ azkaban-web

步骤2)配置环境变量(配不配无所谓)

步骤3)导入mysql的驱动包

进入azkaban-web目录下,创建extlib目录,并上传mysql的驱动jar包到extlib目录下
[root@xxx01 local]# cd azkaban-web
[root@xxx01 azkaban-web]# mkdir extlib

步骤4)生成秘钥

[root@qphone01 azkaban-web]# keytool -keystore keystore -alias jetty -genkey -keyalg RSA
​
需要指定秘钥库指令,以及再次确认秘钥库指令,都是123456
一路回车,直到出现“是否正确”,回答y即可

步骤5) 配置azkaban.properties

# Azkaban Personalization Settings
azkaban.name=Test
azkaban.label=My Local Azkaban
azkaban.color=#FF3601
azkaban.default.servlet.path=/index
web.resource.dir=/usr/local/azkaban-web/web
default.timezone.id=Asia/Shanghai
# Azkaban UserManager class
user.manager.class=azkaban.user.XmlUserManager
user.manager.xml.file=/usr/local/azkaban-web/conf/azkaban-users.xml
# Loader for projects
executor.global.properties=/usr/local/azkaban-exec/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.ssl.port=8443
jetty.port=8081
jetty.keystore=keystore
jetty.password=123456
jetty.keypassword=123456
jetty.truststore=keystore
jetty.trustpassword=123456
# Azkaban Executor settings
# 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 mysql settings by default. Users should configure their own username and password.
database.type=mysql
mysql.port=3306
mysql.host=xxx03
mysql.database=azkaban
mysql.user=root
mysql.password=@Mmforu45
mysql.numconnections=100
#Multiple Executor
azkaban.use.multiple.executors=true
#azkaban.executorselector.filters=StaticRemainingFlowSize,MinimumFreeMemory,CpuStatus
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

步骤6) 配置azkaban-users.xml

添加admin用户

<azkaban-users>
  <user groups="azkaban" password="azkaban" roles="admin" username="azkaban"/>
  <user password="metrics" roles="metrics" username="metrics"/>
  <user password="admin" roles="metrics,admin" username="admin"/>
  <role name="admin" permissions="ADMIN"/>
  <role name="metrics" permissions="METRICS"/>
</azkaban-users>

3.2.4 配置exec server

步骤1)上传、解压、更名

[root@xxx02 ~]# tar -zxvf azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz -C /usr/local/
[root@xxx02 ~]# cd /usr/local/
[root@xxx02 local]# mv azkaban-exec-server-0.1.0-SNAPSHOT/ azkaban-exec

步骤2)进入azkaban-exec目录下,创建extlib目录,将mysql的驱动包导入到此目录下

[root@xxx02 local]# cd azkaban-exec
[root@xxx02 azkaban-exec]# mkdir extlib

步骤3) 修改azkaban.properties

[root@xxx02 azkaban-exec]# vi 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=/usr/local/azkaban-web/web
default.timezone.id=Asia/Shanghai
# Azkaban UserManager class
user.manager.class=azkaban.user.XmlUserManager
user.manager.xml.file=/usr/local/azkaban-web/conf/azkaban-users.xml
# Loader for projects
executor.global.properties=/usr/local/azkaban-exec/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://xxx01: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=/usr/local/azkaban-exec/plugins/jobtypes/
# Azkaban mysql settings by default. Users should configure their own username and password.
#azkaban.executorselector.filters=StaticRemainingFlowSize,MinimumFreeMemory,CpuStatus
azkaban.executorselector.filters=StaticRemainingFlowSize,CpuStatus
database.type=mysql
mysql.port=3306
mysql.host=xxx03
mysql.database=azkaban
mysql.user=root
mysql.password=@Mmforu45
mysql.numconnections=100
# Azkaban Executor settings
executor.port=12321               
executor.maxThreads=50
executor.flow.threads=30

5)修改插件文件

[root@xxx02 azkaban-exec]# vi ./plugins/jobtypes/commonprivate.properties
set execute-as-user
execute.as.user=false
memCheck.enabled=false   #添加内存检查关闭 ,否则报错不足3G

到此为止,azkaban-exec配置好了,就差xxx03了,我们可以scp到另一台机器上

[root@xxx02 azkaban-exec]# cd ..
[root@xxx02 local]# scp -r azkaban-exec xxx03:/usr/local/

6)启动测试(建议先重启虚拟机)

zkaban启动的顺序为,先启动executor,再启动web。否则web工程会因为找不到executor而启动失败。

先启动两个exec

[root@xxx02 ~]# cd /usr/local/azkaban-exec
[root@xxx02 azkaban-exec]# ./bin/start-exec.sh
​
[root@xxx03 ~]# cd /usr/local/azkaban-exec
[root@xxx03 azkaban-exec]# ./bin/start-exec.sh

然后查看元数据表executors        

登录你的mysql
查看executors表里的两个active是不是1,如果不是,请修改为1

然后再启动web-server

[root@xxx01 ~]# cd /usr/local/azkaban-web
[root@xxx01 azkaban-web]# ./bin/start-web.sh

然后开心的启动webui吧,xxxxx:8081

四、azkaban的应用

到目前为止,azkaban的工作flow机制分为两种flow机制,一个是比较旧的job流,一个是比较新的flow流。

job流,称之为flow1.0版本,flow流,称之为flow2.0版本

4.1、Flow1.0版本的job流

4.1.1 说明

1. azkaban的job流文件,后缀是.job
	里面必须要有一个type属性 必须赋值
		值可以是:command,java,pig中的一个
2. azkaban执行的job必须要提前打包,打包的格式必须是zip格式
3. 流文件里的书写格式:
	1)一定要注意行末不要有空格
	2)utf-8编码集,如果在window上实在不行,可以上传到linux进行zip压缩,然后下载到windows上,再上传到azkaban上

4.1.2 案例演示1:打印hello world

1)创建一个后缀为.job的文件helloworld,输入内容如下:

type=command
command=echo "hello world"

注意:编码集的问题,最终一定要保证是utf-8编码格式

2) 压缩成zip包

3)上传到azkaban上

1. 首先创建项目
2. 上传到项目下
3. 执行run job
4. 进入就绪界面后,点击execute,运行

注意:

灰色:表示未运行
绿色:运行通过
红色:运行失败
蓝色:正在运行中

4.1.3 案例演示2之调用shell指令

1)编写一个shell脚本calculate.sh

#!/usr/bin/bash
sum=0
for i in $(seq 1 100)
do
	sum=$(( $sum + $i ))
done
echo $sum >> /root/sum.log

2)编写job文件a2.job,调用shell脚本

type=command
command=/usr/bin/bash calculate.sh

3)打包,上传,测试

4.1.4 案例演示2之执行mr程序

1)编写job文件a3.job

type=command
command=/usr/local/hadoop/bin/hadoop jar hadoop-mapreduce-examples-2.6.0-cdh5.13.2.jar wordcount /input /output

2)将hadoop-mapreduce-examples-2.6.0-cdh5.13.2.jar找到,并下载到和a3.job相同的位置

3)打包,上传,测试

注意:hdfs、yarn要启动、input目录是否存在,上传要统计的文件

4.1.5 案例演示4之工作流演示

1)创建b.sh

#!/bin/bash
echo hello_bbb >/root/b.log
sleep 30s

2)创建jobB.job

type=command
command=/bin/bash b.sh

3) 创建a.sh

#!/bin/bash
echo hello_aaa >/root/a.log

4) 创建jobA.job

type=command
dependencies=jobB
command=/bin/bash a.sh

5) 打包,上传,测试

4.1.6 azkaban调度hive脚本

1)创建一个hql脚本:create_table.hql

create database mydb3;
use mydb3;
create table if not exists test1(
sid int,
sname string
)
row format delimited
fields terminated by ',';

2)创建一个job文件:create_table.job

type=command
command=/usr/local/hive/bin/beeline -u jdbc:hive2://qianfeng02:10000 -n root  -f create_table.hql

注意:需要在qianfeng02上开启hiveserver2服务项。

3)打包,上传执行,然后查看吧

4.1.7 azkaban定时调度任务

1)创建一个sh脚本:testcrond.sh

#!/bin/bash
echo "aaaaa" >>/root/crond.log

2)创建一个job文件:testcrond.job

type=command
command=/usr/bin/bash testcrond.sh

3) 打包,上传到azkaban上

4)点击run job或者是execute flow 进入界面,不要立即点击execute,而是点击schedule, 设置定时任务

5)设置完之后,要点击定时任务下面的schedule按钮,继续点击execute

6)来到新界面后,需要点击FLOW列里的job名称,进入执行计划界面

7)再点击Schedule/execute Flow,进入最后界面,点击execute

4.2、 Flow2.0版本的flow流

Azkaban 目前同时支持 Flow 1.0 和 Flow2.0 ,但是官方文档上更推荐使用 Flow 2.0,因为 Flow 1.0 会在将来的版本被移除。Flow 2.0 的主要设计思想是提供 1.0 所没有的流级定义。用户可以将属于给定流的所有 job / properties 文件合并到单个流定义文件中,其内容采用 YAML 语法进行定义,同时还支持在流中再定义流,称为为嵌入流或子流。

4.2.1 基本结构

项目 zip 将包含多个流 YAML 文件,一个项目 YAML 文件以及可选库和源代码。Flow YAML 文件的基本结构如下:

1. 所有的workflow都是在一个文件里写的
2. 文件以流名称为后缀的,如:my-flow-name.flow;
3. 包含 DAG 中的所有节点;
4. 每个节点可以是不同的类型,比如可以是flow,hive,hadoopjava,pig,noop,command
5. 每个节点可以拥有 name, type, config, dependsOn 和 nodes sections 等属性;
6. 通过列出 dependsOn 指定依赖关系
7. 包含与流相关的其他配置
8. flow1.0里的属性都移植到config下,config下是以键值对的形式书写的。

注意:还需要单独写一个xxxx.project文件指定azkaban使用的是workflow2.0版本
azkaban-flow-version: 2.0

4.3 YAML语法

想要使用 Flow 2.0 进行工作流的配置,首先需要了解 YAML 。YAML 是一种简洁的非标记语言,有着严格的格式要求的,如果你的格式配置失败,上传到 Azkaban 的时候就会抛出解析异常。

4.3.1 基本规则

1. 大小写敏感2. 使用缩进表示层级关系 ;3. 缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级;4. 使用#表示注释 ;5. 字符串默认不用加单双引号,但单引号和双引号都可以使用,双引号表示不需要对特殊字符进行转义;6. YAML 中提供了多种常量结构,包括:整数,浮点数,字符串,NULL,日期,布尔,时间。

4.3.2 对象的写法

# value 与 : 符号之间必须要有一个空格
key: value

4.3.3 map的写法:

# 写法一 同一缩进的所有键值对属于一个map
key: 
    key1: value1
    key2: value2

# 写法二
{key1: value1, key2: value2}

4.3.4 数组的写法

# 写法一 使用一个短横线加一个空格代表一个数组项
- a
- b
- c

# 写法二
[a,b,c]

4.3.5 单双引号

s1: '内容\n 字符串'
s2: "内容\n 字符串"

转换后:
{ s1: '内容\\n 字符串', s2: "内容\n 字符串" }

4.3.6 特殊符号

一个 YAML 文件中可以包括多个文档,使用 `---` 进行分割。

4.3.7 配置引用

Flow 2.0 建议将公共参数定义在 `config` 下,并通过 `${}` 进行引用。

4.4 案例介绍

4.4.1 简单案例调度

1)编写一个xxxx.flow文件,比如simple.flow (注意字符集,TAB键等问题)

nodes:

   - name: jobA
     type: command
     config:
        command: echo "this is a simple test"

2)编写版本文件:xxx.project ,比如叫same.project

azkaban-flow-version: 2.0

3)打包成xxx.zip文件,上传,测试

4.4.2 多任务调度

1)编写一个xxxx.flow文件,比如multi.flow (注意字符集,TAB键等问题)

nodes:
  - name: jobE
    type: command
    config:
      command: echo "This is job E"
    # jobE depends on jobD
    dependsOn: 
      - jobD
    
  - name: jobD
    type: command
    config:
      command: echo "This is job D"
    # jobD depends on jobA、jobB、jobC
    dependsOn:
      - jobA
      - jobB
      - jobC

  - name: jobA
    type: command
    config:
      command: echo "This is job A"

  - name: jobB
    type: command
    config:
      command: echo "This is job B"

  - name: jobC
    type: command
    config:
      command: echo "This is job C"

2)编写版本文件:xxx.project ,比如叫same.project

azkaban-flow-version: 2.0

3)打包成xxx.zip文件,上传,测试         

4.4.3 内嵌流调度

1)编写一个xxxx.flow文件,比如embedded.flow (注意字符集,TAB键等问题)

nodes:
  - name: jobC
    type: command
    config:
      command: echo "This is job C"
    dependsOn:
      - embedded_flow

  - name: embedded_flow
    type: flow
    config:
      prop: value
    nodes:
      - name: jobB
        type: command
        config:
          command: echo "This is job B ${prop}"
        dependsOn:
          - jobA

      - name: jobA
        type: command
        config:
          command: echo "This is job A"

2)编写版本文件:xxx.project ,比如叫same.project

azkaban-flow-version: 2.0

3)打包成xxx.zip文件,上传,测试

五、 azkaban的邮箱警报

1)注册一个邮箱

建议是新浪、网易等

2)开启邮箱的第三方客户端协议pop3/smtp/imap

需要手机发送短信进行开启,有一个密码,需要记住。可以备份到电脑,防止忘记。

3)azkaban作为客户端的配置:conf/azkaban.properties

mail.sender=你的邮箱
mail.host=smtp.sina.cn
mail.user=你的邮箱
mail.password=开启pop3/smtp/imap时的密码

下面两个属性,可配可不赔,在azkaban3.0版本以后失效
job.failure.email=mmforu@sina.cn
job.success.email=mmforu@sina.cn

4)重启azkaban的服务

5)案例测试

1. 上传一个案例
2. 进入执行界面,点击Notification
3. 配置失败和成功时通知的邮箱
4. 执行

六、azkaban的电话报警

1)注册瑞祥云账户,最好是邮箱认证

2)进入CA导航里的集成界面,选择email

3)添加相应信息,比如应用名称、邮箱(睿象云的邮箱),然后点击获取AppKey按钮

4)点击配置中的通知策略,配置相应的状态信息,点击保存

5)然后查看一下生成的睿象云的邮箱,复制

6)测试azkaban

1. 上传一个案例
2. 进入执行界面,点击Notification
3. 配置失败和成功时通知的邮箱:睿象云的邮箱
4. 执行

(>...<,距离元旦三天假还剩一天哦~,冲冲冲~)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值