工作流调度 Azkaban 简介和安装

工作流调度器azkaban

https://azkaban.readthedocs.io/en/latest/getStarted.html

一、课前准备

  1. 安装VMware虚拟化软件
  2. 安装CentOS 7虚拟机3个
  3. 安装3节点的hadoop集群
  4. 安装了hive
  5. 安装了zookeeper集群
  6. 安装了hbase集群

二、课堂主题

  1. azkaban架构
  2. azkaban运行模式
  3. azkaban安装部署
  4. azkaban使用

三、课堂目标

  1. 理解azkanban架构
  2. 完成azkaban安装部署
  3. 学会azkaban各种使用方式

四、知识要点

1. 概述

1. 为什么需要工作流调度系统

  • 一个完整的数据分析系统通常都是由大量任务单元组成:
    • shell脚本程序,java程序,mapreduce程序、hive脚本等
    • 各任务单元之间存在时间先后及前后依赖关系
    • 为了很好地组织起这样的复杂执行计划,需要一个工作流调度系统来调度执行;
  • 例如,我们可能有这样一个需求,某个业务系统每天产生20G原始数据,我们每天都要对其进行处理,处理步骤如下所示:
    • 通过Hadoop先将原始数据同步到HDFS上;
    • 借助MapReduce计算框架对原始数据进行转换,生成的数据以分区表的形式存储到多张Hive表中;
    • 需要对Hive中多个表的数据进行JOIN处理,得到一个明细数据Hive宽表;
    • 将明细数据进行各种统计分析,得到结果报表信息;
    • 需要将统计分析得到的结果数据同步到业务系统中,供业务调用使用。

2. 工作流调度实现方式

  • 简单的任务调度:直接使用linux的crontab来定义;

  • 复杂的任务调度:开发调度平台或使用现成的开源调度系统,比如ooize、azkaban、airflow、dophinschedule等

2. Azkaban介绍

  • Azkaban是由Linkedin开源的一个批量工作流任务调度器。用于在一个工作流(work flow)内以一个特定的顺序运行一组工作和流程。

  • Azkaban定义了一种KV格式文件(properties)来建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。

  • 它有如下功能特点:

    • 提供功能清晰、简单易用的web UI界面

    • 方便上传工作流

    • 调度工作流

    • 能够杀死并重新启动工作流

    • 工作流和任务的日志记录和审计

    • 提供job配置文件快速建立任务和任务之间的关系

    • 提供模块化的可插拔机制,原生支持command、java、hive、hadoop

    • 安全性高:认证/授权(权限的工作)

    • 提供分布式的多个执行服务器executor

    • 提供conditional workflow工作流

3. azkaban的基本架构

img

  • Azkaban由三部分构成
    • 1、Azkaban Web Server
      提供了Web UI,是azkaban的主要管理者,包括 project 的管理,认证,调度,对工作流执行过程的监控等。
    • 2、Azkaban Executor Server
      负责具体的工作流和任务的调度提交
    • 3、Mysql
      用于保存项目、日志或者执行计划之类的信息

4. Azkaban架构的三种运行模式

1. solo server mode(单机模式)

  • solo server mode是azkaban的一个独立的实例

  • 易于安装:不需要安装mysql,它内置了H2数据库,作为它的底层持久化存储

  • 易于开始使用:管理服务器web server和执行服务器execute server都在一个进程中运行,任务量不大项目可以采用此模式

  • 包含azkaban所有的功能

  • 有兴趣的同学,可以参考官网文档

2. two server mode

  • web server 和 executor server运行在不同的进程
  • 数据库为mysql,管理服务器和执行服务器在不同进程
  • 这种模式下,管理服务器和执行服务器互不影响。

3. multiple executor mode

  • web server 和 executor server运行在不同的进程,executor server有多个
  • 该模式下,执行服务器和管理服务器分别部署,且执行服务器可以在不同服务器上有多个运行的实例。

5. Azkaban安装部署

1. 编译azkaban

建议:直接使用老师编译出来的安装包进行安装

所以“编译azkaban”这个步骤,可以做个了解即可,不用亲自动手编译

1、下载源码包

这里选用azkaban4.0.0这个版本的源码进行重新编译,编译完成之后得到我们需要的安装包,然后进行安装

注意:

  • 使用Gradle编译azkaban源码
  • 需要使用jdk1.8或更高的版本来进行编译
  • 先获得azkaban源码
  • 浏览器访问地址https://github.com/azkaban/azkaban/releases

下载源码包

image-20210318164312734

  • 或者使用命令下载

2、修改build.gradle
  • azkaban-4.0.0.tar.gz源码包上传到编译源码的虚拟机的/export/softwares目录,然后解压并编译

    提示:最好有一个虚拟机,专门用于编译各种框架的源码

使用gradle进行编译源码,此过程中

  • 需要去maven的仓库中下载各种jar包等文件,为了提高下载的速度,可以配置成从国内的maven仓库下载文件
  • 方法如下

在如下2个位置添加maven仓库url

位置①

image-20210318170454256

位置②

image-20210318170325962

3、开始编译

  • 编译成功

image-20210323145150033

编译之后,获得安装包如下

4、azkaban-exec-server

编译完成之后得到我们需要的安装包在以下目录下即可获取得到azkaban-exec-server存放目录

image-20210318171406141

5、azkaban-web-server

azkaban-web-server存放目录

image-20210318171623513

6、azkaban-solo-server

azkaban-solo-server存放目录

image-20210318171757237

7、execute-as-user.c

azkaban two server模式下需要的C程序在这个路径下面

image-20210318171924253

8、数据库脚本文件

数据库脚本文件在这个路径下面

image-20210318172146694

如果不想手动编译可以直接使用我这里编译好的文件,百度网盘链接:https://pan.baidu.com/s/14owbePcSBXBW_bwyLTVVNQ
提取码:NIIT

2. multiple executor模式安装

前提:某节点已经安装mysql,此文档以node03已经安装mysql为例

若没有特殊说明,所有操作都是使用hadoop普通用户操作

在node03节点操作

1. 确认所需软件:

Azkaban Web服务安装包

Azkaban执行服务安装包

编译之后的sql脚本

C程序文件脚本

将以上4个文件上传到node03的/export/softwares目录

2. 数据库准备

进入mysql的客户端执行以下命令

mysql中执行以下命令:

image-20210319102927859

更改 MySQL 包大小;防止 Azkaban 连接 MySQL 阻塞

在文件末尾增加如下内容;然后保存、退出

image-20210319163143002

重启mysql服务

3. 解压软件安装包

解压azkaban-web-server

解压azkaban-exec-server

4. 安装SSL安全认证

安装ssl安全认证,允许我们使用https的方式访问我们的azkaban的web服务;

密码一定要一个个的字母输入,或者粘贴也行

具体输入如下:

  • 密码都是azkaban
  • 显示[Unknown]:直接敲回车
  • 显示[no]:输入yes,回车
  • jetty密码:azkaban

如果你的linux是中文环境

image-20210319161248569

如果是英文环境,上图中的“是”用“yes”代替
发现目录中多出一个秘钥文件keystore

补充:keytool的用法

5. azkaban web server安装
1、修改azkaban-web-server

修改azkaban-web-server的配置文件

修改文件中的如下属性

说明:

  • StaticRemainingFlowSize:正在排队的任务数;
  • CpuStatus: CPU 占用情况
  • MinimumFreeMemory:内存占用情况。 测试环境, 必须将 MinimumFreeMemory 删除掉,否则它会认为集群资源不够,不执行。

需要修改的项目如下图

image-20210319172111245

2、设置azkaban用户

文件/export/servers/azkaban-web-server-4.0.0/conf/azkaban.properties中默认有如下属性

上边的XmlUserManager是azkaban内置的UserManager用户管理器

  • 当启动web server时,XmlUserManager读取上边配置文件azkaban.properties,然后解析azkaban-users.xml
  • 此xml文件中用来配置azkaban的用户、组、角色
  • 接下来编辑此xml文件,用来配置azkaban用户
  • 添加用户hadoop

内容如下(注意:在向内容拷贝到xml文件时,注意格式缩进)

image-20210319190544587

此文件格式解析,可以参考官网文档

user格式

Attributes Values Required?
username 登录用户名 The login username. 必须有
password 密码 The login password. 必须有
roles role角色,如果是多个角色的话,中间逗号分隔
Comma delimited list of roles that this user has.
非必须
groups 用户所属组,如果是多个组,中间逗号分隔
Comma delimited list of groups that the users belongs to.
非必须
proxy 代理 Comma delimited list of proxy users that this users can give to a project 非必须

group

Attributes Values Required?
name 组名 The group name 必须有
roles role角色,如果是多个角色的话,中间逗号分隔
Comma delimited list of roles that this user has.
非必须

role

Attributes Values Required?
name role角色名称 The role name 必须有
permissions 权限,如果是多个权限的话,中间逗号分隔
Comma delimited list global permissions for the role
必须有

可选的权限有

Permissions Values
ADMIN 管理员权限,拥有azkaban中所有的权限
Grants all access to everything in Azkaban.
READ 对每个project有只读权限
Gives users read only access to every project and their logs
WRITE 允许用户上传文件、修改job的properties、删除project
Allows users to upload files, change job properties or remove any project
EXECUTE 允许用户执行任何flow
Allows users to trigger the execution of any flow
SCHEDULE 允许用户给任意flow添加或移除指定的调度
Users can add or remove schedules for any flows
CREATEPROJECTS 如果创建project功能被锁死,有此权限的用户拥有创建project的权限
Allows users to create new projects if project creation is locked down

官网配置

6. azkaban executor server 安装
第一步:修改azkaban-exex-server配置文件

修改azkaban-exec-server的配置文件

第二步:添加插件

将我们编译后的C文件execute-as-user.c上传或拷贝到/export/servers/azkaban-exec-server-4.0.0/plugins/jobtypes

然后执行以下命令生成execute-as-user

image-20210321122703300

备注:数字表示的权限为6050,那对应的字母表示是什么呢?

  • 第一数字6表示的是特殊权限6 = 4 + 2,即同时设置了SUID和SGID
  • 第二个数字0表示的所有者权限为0,字母表示为—,因为没有设置x权限, 特殊权限表示为大写字母S
  • 第三个数字为5 =4 + 1,设置了用户组权限为读(r)和执行(x),特殊权限表示为小写字母s
  • 第四个数字为0,字母表示为—

其实在UNIX的实现中,文件权限用12个二进制位表示,如果该位置上的值是1,表示有相应的权限:|

第11位为SUID(Set User ID)位,第10位为SGID(Set Group ID)位,第9位为sticky位,第8-0位对应于上面的三组rwx位。

-rwsr-xr-x的值为: 表示所属用户有特殊权限SUID

1 0 0 1 1 1 1 0 1 1 0 1

-rw-r-Sr–的值为: 表示所属用户组有特殊权限SGID

0 1 0 1 1 0 1 0 0 1 0 0

给文件加SUIDSUID的命令如下:

chmod u+s filename 设置SUID

chmod u-s filename 去掉SUID设置

chmod g+s filename 设置SGID

chmod g-s filename 去掉SGID设置

另外一种方法是chmod 接4位八进制表示法。

比如 chmod 60506050对应的2进制110 000 101 000

对应的是权限是 SG — rx —

就是用户组有读写权限,并且同时有用户和用户组的特殊权限

但是使用命令ll列出文件的权限表示是这样

--S r-s --- 这是因为其中S表示设置SUID,s表示设置SGID同时用户组有执行权限

SUIDSGID的作用:

随意设置会威胁到系统安全因此终端上显示成红色背景,特殊权限只在执行普通文件时生效。

比如本来是只有root用户才能执行的命令,加了SUID后,普通用户就可以像root一样用这个命令,权限提升了。上面是对于文件来说的,对于目录也差不多!

目录的S属性使得在该目录下创建的任何文件及子目录属于该目录所拥有的组,目录的T属性使得该目录的所有者及root才能删除该目录。还有对于sS,设置SUID/SGID需要有运行权限,否则用ls -l后就会看到S,证明你所设置的SUID/SGID没有起作用。

第三步:修改配置文件

修改配置文件

增加或修改如下内容

遇到报错Missing required property “azkaban.native.lib”的解决办法:/plugins/jobtypes 目录下修改commonprivate.properties配置文件,内容中添加:azkaban.native.lib=false。然后重启启动exec服务,并激活executor。

将exec拷贝到另外两个节点,并修改所属用户

node01节点

node02节点

第四步:添加用户、用户组

web server

  • node03节点/export/servers/azkaban-web-server-4.0.0/conf/azkaban-users.xml中,添加了许多用户,如kkbreadkkbrwe等等
  • 登录web server时,就用这里指定的用户名、密码登录

image-20210323154047477

exec server

  • /export/servers/azkaban-exec-server-4.0.0/plugins/jobtypes/commonprivate.properties
  • 属性execute.as.user=true表示,azkaban的登录用户,同时作为linux服务器的系统用户
  • 属性azkaban.group.name=myazkaban表示,这些azkaban用户(linux系统用户)都属于myazkaban用户组
  • 所以需要在3个exec服务器中,创建用户kkbrwe、用户组myazkaban
  • 并且用户kkbrwe属于用户组myazkaban
  • 为了解决权限问题,同时讲用户kkbrwe添加附属组hadoop
  • 此处以kkbrwe用户为例(如果使用其他用户,按照此方式创建即可)具体命令如下
  • 三节点hadoop用户已经有sudoers权限
  • 三节点 node01、node02、node03都执行如下命令

exec服务器在执行flow时,会在/export/servers/azkaban-exec-server-4.0.0目录创建目录executions,为了解决权限问题,3台节点都需要做如下操作

node01节点

node02节点

node03节点

说明::myazkaban对应exec的commonprivate.propertiesazkaban.group.name=myazkaban属性

7. 启动服务
第一步:启动azkaban exec server
  • node01节点上

image-20210321163632014

关闭exec server: bin/shutdown-exec.sh

第二步:激活我们的exec-server
  • 每次启动exec都需要激活

  • node01机器下执行以下命令

image-20210321164134373

在node02上启动exec server并激活(同上)

在node03上启动exec server并激活(同上)

三个节点的exec server都启动后,可以去mysql中确认下,node03执行命令

发现,确实有3个exec server,active=1,表示已激活

也可以在MySQL中使用update语句设置active为1完成激活

第三步:启动azkaban-web-server
  • node03节点

关闭web server命令:bin/shutdown-web.sh

注意,无论启动一定要在server根目录下使用相对命令的方式执行,如 bin/cmd,这是因为启动脚本中使用了相对路径读取权限相关的xml文件。

image-20210321164822923

宿主机浏览器访问地址:https://node03:8443

前提:宿主机的hosts文件中配置了node03 ip地址与主机名node03的映射,类似

image-20210321170137537

注意一定要使用https://协议访,问若浏览器界面出现类似情况,按图操作即可

image-20200803131019862

image-20200803131037682

image-20210322141415494

用户名和密码可以是node03的文件/export/servers/azkaban-web-server-4.0.0/conf中指定的用户名及密码,如下

比如此处使用用户kkbrwe,密码kkb123

image-20210321170311511

登录后,进入界面

image-20210322141507162

8. 修改linux的时区问题

之前在安装虚拟机时,已经设置时区为“亚洲/上海”所以不用担心时区问题,不需要修改时区

注:先配置好服务器节点上的时区

但是如果你的时区不是“亚洲/上海”,那么需要修改成此时区

确认时区;CST +0800表示时区是东八区(“亚洲/上海”)

  • 1、先生成时区配置文件Asia/Shanghai,用交互式命令 tzselect 即可
  • 2、拷贝该时区文件,覆盖系统本地时区配置

Views: 28