一、概述

1、工作流调度系统

一个完整的数据分析系统通常都是由大量任务单元组成:

  • shell 脚本程序
  • java 程序
  • mapreduce 程序
  • hive 脚本等

各任务单元之间存在时间先后及前后依赖关系,为了很好地组织起这样的复杂执行计划,需要一个工作流调度系统来调度任务的执行。

假如,我有这样一个需求,某个业务系统每天产生20G原始数据,每天都要对其进行处理,处理步骤如下所示:

  • 通过Hadoop先将原始数据同步到HDFS上;
  • 借助MapReduce计算框架对原始数据进行转换,生成的数据以分区表的形式存储到多张Hive表中;
  • 需要对Hive中多个表的数据进行JOIN处理,得到一个明细数据Hive大表;
  • 将明细数据进行各种统计分析,得到结果报表信息;
  • 需要将统计分析得到的结果数据同步到业务系统中,供业务调用使用。

    2、工作流调度实现方式

  • 简单的任务调度

    • 直接使用linux的crontab
  • 复杂的任务调度

    • 开发调度平台或使用现成的开源调度系统,比如 Ooize、Azkaban、Airflow等

      3、Azkaban V.S. Oozie

      对市面上最流行的两种调度器,进行对比分析。总体来说,Ooize相比Azkaban是一个重量级的任务调度系统,功能全面,但配置使用也更复杂(xml)。如果可以不在意某些功能的缺失,轻量级调度器Azkaban是很不错的候选对象。
  • 功能

    • 两者均可以调度mapreduce,pig,java,脚本工作流任务
    • 两者均可以定时执行工作流任务
  • 工作流定义【区别】
    • Azkaban使用Properties文件定义工作流
    • Oozie使用XML文件定义工作流
  • 工作流传参【相似】
    • Azkaban支持直接传参,例如${input}
    • Oozie支持参数和EL表达式,例如${fs:dirSize(myInputDir)}
  • 定时执行【区别】
    • Azkaban的定时执行任务是基于时间的
    • Oozie的定时执行任务基于时间和输入数据
  • 资源管理【区别】
    • Azkaban有较严格的权限控制,如用户对工作流进行读/写/执行等操作
    • Oozie暂无严格的权限控制
  • 工作流执行【相似】
    • Azkaban有两种运行模式,分别是solo server mode(executor server和web server部署在同一台节点)和multi server mode(executor server和web server可以部署在不同节点)
    • Oozie作为工作流服务器运行,支持多用户和多工作流

二、Azkaban介绍

Azkaban是由linkedin(领英)公司推出的一个基于java的批量工作流任务调度器,用于在一个工作流内以一个特定的顺序运行一组工作和流程。Azkaban使用job配置文件建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。
image.png
Azkaban定义了一种KV文件(properties)格式来建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。
有如下功能特点:

  • Web用户界面
  • 方便上传工作流
  • 方便设置任务之间的关系
  • 调度工作流
  • 架构角色
    • mysql服务器 : 存储元数据,如项目名称、项目描述、项目权限、任务状态、SLA规则等
    • AzkabanWebServer :对外提供web服务,使用户可以通过web页面管理。职责包括项目管理、权限授权、任务调度、监控executor
    • AzkabanExecutorServer :负责具体的工作流的提交、执行

三、安装部署

1、Azkaban的安装准备工作

编译

  • 这里选用 azkaban3.51.0 这个版本自己进行重新编译,编译完成之后得到我们需要的安装包进行安装

    1. cd /opt/lagou/software/
    2. wget https://github.com/azkaban/azkaban/archive/3.51.0.tar.gz
    3. tar -zxvf 3.51.0.tar.gz -C ../servers/
    4. cd /opt/lagou/servers/azkaban-3.51.0/
    5. yum -y install git
    6. yum -y install gcc-c++
    7. ./gradlew build installDist -x test
  • 注:Gradle是一个基于Apache Ant和Apache Maven的项目自动化构建工具。-x test 跳过测试。(注意联网下载jar可能会失败、慢)

    上传编译后的安装文件

  • 经过上面的编译后,得到如下文件:

  • 在 linux122节点创建如下目录:【最好创建在资源比较充足的节点上】

    • mkdir /opt/lagou/servers/azkaban

      2、solo-server模式部署

      单服务模式安装

      ① 解压

  • azkaban 的 solo server 使用的是一个单节点的模式来进行启动服务的,只需要一个 azkaban-soloserver-0.1.0-SNAPSHOT.tar.gz 的安装包即可启动,所有的数据信息都是保存在H2这个azkaban默认的数据当中

    • tar -zxvf azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz -C /opt/lagou/servers/azkaban

      ② 修改配置文件

  • 修改时区配置文件 ```shell cd /opt/lagou/servers/azkaban-solo-server-0.1.0-SNAPSHOT/conf vim azkaban.properties

修改以下内容

default.timezone.id=Asia/Shanghai


- 修改 `commonprivate.properties` 配置文件
   - azkaban默认需要3G的内存,剩余内存不足则会报异常,因此要把该检查的选项关闭
```shell
cd /opt/lagou/servers/azkaban-solo-server-0.1.0-SNAPSHOT/plugins/jobtypes
vim commonprivate.properties

# 修改内容
execute.as.user=false
memCheck.enabled=false

③ 启动 solo-server

  • cd /opt/lagou/servers/azkaban/``azkaban-solo-server-0.1.0-SNAPSHOT
  • 启动:bin/start-solo.sh
  • 关闭:bin/shutdown-solo.sh

image.png

④ 浏览器页面访问

  • http://linux122:8081/index

    • 登录用户名:azkaban
    • 登录密码:azkaban

      单服务模式使用

  • 需求:使用azkaban调度我们的shell脚本,执行linux的shell命令

  • 具体步骤

    • 创建普通文本文件 foo.job,文件内容如下

      type=command
      command=echo 'hello world'
      
    • 打成压缩包 foo.zip

    • 上传压缩包到 Azkaban
      • image.png
      • image.png
      • image.png
      • image.png
      • image.png
      • image.png

3、multiple-executor模式部署

① 安装所需软件

  • Azkaban Web服务安装包
    • azkaban-web-server-0.1.0-SNAPSHOT.tar.gz
  • Azkaban Exec服务安装包
    • azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz
  • sql脚本
    • image.png

节点规划
image.png

② 数据库准备

  • mysql 安装在 linux123
  • 先解压数据库的脚本文件 azkaban-db-0.1.0-SNAPSHOT.tar.gz
    • tar -zxvf azkaban-db-0.1.0-SNAPSHOT.tar.gz -C /opt/lagou/servers/azkaban
  • 模仿 https://www.yuque.com/lancemai/bigdata/ypkpzf#5q6jH 创建用户 azkaban
  • 进入 mysql 客户端:mysql -uazkaban -p12345678 并执行以下命令:

    • 加载初始化 sql 创建表
    • use azkaban; #先创建好数据库 azkaban
      • source /opt/lagou/servers/azkaban/azkaban-db-0.1.0-SNAPSHOT/create-all-sql-0.1.0-SNAPSHOT.sql;

        ③ 配置 Azkaban-web-server

  • 进入 linux122 节点,安装Azkaban-web-server

  • 解压azkaban-web-server
    • mkdir /opt/lagou/servers/azkaban
    • tar -zxvf azkaban-web-server-0.1.0-SNAPSHOT.tar.gz –C /opt/lagou/servers/azkaban/
  • 进入 azkaban-web-server 根目录下
    • cd /opt/lagou/servers/azkaban/azkaban-web-server-0.1.0-SNAPSHOT
    • 生成 ssl 证书:
      • keytool -keystore keystore -alias jetty -genkey -keyalg RSA

image.png

  • 注意:运行此命令后,会提示输入当前生成 keystore 的密码及相应信息,输入的密码请记住(所有密码统一为 :azkaban )
    • image.png
      • 修改 azkaban-web-server 的配置文件
  • cd /opt/lagou/servers/azkaban-web-server-3.51.0/conf
  • vim azkaban.properties ```shell

    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

Azkaban Jetty server properties. 开启使用ssl 并且知道端口

jetty.use.ssl=true # ** jetty.port=8443 # ** jetty.maxThreads=25

需要添加的内容 *

KeyStore for SSL ssl相关配置 注意密码和证书路径

jetty.keystore=keystore jetty.password=azkaban jetty.keypassword=azkaban jetty.truststore=keystore jetty.trustpassword=azkaban

Azkaban mysql settings by default. Users should configure their own usernameand password.

database.type=mysql mysql.port=3306 mysql.host=linux123 # ** mysql.database=azkaban # ** mysql.user=azkaban # ** mysql.password=12345678 # ** mysql.numconnections=100

将以下的第二项注释,该项是检查资源的开关

azkaban.use.multiple.executors=true

azkaban.executorselector.filters=StaticRemainingFlowSize,MinimumFreeMemory,CpuStatus # **

azkaban.executorselector.comparator.NumberOfAssignedFlowComparator=1 azkaban.executorselector.comparator.Memory=1 azkaban.executorselector.comparator.LastDispatched=1 azkaban.executorselector.comparator.CpuUsage=1


- 添加属性
   - 在 /opt/lagou/servers/azkaban/**azkaban-web-server**/ 下创建以下目录:
      - `mkdir -p plugins/jobtypes`
   - `cd plugins/jobtypes/`
   - `vim commonprivate.properties`
```shell
azkaban.native.lib=false
execute.as.user=false
memCheck.enabled=false

④ 配置 Azkaban-exec-server

  • 安装 Azkaban-exec-server 到 节点 linux121、linux123
  • 上传 Azkaban-exec-server 安装包到 linux123 的 /opt/lagou/software
  • 解压到 /opt/lagou/server/azkaban/
  • 修改azkaban-exec-server的配置文件
    • cd /opt/lagou/servers/azkaban-exec-server-3.51.0/conf
    • vim azkaban.properties ```sql

      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

Where the Azkaban web server is located

azkaban.webserver.url=https://linux122:8443 # *

Azkaban mysql settings by default. Users should configure their own username

and password. database.type=mysql mysql.port=3306 mysql.host=linux123 # * mysql.database=azkaban # * mysql.user=azkaban # * mysql.password=12345678 # * mysql.numconnections=100

Azkaban Executor settings

executor.maxThreads=50 executor.port=12321 # **添加内容* executor.flow.threads=30 ```

  • 分发exec-server到linux121节点

    • cd /opt/lagou/servers
    • scp -r azkaban linux121:$PWD

      ⑤ 启动服务

  • 先启动 exec-server 【linux121、linux123】

    • bin/start-exec.sh
  • 再启动 web-server 【linux122】

    • bin/start-web.sh
  • 激活我们的exec-server

    • 启动webServer之后进程失败消失,可通过安装包根目录下对应启动日志进行排查
      • image.png
    • 因此需要手动激活 executor
      • cd /opt/lagou/servers/azkaban/azkaban-exec-server
      • linux121上执行:curl -G "linux121:$(<./executor.port)/executor?action=activate" && echo
      • linux123上执行:curl -G "linux123:$(<./executor.port)/executor?action=activate" && echo
  • 访问地址

    • https://linux122:8443
      • 用户名和密码均为:azkaban

四、使用方法

① shell command 调度

  • https://www.yuque.com/catdog/hadoop/pedntq#qmbUr

    ② job 依赖调度

    image.png

    ③ HDFS 任务调度

  • 注:command后面的 命令 最好用绝对路径

    image.png
    image.png

    ④ MAPREDUCE 任务调度

    image.png
    遇到虚拟机内存不足情况【查看内存命令:free -m 】:

  1. 增大机器内存
  2. 使用清除系统缓存命令,暂时释放一些内存【L1、L2、L3级缓存】

[root@linux123 mapreduce]# echo 1 >/proc/sys/vm/drop_caches
[root@linux123 mapreduce]# echo 2 >/proc/sys/vm/drop_caches
[root@linux123 mapreduce]# echo 3 >/proc/sys/vm/drop_caches

⑤ HIVE 脚本任务调度

image.png

⑥ 定时任务调度

image.png

  • 网上搜索 cron表达式

image.png

调度工具.pdf