[TOC]
# azKaban簡介及安裝
## 1 概述
### 1.1為什么需要工作流調度系統
1. 一個完整的數據分析系統通常都是由大量任務單元組成:
2. shell腳本程序,java程序,mapreduce程序、hive腳本等
3. 各任務單元之間存在時間先后及前后依賴關系
4. 為了很好地組織起這樣的復雜執行計劃,需要一個工作流調度系統來調度執行;
> 例如,我們可能有這樣一個需求,某個業務系統每天產生20G原始數據,我們每天都要對其進行處理,處理步驟如下所示:
1. 通過Hadoop先將原始數據同步到HDFS上;
2. 借助MapReduce計算框架對原始數據進行轉換,生成的數據以分區表的形式存儲到多張Hive表中;
3. 需要對Hive中多個表的數據進行JOIN處理,得到一個明細數據Hive大表;
4. 將明細數據進行復雜的統計分析,得到結果報表信息;
5. 需要將統計分析得到的結果數據同步到業務系統中,供業務調用使用。
### 1.2 工作流調度實現方式
> 簡單的任務調度:直接使用linux的crontab來定義;
> 復雜的任務調度:開發調度平臺
> 或使用現成的開源調度系統,比如ooize、azkaban等
### 1.3 常見工作流調度系統
> 市面上目前有許多工作流調度器
> 在hadoop領域,常見的工作流調度器有Oozie, Azkaban,Cascading,Hamake等
?
### 1.4 各種調度工具特性對比
> 下面的表格對上述四種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支持 | ye| s no | currently unknown| yes|
### 1.5 Azkaban與Oozie對比
> 對市面上最流行的兩種調度器,給出以下詳細對比,以供技術選型參考。總體來說,ooize相比azkaban是一個重量級的任務調度系統,功能全面,但配置使用也更復雜。如果可以不在意某些功能的缺失,輕量級調度器azkaban是很不錯的候選對象。
> 詳情如下:
1) 功能
> 兩者均可以調度mapreduce,pig,java,腳本工作流任務
> 兩者均可以定時執行工作流任務
2) 工作流定義
> Azkaban使用Properties文件定義工作流
> Oozie使用XML文件定義工作流
3) 工作流傳參
> Azkaban支持直接傳參,例如${input}
> Oozie支持參數和EL表達式,例如${fs:dirSize(myInputDir)}
4) 定時執行
> Azkaban的定時執行任務是基于時間的
> Oozie的定時執行任務基于時間和輸入數據
5) 資源管理
> Azkaban有較嚴格的權限控制,如用戶對工作流進行讀/寫/執行等操作
> Oozie暫無嚴格的權限控制
6) 工作流執行
> Azkaban有兩種運行模式,分別是solo server mode(executor server和web server部署在同一臺節點)和multi server mode(executor server和web server可以部署在不同節點)
> Oozie作為工作流服務器運行,支持多用戶和多工作流
7) 工作流管理
> Azkaban支持瀏覽器以及ajax方式操作工作流
> Oozie支持命令行、HTTP REST、Java API、瀏覽器操作工作流
## 2 Azkaban介紹
> Azkaban是由Linkedin開源的一個批量工作流任務調度器。用于在一個工作流內以一個特定的順序運行一組工作和流程。Azkaban定義了一種KV文件格式來建立任務之間的依賴關系,并提供一個易于使用的web用戶界面維護和跟蹤你的工作流。
> 它有如下功能特點:
* Web用戶界面
* 方便上傳工作流
* 方便設置任務之間的關系
* 調度工作流
* 認證/授權(權限的工作)
* 能夠殺死并重新啟動工作流
* 模塊化和可插拔的插件機制
* 項目工作區
* 工作流和任務的日志記錄和審計
## 3 Azkaban安裝部署
1) 準備工作
~~~
Azkaban Web服務器
azkaban-web-server-2.5.0.tar.gz
Azkaban執行服務器
azkaban-executor-server-2.5.0.tar.gz
~~~
> MySQL
~~~
目前azkaban只支持 mysql,需安裝mysql服務器,本文檔中默認已安裝好mysql服務器,并建立了 root用戶,密碼 root.
下載地址:http://azkaban.github.io/downloads.html
~~~
2) 安裝
> 將安裝文件上傳到集群,最好上傳到安裝 hive、sqoop的機器上,方便命令的執行
> 在當前用戶目錄下新建 azkabantools目錄,用于存放源安裝文件.新建azkaban目錄,用于存放azkaban運行程序
> azkaban web服務器安裝
~~~
解壓azkaban-web-server-2.5.0.tar.gz
命令: tar –zxvf azkaban-web-server-2.5.0.tar.gz
將解壓后的azkaban-web-server-2.5.0 移動到 azkaban目錄中,并重新命名 webserver
命令: mv azkaban-web-server-2.5.0 ../azkaban
cd ../azkaban
mv azkaban-web-server-2.5.0 server
~~~
> azkaban 執行服器安裝
~~~
解壓azkaban-executor-server-2.5.0.tar.gz
命令:tar –zxvf azkaban-executor-server-2.5.0.tar.gz
將解壓后的azkaban-executor-server-2.5.0 移動到 azkaban目錄中,并重新命名 executor
命令:mv azkaban-executor-server-2.5.0 ../azkaban
cd ../azkaban
mv azkaban-executor-server-2.5.0 executor
~~~
> azkaban腳本導入
~~~
解壓: azkaban-sql-script-2.5.0.tar.gz
命令:tar –zxvf azkaban-sql-script-2.5.0.tar.gz
將解壓后的mysql 腳本,導入到mysql中:
進入mysql
mysql> create database azkaban;
mysql> use azkaban;
Database changed
mysql> source /home/hadoop/azkaban-2.5.0/create-all-sql-2.5.0.sql;
~~~
> 創建SSL配置
> 參考地址: http://docs.codehaus.org/display/JETTY/How+to+configure+SSL
> 命令: keytool -keystore keystore -alias jetty -genkey -keyalg RSA
> 運行此命令后,會提示輸入當前生成 keystor的密碼及相應信息,輸入的密碼請勞記,信息如下:
~~~
輸入keystore密碼:
再次輸入新密碼:
您的名字與姓氏是什么?
[Unknown]:
您的組織單位名稱是什么?
[Unknown]:
您的組織名稱是什么?
[Unknown]:
您所在的城市或區域名稱是什么?
[Unknown]:
您所在的州或省份名稱是什么?
[Unknown]:
該單位的兩字母國家代碼是什么
[Unknown]: CN
CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN 正確嗎?
[否]: y
輸入<jetty>的主密碼
(如果和 keystore 密碼相同,按回車):
再次輸入新密碼:
完成上述工作后,將在當前目錄生成 keystore 證書文件,將keystore 考貝到 azkaban web服務器根目錄中.如:cp keystore azkaban/webserver
~~~
> 配置文件
> 注:先配置好服務器節點上的時區
1.先生成時區配置文件Asia/Shanghai,用交互式命令 tzselect 即可
2.拷貝該時區文件,覆蓋系統本地時區配置
~~~
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
~~~
> azkaban web服務器配置
> 進入azkaban web服務器安裝目錄 conf目錄
1) 修改azkaban.properties文件
> 命令vi 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=3306 #端口號
mysql.host=hadoop03 #數據庫連接IP
mysql.database=azkaban #數據庫實例名
mysql.user=root #數據庫用戶名
mysql.password=root #數據庫密碼
mysql.numconnections=100 #最大連接數
# Velocity dev mode
velocity.dev.mode=false
# Jetty服務器屬性.
jetty.maxThreads=25 #最大線程數
jetty.ssl.port=8443 #Jetty SSL端口
jetty.port=8081 #Jetty端口
jetty.keystore=keystore #SSL文件名
jetty.password=123456 #SSL文件密碼
jetty.keypassword=123456 #Jetty主密碼 與 keystore文件相同
jetty.truststore=keystore #SSL文件名
jetty.trustpassword=123456 # SSL文件密碼
# 執行服務器屬性
executor.port=12321 #執行服務器端口
# 郵件設置
mail.sender=xxxxxxxx@163.com #發送郵箱
mail.host=smtp.163.com #發送郵箱smtp地址
mail.user=xxxxxxxx #發送郵件時顯示的名稱
mail.password=********** #郵箱密碼
job.failure.email=xxxxxxxx@163.com #任務失敗時發送郵件的地址
job.success.email=xxxxxxxx@163.com #任務成功時發送郵件的地址
lockdown.create.projects=false #
cache.directory=cache #緩存目錄
~~~
2) azkaban 執行服務器配置
> 進入執行服務器安裝目錄conf,修改azkaban.properties
~~~
vi azkaban.properties
#Azkaban
default.timezone.id=Asia/Shanghai #時區
# Azkaban JobTypes 插件配置
azkaban.jobtype.plugin.dir=plugins/jobtypes #jobtype 插件所在位置
#Loader for projects
executor.global.properties=conf/global.properties
azkaban.project.dir=projects
#數據庫設置
database.type=mysql #數據庫類型(目前只支持mysql)
mysql.port=3306 #數據庫端口號
mysql.host=192.168.20.200 #數據庫IP地址
mysql.database=azkaban #數據庫實例名
mysql.user=azkaban #數據庫用戶名
mysql.password=oracle #數據庫密碼
mysql.numconnections=100 #最大連接數
# 執行服務器配置
executor.maxThreads=50 #最大線程數
executor.port=12321 #端口號(如修改,請與web服務中一致)
executor.flow.threads=30 #線程數
~~~
3) 用戶配置
> 進入azkaban web服務器conf目錄,修改azkaban-users.xml
~~~
vi 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>
~~~
> 啟動
> web服務器
~~~
在azkaban web服務器目錄下執行啟動命令
bin/azkaban-web-start.sh
注:在web服務器根目錄運行
~~~
> 執行服務器
~~~
在執行服務器目錄下執行啟動命令
bin/azkaban-executor-start.sh ./
注:只能要執行服務器根目錄運行
~~~
> 啟動完成后,在瀏覽器(建議使用谷歌瀏覽器)中輸入https://服務器IP地址:8443 ,即可訪問azkaban服務了.在登錄中輸入剛才新的戶用名及密碼,點擊 login.
## 4 Azkaban實戰
> Azkaba內置的任務類型支持command、java
### 4.1 Command類型單一job示例
1) 創建job描述文件
~~~
vi command.job
#command.job
type=command
command=echo 'hello'
~~~
2) 將job資源文件打包成zip文件
~~~
zip command.job
~~~
3) 通過azkaban的web管理平臺創建project并上傳job壓縮包
> 首先創建project

> 上傳zip包

4) 啟動執行該job

### 4.2Command類型多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
### 4.3HDFS操作任務
1) 創建job描述文件
~~~
# fs.job
type=command
command=/home/hadoop/apps/hadoop-2.6.1/bin/hadoop fs -mkdir /azaz
~~~
2) 將job資源文件打包成zip文件

3) 通過azkaban的web管理平臺創建project并上傳job壓縮包
4) 啟動執行該job
### 4.4 MAPREDUCE任務
> Mr任務依然可以使用command的job類型來執行
1) 創建job描述文件,及mr程序jar包(示例中直接使用hadoop自帶的example jar)
~~~
# mrwc.job
type=command
command=/home/hadoop/apps/hadoop-2.6.1/bin/hadoop jar hadoop-mapreduce-examples-2.6.1.jar wordcount /wordcount/input /wordcount/azout
~~~
2) 將所有job資源文件打到一個zip包中

3) 在azkaban的web管理界面創建工程并上傳zip包
4) 啟動job
### 4.5HIVE腳本任務
1) 創建job描述文件和hive腳本
> Hive腳本: test.sql
~~~
use default;
drop table aztest;
create table aztest(id int,name string) row format delimited fields terminated by ',';
load data inpath '/aztest/hiveinput' into table aztest;
create table azres as select * from aztest;
insert overwrite directory '/aztest/hiveoutput' select count(1) from aztest;
Job描述文件:hivef.job
# hivef.job
type=command
command=/home/hadoop/apps/hive/bin/hive -f 'test.sql'
~~~
2. 將所有job資源文件打到一個zip包中
3. 在azkaban的web管理界面創建工程并上傳zip包
4. 啟動job
- hadoop
- linux基礎
- Linux入門
- Linux進階
- shell
- Zookeeper
- Zookeeper簡介及部署
- Zookeeper使用及API
- Redis
- Redis簡介安裝部署
- Redis使用及API
- Java高級增強
- Java多線程增強
- Maven簡介及搭建
- Hive
- Hive簡介及安裝
- Hive操作
- HIve常用函數
- Hive數據類型
- Flume
- Flume簡介及安裝
- flume 攔截器(interceptor)
- azkaban
- azKaban簡介及安裝
- Sqoop
- Sqoop簡介及安裝
- HDFS
- HDFS原理
- HDFS操作API
- MAPREDUCE原理
- MAPREDUCE圖片資源
- MAPREDUCE加強
- HBASE
- HBASE簡介及安裝
- HBASE操作及API
- HBASE內部原理
- Storm
- Storm簡介及安裝
- Storm原理
- kafka
- kafka簡介及安裝
- kafka常用操作及API
- kafka原理
- kafka配置詳解
- Scala
- Scala簡介及安裝
- Scala基礎語法
- Scala實戰