Azkaban任务调度

Azkaban简述

image.png

  Azkaban is a batch workflow job scheduler created at LinkedIn to run Hadoop jobs. Azkaban resolves the ordering through job dependencies and provides an easy to use web user interface to maintain and track your workflows.

  Azkaban 是在LinkedIn上创建的批处理工作流作业调度程序,用于运行Hadoop作业。Azkaban通过作业依赖性解决订单,并提供易于使用的Web用户界面来维护和跟踪您的工作流程。

  特征:

  • 兼容任何版本的Hadoop

  • 易于使用的Web UI

  • 简单的Web和http工作流上传

  • 项目工作区

  • 调度工作流程

  • 模块化和可插入

  • 身份验证和授权

  • 跟踪用户操作

  • 有关失败和成功的电子邮件提醒

  • SLA警报和自动查杀

  • 重试失败的工作

  以上来自官方介绍,详情见 官网

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

  1. 一个完整的数据分析系统通常都是由大量任务单元组成:shell脚本程序,java程序,mapreduce程序、hive脚本等

  2. 各任务单元之间存在时间先后及前后依赖关系

  3. 为了很好地组织起这样的复杂执行计划,需要一个工作流调度系统来调度执行;


  例如,我们可能有这样一个需求,某个业务系统每天产生20G原始数据,我们每天都要对其进行处理,处理步骤如下:
  1. 通过Hadoop先将原始数据同步到HDFS上;

  2. 借助MapReduce计算框架对原始数据进行转换,生成的数据以分区表的形式存储到多张Hive表中;

  3. 需要对Hive中多个表的数据进行JOIN处理,得到一个明细数据Hive大表;

  4. 将明细数据进行各种统计分析,得到结果报表信息;

  需要将统计分析得到的结果数据同步到业务系统中,供业务调用使用。

工作流调度的实现方式

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

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

  在hadoop领域,常见的工作流调度器有Oozie,Azkaban,Cascading,Hamake等

各种调度工具特性对比

  下面的表格对上述四种hadoop工作流调度器的关键特性进行了比较,尽管这些工作流调度器能够解决的需求场景基本一致,但在设计理念,目标用户,应用场景等方面还是存在显著的区别,在做技术选型的时候,可以提供参考:

特性 Hamake Oozie Azkaban Cascading
工作流描述语言 XML XML (xPDL based) text file with key/value pairs Java API
依赖机制 data-driven explicit explicit explicit
是否要web容器 No Yes Yes No
进度跟踪 console/log messages web page web page Java API
Hadoop job调度支持 no yes yes yes
运行模式 command line utility daemon daemon API
Pig支持 yes yes yes yes
事件通知 no no no yes
需要安装 no yes yes no
支持的hadoop版本 0.18+ 0.20+ currently unknown 0.18+
重试支持 no workflownode evel yes yes
运行任意命令 yes yes yes yes
Amazon EMR支持 yes no currently unknown yes

Azkaban与Oozie对比

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

  • 功能

    两者均可以调度mapreduce,pig,java,脚本工作流任务

    两者均可以定时执行工作流任务

  • 工作流定义

    Azkaban使用Properties文件定义工作流

    Oozie使用XML文件定义工作流

  • 工作流传参

    Azkaban支持直接传参,例如:${input}

    Oozie支持参数和EL表达式,例如:${fs:dirSize(myInputDir)}

  • 定时执行

    Azkaban的定时执行任务是基于时间的

    Oozie的定时执行任务基于时间和输入数据

  • 资源管理

    Azkaban有较严格的权限控制,如用户对工作流进行读/写/执行等操作

    Oozie暂无严格的权限控制

  • 工作流执行

    Azkaban有两种运行模式,分别是soloserver mode(executor server和web server部署在同一台节点)和multi server mode(executor server和web server可以部署在不同节点)

    Oozie作为工作流服务器运行,支持多用户和多工作流

  • 工作流管理

    Azkaban支持浏览器以及ajax方式操作工作流

    Oozie支持命令行、HTTP REST、Java API、浏览器操作工作流

Azkaban安装部署

编译

使用版本:azkaban3.47.0

1
2
3
4
5
tar -zxvf azkaban3.47.0.tar.gz -C ../servers/
cd /export/servers/azkaban-3.47.0/
yum -y install git
yum -y install gcc-c++
./gradlew build installDist -x test

编译成功如下图:

azkaban_compile.png

编译之后的文件

  • azkaban-exec-server
    /export/servers/azkaban-3.47.0/azkaban-exec-server/build/distributions

  • azkaban-web-server
    /export/servers/azkaban-3.47.0/azkaban-web-server/build/distributions

  • azkaban-solo-server
    /export/servers/azkaban-3.47.0/azkaban-solo-server/build/distributions

  • execute-as-user.c
    /export/servers/azkaban-3.47.0/az-exec-util/src/main/c

  • 数据库脚本文件
    /export/servers/azkaban-3.47.0/azkaban-db/build/install/azkaban-db

azkaban单服务模式

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

1
2
3
4
5
6
7
8
9
10
11
cd /export/softwares
tar -zxvf azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz -C ../servers/
cd /export/servers/azkaban-solo-server-0.1.0-SNAPSHOT/conf
vim azkaban.properties

# 更改时区
default.timezone.id=Asia/Shanghai

# 启动:
cd /export/servers/azkaban-solo-server-0.1.0-SNAPSHOT
bin/start-solo.sh(一定要采用这种方式启动)

访问:https://ip:port/

解决job任务一直处于running的状态

1
2
cd /export/servers/azkaban-solo-server-0.1.0-SNAPSHOT/plugins/ jobtypes/
vim commonprivate.properties

重启azkaban

azkaban两个服务模式

  • Azkaban Web服务安装包
    azkaban-web-server-0.1.0-SNAPSHOT.tar.gz

  • Azkaban执行服务安装包
    azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz

  • 编译之后的sql脚本
    create-all-sql-0.1.0-SNAPSHOT.sql

  • C程序文件脚本
    execute-as-user.c程序

  • 安装Mysql数据库
    ……

  安装完之后需执行

1
2
3
4
5
6
7
8
mysql -uroot -p

# 执行
CREATE DATABASE azkaban;
CREATE USER 'azkaban'@'%' IDENTIFIED BY 'azkaban';
GRANT all privileges ON azkaban.* to 'azkaban'@'%' identified by 'azkaban' WITH GRANT OPTION;

source /export/softwares/create-all-sql-0.1.0-SNAPSHOT.sql;
  • 解压azkaban安装包
1
2
tar -zxvf azkaban-web-server-0.1.0-SNAPSHOT.tar.gz -C ../servers/
tar -zxvf azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz -C ../servers/
  • 安装SSL安全认证
1
2
cd /export/servers/azkaban-web-server-3.47.0
keytool -keystore keystore -alias jetty -genkey -keyalg RSA

web server安装

1
cp -r /export/servers/azkaban-solo-server-0.1.0-SNAPSHOT/conf/ /export/servers/azkaban-web-server-3.47.0/
  • 修改azkaban-web-server的配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
cd /export/servers/azkaban-web-server-3.47.0/conf
vim azkaban.properties

# 配置以下内容

# Azkaban Personalization Settings
azkaban.name=MyAzkaban
azkaban.label=My 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=h2
#h2.path=./h2
#h2.create.tables=true

database.type=mysql
mysql.port=3306
mysql.host=localhost
mysql.database=azkaban
mysql.user=azkaban
mysql.password=azkaban
mysql.numconnections=100

# Velocity dev mode
velocity.dev.mode=false
# Azkaban Jetty server properties.
jetty.use.ssl=true
jetty.maxThreads=25
jetty.port=8081

jetty.keystore=/export/servers/azkaban-web-server-3.47.0/keystore
jetty.password=azkaban
jetty.keypassword=azkaban
jetty.truststore=/export/servers/azkaban-web-server-3.47.0/keystore
jetty.trustpassword=azkaban

# Azkaban Executor settings
executor.port=12321
# 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=

# JMX stats
jetty.connector.stats=true
executor.connector.stats=true
# Azkaban plugin settings
azkaban.jobtype.plugin.dir=plugins/jobtypes
  • 添加log4j.properties的配置文件
1
2
3
4
5
6
7
8
9
cd /export/servers/azkaban-web-server-3.47.0/conf
vim log4j.properties

# 配置以下内容
log4j.rootLogger=INFO, Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss.SSS Z} %p [%c{1}] %m%n
log4j.category.velocity=INFO

executor server安装

1
cp -r /export/servers/azkaban-web-server-3.47.0/conf/ /export/servers/azkaban-exec-server-3.47.0/
  • 添加插件
1
2
3
4
5
6
7
8
mkdir -p /export/servers/azkaban-exec-server-3.47.0/plugins/jobtypes
cp /export/softwares/execute-as-user.c /export/servers/azkaban-exec-server-3.47.0/plugins/jobtypes/

yum -y install gcc-c++
cd /export/servers/azkaban-exec-server-3.47.0/plugins/jobtypes
gcc execute-as-user.c -o execute-as-user
chown root execute-as-user
chmod 6050 execute-as-user
  • 添加配置文件
1
2
3
4
5
6
7
cd /export/servers/azkaban-exec-server-3.47.0/plugins/jobtypes
vim commonprivate.properties

# 配置以下内容
execute.as.user=false
memCheck.enabled=false
azkaban.native.lib=/export/servers/azkaban-exec-server-3.47.0/plugins/jobtypes

启动web-server

  bin/start-web.sh

启动exec server

  bin/start-exec.sh

访问

  https://ip:port/