Azkaban-2.5.0-部署与常见案例

该文章是基于 Hadoop2.7.6_01_部署Hive-1.2.1_01_安装部署 进行的

1. 前言

在一个完整的大数据处理系统中,除了hdfs+mapreduce+hive组成分析系统的核心之外,还需要数据采集、结果数据导出、任务调度等不可或缺的辅助系统,而这些辅助工具在hadoop生态体系中都有便捷的开源框架,如图所示:

Azkaban-2.5.0-部署与常见案例

2. 工作流调度器azkaban概述

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

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

    shell脚本程序,java程序,mapreduce程序、hive脚本等

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

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

1、  通过Hadoop先将原始数据同步到HDFS上;

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

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

4、  将明细数据进行复杂的统计分析,得到结果报表信息;

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

2.2. 工作流调度实现方式

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

复杂的任务调度:开发调度平台

        或使用现成的开源调度系统,比如ooize、azkaban等

2.3. 常见工作流调度系统

市面上目前有许多工作流调度器

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

2.4. Azkaban与Oozie对比

对市面上最流行的两种调度器,给出以下详细对比,以供技术选型参考。总体来说,ooize相比azkaban是一个重量级的任务调度系统,功能全面,但配置使用也更复杂。如果可以不在意某些功能的缺失,轻量级调度器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支持浏览器以及ajax方式操作工作流

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

3. Azkaban介绍

Azkaban是由Linkedin开源的一个批量工作流任务调度器。用于在一个工作流内以一个特定的顺序运行一组工作和流程。Azkaban定义了一种KV文件格式来建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。

它有如下功能特点:

  Web用户界面

  方便上传工作流

  方便设置任务之间的关系

  调度工作流

  认证/授权(权限的工作)

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

  模块化和可插拔的插件机制

  项目工作区

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

3.1. Azkaban使用MySQL存储state的信息

AzkabanWebServer和AzkabanExecutorServer 都是能够访问MySQL的

web server使用DB的原因如下:

Project Management     项目,项目的权限以及上传的文件

Executing Flow State    跟踪执行流,执行程序运行它们

Previous Flow/Jobs       搜索之前的作业和流程执行,以及访问他们的日志文件

Scheduler                    保持预定的工作状态

SLA                            保持所有sla规则

executor server使用DB的原因如下:

Access the project         从数据库中检索项目文件

Executing Flows/Jobs   检索和更新 流和正在执行的数据

Logs                            将输出日志存储到作业中并流入到db中

Interflow dependency    如果流在不同的执行器上运行,则它将从DB中获取状态

4. Azkaban安装部署

将安装文件上传到集群,最好上传到安装 hive、sqoop的机器上,方便命令的执行

准备工作

Azkaban Web服务器

azkaban-web-server-2.5.0.tar.gz

Azkaban执行服务器

azkaban-executor-server-2.5.0.tar.gz

MySQL

azkaban-2.5.0只支持 mysql,需安装mysql服务器,本文档中默认已安装好mysql服务器,下文中会建立 azkaban用户,密码 azkaban.

 # 相关信息
[yun@mini01 azkaban]$ pwd
/app/software/azkaban
[yun@mini01 azkaban]$ ll
total
-rw-r--r-- yun yun May : azkaban-executor-server-2.5..tar.gz
-rw-r--r-- yun yun May : azkaban-sql-script-2.5..tar.gz
-rw-r--r-- yun yun May : azkaban-web-server-2.5..tar.gz
# 解压缩包
[yun@mini01 azkaban]$ tar xf azkaban-executor-server-2.5..tar.gz
[yun@mini01 azkaban]$ tar xf azkaban-web-server-2.5..tar.gz
[yun@mini01 azkaban]$ tar xf azkaban-sql-script-2.5..tar.gz
[yun@mini01 azkaban]$ ll
total
drwxrwxr-x yun yun Jul : azkaban-2.5.
drwxrwxr-x yun yun Jul : azkaban-executor-2.5.
-rw-r--r-- yun yun May : azkaban-executor-server-2.5..tar.gz
-rw-r--r-- yun yun May : azkaban-sql-script-2.5..tar.gz
drwxrwxr-x yun yun Jul : azkaban-web-2.5.
-rw-r--r-- yun yun May : azkaban-web-server-2.5..tar.gz

4.1. MySQL部署

建库并授权

 # 在mini03上操作
# 建库
MariaDB [(none)]> CREATE DATABASE azkaban DEFAULT CHARACTER SET utf8 ;
Query OK, row affected (0.00 sec) MariaDB [(none)]> show create database azkaban;
+----------+------------------------------------------------------------------+
| Database | Create Database |
+----------+------------------------------------------------------------------+
| azkaban | CREATE DATABASE `azkaban` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+------------------------------------------------------------------+
row in set (0.00 sec) MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| azkaban |
| hive |
| mysql |
| performance_schema |
| test |
| zhang |
+--------------------+
rows in set (0.00 sec) # 授权
MariaDB [(none)]> grant all on azkaban.* to azkaban@'%' identified by 'azkaban';
Query OK, rows affected (0.00 sec) MariaDB [(none)]>
MariaDB [(none)]> flush privileges;
Query OK, rows affected (0.00 sec) MariaDB [(none)]> select user,host from mysql.user;
+---------+-----------+
| user | host |
+---------+-----------+
| azkaban | % |
| hive | % |
| root | % |
| root | 127.0.0.1 |
| root | :: |
| | localhost |
| root | localhost |
| | mini03 |
| hive | mini03 |
| root | mini03 |
+---------+-----------+
rows in set (0.00 sec)

导入数据

 # 在有azkaban的SQL语句机器上操作
[yun@mini01 azkaban-2.5.]$ pwd
/app/software/azkaban/azkaban-2.5.
[yun@mini01 azkaban-2.5.]$ ll
total
-rwxr-xr-x yun yun Apr create.active_executing_flows.sql
-rwxr-xr-x yun yun Apr create.active_sla.sql
-rwxr-xr-x yun yun Apr create-all-sql-2.5..sql # 包含所有库信息
-rwxr-xr-x yun yun Apr create.execution_flows.sql
-rwxr-xr-x yun yun Apr create.execution_jobs.sql
-rwxr-xr-x yun yun Apr create.execution_logs.sql
-rwxr-xr-x yun yun Apr create.project_events.sql
-rwxr-xr-x yun yun Apr create.project_files.sql
-rwxr-xr-x yun yun Apr create.project_flows.sql
-rwxr-xr-x yun yun Apr create.project_permissions.sql
-rwxr-xr-x yun yun Apr create.project_properties.sql
-rwxr-xr-x yun yun Apr create.projects.sql
-rwxr-xr-x yun yun Apr create.project_versions.sql
-rwxr-xr-x yun yun Apr create.properties.sql
-rwxr-xr-x yun yun Apr create.schedules.sql
-rwxr-xr-x yun yun Apr create.triggers.sql
-rwxr-xr-x yun yun Apr database.properties
-rwxr-xr-x yun yun Apr update-all-sql-2.1.sql
-rwxr-xr-x yun yun Apr update-all-sql-2.2.sql
-rwxr-xr-x yun yun Apr update.execution_logs.2.1.sql
-rwxr-xr-x yun yun Apr update.project_properties.2.1.sql
[yun@mini01 azkaban-2.5.]$ ll /app/software/azkaban/azkaban-2.5./create-all-sql-2.5..sql # 要导入的SQL文件
-rwxr-xr-x yun yun Apr /app/software/azkaban/azkaban-2.5./create-all-sql-2.5..sql
[yun@mini01 azkaban-2.5.]$
[yun@mini01 azkaban-2.5.]$ mysql -hmini03 -uazkaban -pazkaban
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is
Server version: 5.5.-MariaDB MariaDB Server Copyright (c) , , Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> use azkaban; # 使用库
Database changed
MariaDB [azkaban]> source /app/software/azkaban/azkaban-2.5./create-all-sql-2.5..sql
………………
MariaDB [azkaban]> show tables;
+------------------------+
| Tables_in_azkaban |
+------------------------+
| active_executing_flows |
| active_sla |
| execution_flows |
| execution_jobs |
| execution_logs |
| project_events |
| project_files |
| project_flows |
| project_permissions |
| project_properties |
| project_versions |
| projects |
| properties |
| schedules |
| triggers |
+------------------------+
rows in set (0.00 sec)

4.2. azkaban执行服器和web服务器部署

 [yun@mini01 azkaban]$ pwd
/app/software/azkaban
[yun@mini01 azkaban]$ ll
total
drwxrwxr-x yun yun Jul : azkaban-2.5.
drwxrwxr-x yun yun Jul : azkaban-executor-2.5.
-rw-r--r-- yun yun May : azkaban-executor-server-2.5..tar.gz
-rw-r--r-- yun yun May : azkaban-sql-script-2.5..tar.gz
drwxrwxr-x yun yun Jul : azkaban-web-2.5.
-rw-r--r-- yun yun May : azkaban-web-server-2.5..tar.gz
# 先创建/app/azkaban/ 目录
[yun@mini01 azkaban]$ cp -a azkaban-executor-2.5. /app/azkaban/executor-2.5.
[yun@mini01 azkaban]$ cp -a azkaban-web-2.5. /app/azkaban/web-server-2.5.
[yun@mini01 azkaban]$ cd /app/azkaban/
[yun@mini01 azkaban]$ ll
total
drwxrwxr-x yun yun Jul : executor-2.5.
drwxrwxr-x yun yun Jul : web-server-2.5.

4.3. 为azkaban创建SSL配置

 [yun@mini01 azkaban]$ pwd
/app/azkaban
[yun@mini01 azkaban]$ ll
total
drwxrwxr-x yun yun Jul : executor-2.5.
drwxrwxr-x yun yun Jul : web-server-2.5.
[yun@mini01 azkaban]$ keytool -keystore keystore -alias jetty -genkey -keyalg RSA
Enter keystore password: # 输入123456
Re-enter new password: # 输入123456
What is your first and last name?
[Unknown]:
What is the name of your organizational unit?
[Unknown]:
What is the name of your organization?
[Unknown]:
What is the name of your City or Locality?
[Unknown]:
What is the name of your State or Province?
[Unknown]:
What is the two-letter country code for this unit?
[Unknown]: CN
Is CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN correct?
[no]: yes Enter key password for <jetty>
(RETURN if same as keystore password):
# 查看生成的keystore
[yun@mini01 azkaban]$ ll
total
drwxrwxr-x yun yun Jul : executor-2.5.
-rw-rw-r-- yun yun Jul : keystore
drwxrwxr-x yun yun Jul : web-server-2.5.
[yun@mini01 azkaban]$ cp -a keystore web-server-2.5./ # 将keystore拷贝到azkaban的web中
[yun@mini01 azkaban]$ ll web-server-2.5./
total
-rw-r--r-- yun yun Apr azkaban.version
drwxr-xr-x yun yun Apr bin
drwxr-xr-x yun yun Jul : conf
drwxr-xr-x yun yun Apr extlib
-rw-rw-r-- yun yun Jul : keystore
drwxr-xr-x yun yun Jul : lib
drwxr-xr-x yun yun Apr plugins
drwxr-xr-x yun yun Jul : web

4.4. 配置文件

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

1、先生成时区配置文件Asia/Shanghai,用交互式命令 tzselect 即可

2、拷贝该时区文件,覆盖系统本地时区配置

 # 也可以是软连接
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

4.4.1. web服务器配置

 [yun@mini01 conf]$ pwd
/app/azkaban/web-server-2.5./conf
[yun@mini01 conf]$ ll
total
-rw-r--r-- yun yun Jul : azkaban.properties
-rw-r--r-- yun yun Apr azkaban-users.xml
#### azkaban.properties 配置
[yun@mini01 conf]$ vim azkaban.properties
#Azkaban Personalization Settings
azkaban.name=Test #服务器UI名称,用于服务器上方显示的名字
azkaban.label=My Local Azkaban #描述
azkaban.color=#FF3601 #UI颜色
azkaban.default.servlet.path=/index
web.resource.dir=web/ #默认根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 # global配置文件所在位置
azkaban.project.dir=projects database.type=mysql
mysql.port=
mysql.host=mini03
mysql.database=azkaban
mysql.user=azkaban
mysql.password=azkaban
mysql.numconnections= #最大连接数 # Velocity dev mode
velocity.dev.mode=false # Azkaban Jetty server properties.
jetty.maxThreads= #最大线程数
jetty.ssl.port= #Jetty SSL端口
jetty.port= #Jetty端口
jetty.keystore=keystore #SSL文件名
jetty.password= #SSL文件密码
jetty.keypassword= #Jetty主密码 与 keystore文件相同
jetty.truststore=keystore #SSL文件名
jetty.trustpassword= # SSL文件密码 # Azkaban Executor settings
executor.port= #执行服务器端口 # mail settings
mail.sender= #发送邮箱
mail.host= #发送邮箱smtp地址
job.failure.email= #任务失败时发送邮件的地址
job.success.email= #任务成功时发送邮件的地址 lockdown.create.projects=false cache.directory=cache #缓存目录 ###### azkaban-users.xml 配置
[yun@mini01 conf]$ vim azkaban-users.xml
<azkaban-users>
<user username="azkaban" password="azkaban" roles="admin" groups="azkaban" />
<user username="metrics" password="metrics" roles="metrics"/>
<user username="admin" password="admin" roles="admin,metrics" /> <role name="admin" permissions="ADMIN" />
<role name="metrics" permissions="METRICS"/>
</azkaban-users>

4.4.2. executor执行服务器配置

 [yun@mini01 conf]$ pwd
/app/azkaban/executor-2.5./conf
[yun@mini01 conf]$ vim azkaban.properties
#Azkaban
default.timezone.id=Asia/Shanghai # Azkaban JobTypes Plugins
azkaban.jobtype.plugin.dir=plugins/jobtypes #jobtype 插件所在位置 #Loader for projects
executor.global.properties=conf/global.properties
azkaban.project.dir=projects database.type=mysql
mysql.port=
mysql.host=mini03
mysql.database=azkaban
mysql.user=azkaban
mysql.password=azkaban
mysql.numconnections= #最大连接数 # Azkaban Executor settings
executor.maxThreads= #最大线程数
executor.port= #端口号(如修改,请与web服务中一致)
executor.flow.threads= #线程数

4.5. 启动azkaban

先执行executor,再执行web,避免Web Server会因为找不到执行器启动失败。

执行服务器

 [yun@mini01 executor-2.5.]$ pwd
/app/azkaban/executor-2.5.
[yun@mini01 executor-2.5.]$ ./bin/azkaban-executor-start.sh
# 或者 nohup ./bin/azkaban-executor-start.sh > azkaban-exec_$(date +%Y%m%d%H%M%S).log &
# 方便查看日志
………………

web服务器

 [yun@mini01 web-server-2.5.]$ pwd
/app/azkaban/web-server-2.5.
[yun@mini01 web-server-2.5.]$ ./bin/azkaban-web-start.sh # 日志会自己记录
………………

查看java进程

 [yun@mini01 executor-2.5.]$ jps
AzkabanWebServer
AzkabanExecutorServer
Jps

4.6. 浏览器访问

 https://mini01:8443/ 

Azkaban-2.5.0-部署与常见案例

使用admin登录之后

Azkaban-2.5.0-部署与常见案例

5. Azkaban实战

Azkaba内置的任务类型支持command、java

5.1. Command类型单一job示例

创建job描述文件

在Windows创建文件 command.job,内容如下

command.job

 #command.job
type=command
# command=sh hello.sh
command=echo 'hello'

hello.sh

 #!/bin/bash
echo 'hello World!' > /tmp/azkaban.info

将job资源文件打包成zip文件

zip command.job

创建project、上传包并执行

1、通过azkaban的web管理平台创建project并上传job压缩包

首先创建project

Azkaban-2.5.0-部署与常见案例

2、上传zip包

Azkaban-2.5.0-部署与常见案例

3、启动执行该job

Azkaban-2.5.0-部署与常见案例

5.2. Command类型多job工作流flow

1、创建有依赖关系的多个job描述

第一个job:foo.job

 # foo.job
type=command
command=echo foo

第二个job:bar.job依赖foo.job

 # bar.job
type=command
dependencies=foo
command=echo bar

2、将所有job资源文件打到一个zip包中

Azkaban-2.5.0-部署与常见案例

3、在azkaban的web管理界面创建工程并上传zip包

4、启动工作流flow

5.3. HDFS操作任务

1、创建job描述文件

fs_01.job

 # fs.job
type=command
command=/app/hadoop/bin/hadoop fs -mkdir -p /azkaban/test03_new

fs_02.job

 # fs.job
type=command
dependencies=fs_01
command=/app/hadoop/bin/hadoop fs -put /app/software/apache-flume-1.8.-bin.tar.gz /azkaban/test03_new

2、将job资源文件打包成zip文件

Azkaban-2.5.0-部署与常见案例

3、通过azkaban的web管理平台创建project并上传job压缩包

4、启动执行该job

5.4. MAPREDUCE任务

Mr任务依然可以使用command的job类型来执行

1、创建job描述文件,及mr程序jar包(示例中直接使用hadoop自带的example jar)

mrwc_01.job

 # mrwc.job
type=command
command=/app/hadoop/bin/hadoop fs -mkdir -p /azkaban/wordcount/input

mrwc_02.job

 # mrwc.job
type=command
dependencies=mrwc_01
command=/app/hadoop/bin/hadoop fs -put test.info zhang.info /azkaban/wordcount/input

mrwc_03.job

 # mrwc.job
type=command
dependencies=mrwc_02
command=/app/hadoop/bin/hadoop jar hadoop-mapreduce-examples-2.7..jar wordcount /azkaban/wordcount/input /azkaban/wordcount/output

test.info


zhang.info

 zxcvbnm
asdfghjkl
qwertyuiop
qwertyuiop qwertyuiop

2、将job资源文件打包成zip文件

Azkaban-2.5.0-部署与常见案例

3、通过azkaban的web管理平台创建project并上传job压缩包

4、启动执行该job

部分截图如下

Azkaban-2.5.0-部署与常见案例

Azkaban-2.5.0-部署与常见案例

 [yun@mini02 ~]$ hadoop fs -cat /azkaban/wordcount/output/part-r-

 asdfghjkl
qwertyuiop
zxcvbnm

5.5. HIVE脚本任务

1、创建job描述文件

hivef_01.job

 # hivef.job
type=command
command=/app/hadoop/bin/hadoop fs -mkdir -p /aztest/hiveinput

hivef_01.job

 # hivef.job
type=command
dependencies=hivef_01
command=/app/hadoop/bin/hadoop fs -put azkb.dat /aztest/hiveinput

hivef_03.job

 # hivef.job
type=command
dependencies=hivef_02
command=/app/hive/bin/hive -f 'aztest.sql'

aztest.sql

 CREATE DATABASE IF NOT EXISTS azkaban;
use azkaban;
DROP TABLE IF EXISTS aztest;
DROP TABLE IF EXISTS azres;
create table aztest(id int,name string) row format delimited fields terminated by ',';
load data inpath '/aztest/hiveinput/azkb.dat' into table aztest;
create table azres row format delimited fields terminated by '#' as select * from aztest;
insert overwrite directory '/aztest/hiveoutput' select count() from aztest;

azkb.dat

 ,刘晨晨
,王敏
,张立玉
,刘刚

2、将job资源文件打包成zip文件

Azkaban-2.5.0-部署与常见案例

3、通过azkaban的web管理平台创建project并上传job压缩包

4、启动执行该job

上一篇:Android笔记:触摸事件的分析与总结----TouchEvent处理机制


下一篇:mac中遇到的mysql编码问题