该文章是基于 Hadoop2.7.6_01_部署 、 Hive-1.2.1_01_安装部署 进行的
1. 前言
在一个完整的大数据处理系统中,除了hdfs+mapreduce+hive组成分析系统的核心之外,还需要数据采集、结果数据导出、任务调度等不可或缺的辅助系统,而这些辅助工具在hadoop生态体系中都有便捷的开源框架,如图所示:
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/
使用admin登录之后
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
2、上传zip包
3、启动执行该job
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包中
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文件
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文件
3、通过azkaban的web管理平台创建project并上传job压缩包
4、启动执行该job
部分截图如下
[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文件
3、通过azkaban的web管理平台创建project并上传job压缩包
4、启动执行该job