大数据高级开发工程师——工作流调度器Azkaban

Posted yangwei_sir

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据高级开发工程师——工作流调度器Azkaban相关的知识,希望对你有一定的参考价值。

工作流调度器Azkaban

Azkaban介绍

  • azkaban官网:https://azkaban.readthedocs.io/en/latest/

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

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

工作流调度实现方式

  • 简单的任务调度:直接使用linux的crontab来定义;
  • 复杂的任务调度:开发调度平台,或使用现成的开源调度系统,比如:ooize、azkaban、airflow、dophinscheduler等

Azkaban简介

  • Azkaban 是由 Linkedin 开源的一个批量工作流任务调度器,用于在一个工作流(work flow)内以一个特定的顺序运行一组工作和流程。
  • Azkaban 定义了一种 KV 格式文件(properties)来建立任务之间的依赖关系,并提供一个易于使用的 web 用户界面维护和跟踪你的工作流。
  • 它有如下功能特点:
    • 提供功能清晰、简单易用的web UI界面
      • 方便上传工作流
      • 调度工作流
      • 能够杀死并重新启动工作流
      • 工作流和任务的日志记录和审计
    • 提供job配置文件快速建立任务和任务之间的关系
    • 提供模块化的可插拔机制,原生支持command、java、hive、hadoop
    • 安全性高:认证/授权(权限的工作)
    • 提供分布式的多个执行服务器executor
    • 提供conditional workflow工作流

Azkaban架构

Azkaban基本架构

Azkaban 由三部分构成:

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

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 有多个
  • 该模式下,执行服务器和管理服务器在不同主机上,且执行服务器可以有多个

Azkaban安装部署

编译 azkaban

1. 下载源码包

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

注意:1、使用Gradle编译azkaban源码;2、需要使用jdk1.8或更高的版本来进行编译

  • 访问地址https://github.com/azkaban/azkaban/releases/tag/4.0.0,下载 azkaban 源码包

  • 或者使用命令下载
wget https://github.com/azkaban/azkaban/archive/refs/tags/4.0.0.tar.gz
# 解压缩
tar -zxvf azkaban-4.0.0.tar.gz -C /Volumes/F/MyGitHub/azkaban

2. 修改build.gradle

  • 使用gradle进行编译源码,此过程中需要去maven的仓库中下载各种jar包等文件,为了提高下载的速度,可以配置成从国内的maven仓库下载文件,方法如下:
cd azkaban-4.0.0
vim build.gradle
# 添加maven仓库url
maven url 'http://maven.aliyun.com/nexus/content/groups/public/'
maven url 'http://maven.oschina.net/content/groups/public/'

3. 开始编译

./gradlew build installDist -x test
# 开始下载,控制台会打印如下类似的日志
Downloading https://services.gradle.org/distributions/gradle-4.6-all.zip
..........

4. 获得安装包

编译成功后获得安装包和文件:

安装包说明
azkaban-web-server-0.1.0-SNAPSHOT.tar.gzAzkaban Web服务安装包
azkaban-exec-server-0.1.0-SNAPSHOT.tar.gzAzkaban 执行服务安装包
azkaban-solo-server-0.1.0-SNAPSHOT.tar.gzAzkaban 单机安装包
create-all-sql-0.1.0-SNAPSHOT.sql编译之后的sql脚本
execute-as-user.cC程序文件脚本

multiple executor模式安装

前提:某节点已经安装mysql,这里我们以node03已经安装mysql为例。若没有特殊说明,所有操作都是使用hadoop普通用户操作。

1. 数据库准备

mysql -uroot -p123456

-- 设置密码的验证强度等级
set global validate_password_policy=LOW; 
set global validate_password_length=6;

-- 创建数据库azkaban,用于存储使用azkaban框架过程中产生的数据
CREATE DATABASE azkaban;
CREATE USER 'azkaban'@'%' IDENTIFIED BY 'azkaban';  
GRANT SELECT,INSERT,UPDATE,DELETE ON azkaban.* to 'azkaban'@'%' identified by 'azkaban' WITH GRANT OPTION;

flush privileges;
use azkaban; 
source /bigdata/soft/create-all-sql-0.1.0-SNAPSHOT.sql;
exit;

  • 更改 MySQL 包大小:防止 Azkaban 连接 MySQL 阻塞
sudo vim /etc/my.cnf
# 在文件末尾增加如下内容,然后保存、退出
max_allowed_packet=1024M
  • 重启 mysql 服务
sudo /sbin/service mysqld restart
# 输出如下日志
Redirecting to /bin/systemctl restart mysqld.service

3. 解压软件安装包

mkdir -p /bigdata/install/azkaban-4.0.0
# 解压缩
tar -zxvf azkaban-web-server-0.1.0-SNAPSHOT.tar.gz -C /bigdata/install/azkaban-4.0.0/
tar -zxvf azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz -C /bigdata/install/azkaban-4.0.0/

cd /bigdata/install/azkaban-4.0.0/
# 重命名
mv azkaban-web-server-0.1.0-SNAPSHOT/ azkaban-web-server-4.0.0
mv azkaban-exec-server-0.1.0-SNAPSHOT/ azkaban-exec-server-4.0.0

4. 安装SSL安全认证

  • 安装ssl安全认证,允许我们使用https的方式访问我们的azkaban的web服务,密码一定要一个个的字母输入,或者粘贴也行。
cd azkaban-web-server-4.0.0/
keytool -keystore keystore -alias jetty -genkeypair -keyalg RSA
  • 具体输入如下:
    • 密码都是azkaban
    • 显示[Unknown]:直接敲回车
    • 显示[no]:输入yes,回车
    • jetty密码:azkaban

  • 如果是英文环境,上图中的“是”用“yes”代替。此时,发现目录中多出一个秘钥文件keystore
# keytool中有很多的cmd及option;查看keytool用法
[hadoop@node03 azkaban-web-server-4.0.0]$ man keytool

# 提示:搜索关键字,如-genkeypair

OPTION DEFAULTS
       The following examples show the defaults for various option values.
       -alias "mykey"
       -keystore <the file named .keystore in the user's home directory>
       -genkeypair 生成一个秘钥对(公钥、私钥)
       -keyalg RSA 指定使用某算法生成秘钥对

4. 安装azkaban web server

  • 第一步:cd /bigdata/install/azkaban-4.0.0/azkaban-web-server-4.0.0 修改 azkaban-web-server 的配置文件,vim conf/azkaban.properties,修改内容如下
# Azkaban Personalization Settings
azkaban.name=Azkaban
azkaban.label=My Azkaban
...

default.timezone.id=Asia/Shanghai
# Azkaban UserManager class
# azkaban内置的UserManager用户管理器,当启动web server时,`XmlUserManager`会读取配置文件`azkaban.properties`,然后解析`azkaban-users.xml`
user.manager.class=azkaban.user.XmlUserManager
# 此xml文件中用来配置azkaban的用户、组、角色
user.manager.xml.file=conf/azkaban-users.xml
...

# Azkaban Jetty server properties.
jetty.use.ssl=true
...

# 新增内容
jetty.ssl.port=8443
jetty.keystore=/bigdata/install/azkaban-4.0.0/azkaban-web-server-4.0.0/keystore
jetty.password=azkaban
jetty.keypassword=azkaban
jetty.truststore=/bigdata/install/azkaban-4.0.0/azkaban-web-server-4.0.0/keystore
jetty.trustpassword=azkaban
...


mysql.host=node03
...

azkaban.executorselector.filters=StaticRemainingFlowSize,CpuStatus
  • 说明:
    • StaticRemainingFlowSize:正在排队的任务数;
    • CpuStatus: CPU 占用情况
    • MinimumFreeMemory:内存占用情况。 测试环境, 必须将 MinimumFreeMemory 删除掉,否则它会认为集群资源不够,不执行。
  • 第二步:设置 azkaban 用户,vim conf/azkaban-users.xml,修改如下
  <user password="abc123" roles="myread" username="abcread"/>
  <user password="abc123" roles="mywrite" username="abcwrite"/>
  <user password="abc123" roles="admin" username="abcadmin"/>
  <user password="abc123" roles="myread, mywrite" username="abcrwe" groups="groupx"/>
  
  <group name="groupx" roles="myexe"/>
  
  <role name="myread" permissions="READ"/>
  <role name="mywrite" permissions="WRITE"/>
  <role name="myexe" permissions="EXECUTE"/>  

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

  • user 格式

AttributesValuesRequired?
username登录用户名 The login username.必须有
password密码 The login password.必须有
rolesrole角色,如果是多个角色的话,中间逗号分隔
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 格式
AttributesValuesRequired?
name组名 The group name必须有
rolesrole角色,如果是多个角色的话,中间逗号分隔
Comma delimited list of roles that this user has.
非必须
  • role 格式
AttributesValuesRequired?
namerole角色名称 The role name必须有
permissions权限,如果是多个权限的话,中间逗号分隔
Comma delimited list global permissions for the role
必须有
  • 可选的权限有
PermissionsValues
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

5. 安装azkaban executor server

  • 第一步cd /bigdata/install/azkaban-4.0.0/azkaban-exec-server-4.0.0修改azkaban-exec-server的配置文件vim conf/azkaban.properties,修改内容如下
# Azkaban Personalization Settings
azkaban.name=Azkaban
azkaban.label=My Azkaban
...

default.timezone.id=Asia/Shanghai
...

jetty.use.ssl=true
......

# 新增内容 添加如下5行内容
jetty.keystore=/bigdata/install/azkaban-4.0.0/azkaban-web-server-4.0.0/keystore
jetty.password=azkaban
jetty.keypassword=azkaban
jetty.truststore=/bigdata/install/azkaban-4.0.0/azkaban-web-server-4.0.0/keystore
jetty.trustpassword=azkaban
...

# Where the Azkaban web server is located
azkaban.webserver.url=https://node03:8443
...

mysql.host=node03
...
  • 第二步:添加插件,将我们编译后的 C 文件execute-as-user.c 拷贝到/bigdata/install/azkaban-4.0.0/azkaban-exec-server-4.0.0/plugins/jobtypes
cp /bigdata/soft/execute-as-user.c /bigdata/install/azkaban-4.0.0/azkaban-exec-server-4.0.0/plugins/jobtypes
  • 然后执行以下命令生成 execute-as-user
cd /bigdata/install/azkaban-4.0.0/azkaban-exec-server-4.0.0/plugins/jobtypes
sudo yum -y install gcc-c++
gcc execute-as-user.c -o execute-as-user
sudo chown root execute-as-user
sudo chmod 6050 execute-as-user

  • 第三步:修改配置文件 vim commonprivate.properties,增加或修改如下内容
# true: 表示azkaban的登录用户,同时作为linux服务器系统的用户
execute.as.user=true
azkaban.native.lib=/bigdata/install/azkaban-4.0.0/azkaban-exec-server-4.0.0/plugins/jobtypes
# 表示,这些azkaban用户(linux系统用户)都属于`myazkaban`用户组
azkaban.group.name=myazkaban
memCheck.enabled=false
  • 将exec拷贝到另外两个节点,并修改所属用户
cd /bigdata/install/azkaban-4.0.0
scp -r azkaban-exec-server-4.0.0/ hadoop@node01:$PWD
scp -r azkaban-exec-server-4.0.0/ hadoop@node02:$PWD

# node01、node02上分别执行
cd /bigdata/install/azkaban-4.0.0/azkaban-exec-server-4.0.0/plugins/jobtypes
sudo chown root execute-as-user
sudo chmod 6050 execute-as-user
  • 第四步:添加用户、用户组
    • 需要在 3 个 exec 服务器中,创建用户 abcrwe、用户组 myazkaban,并且用户 abcrwe 属于用户组myazkaban
    • 为了解决权限问题,同时将用户 abcrwe 添加附属组 hadoop
    • 此处以 abcrwe 用户为例(如果使用其他用户,按照此方式创建即可)具体命令如下
# node01、node02、node03都执行如下命令
sudo groupadd myazkaban
[sudo] hadoop 的密码:
sudo useradd -g myazkaban abcrwe
sudo passwd abcrwe
新的 密码:123456
重新输入新的密码:
# 将 abcrwe 添加附加用户组
sudo usermod -a -G hadoop abcrwe
# 查看用户 abcrwe
sudo id abcrwe
uid=1002(abcrwe) gid=1002(myazkaban)=1002(myazkaban),1001(hadoop)
  • exec 服务器在执行 flow 时,会在/bigdata/install/azkaban-4.0.0/azkaban-exec-server-4.0.0目录创建目录 executions,为了解决权限问题,3台节点都需要做如下操作
cd /bigdata/install/azkaban-4.0.0/azkaban-exec-server-4.0.0
mkdir executions
sudo chown :myazkaban executions/

6. 启动服务

  • 第一步:启动azkaban exec server
# node01
cd /bigdata/install/azkaban-4.0.0/azkaban-exec-server-4.0.0
bin/start-exec.sh
# 关闭exec server: `bin/shutdown-exec.sh`

jps
14014 AzkabanExecutorServer
  • 第二步:激活exec-server,每次启动exec都需要激活
# node01
cd /bigdata/install/azkaban-4.0.0/azkaban-exec-server-4.0.0
curl -G "node01:$(<./executor.port)/executor?action=activate" && echo
# 输出
"status":"success"
  • 分别在 node02、node03 上启动 exec server 并激活
# node02
bin/start-exec.sh
jps
curl -G "node02:$(<./executor.port)/executor?action=activate" && echo

# node03
bin/start-exec.sh
jps
curl -G "node03:$(<./executor.port)/executor?action=activate" && echo
  • 三个节点的exec server都启动后,可以去mysql中确认下,node03执行命令
mysql> select * from executors;
+----+--------+-------+--------+
| id | host   | port  | active |
+----+--------+-------+--------+
|  1 | node01 | 44066 |      1 |
|  2 | node02 | 40791 |      1 |
|  3 | node03 | 41330 |      1 |
+----+--------+-------+--------+
3 rows in set (0.00 sec)
  • 发现,确实有3个exec server,active=1,表示已激活
  • 第三步:启动 azkaban-web-server
# node03
cd /bigdata/install/azkaban-4.0.0/azkaban-web-server-4.0.0
bin/start-web.sh
# 关闭web server命令:`bin/shutdown-web.sh`
jps

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

  • 登录后,进入界面

7. 修改linux的时区问题

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

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

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

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

$ date +"%Z %z"
CST +0800
  • 生成时区配置文件Asia/Shanghai,用交互式命令 tzselect 即可
# 拷贝该时区文件,覆盖系统本地时区配置
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

以上是关于大数据高级开发工程师——工作流调度器Azkaban的主要内容,如果未能解决你的问题,请参考以下文章

工作流调度器azkaban的安装和使用

Azkaban 工作流调度器

工作流调度器azkaban(以及各种工作流调度器比对)

工作流调度器azkaban

工作流调度器azkaban

工作流调度器azkaban