工作流調度器azkaban
為什麽需要工作流調度系統
- 一個完整的數據分析系統通常都是由大量任務單元組成:
shell腳本程序,java程序,mapreduce程序、hive腳本等
- 各任務單元之間存在時間先後及前後依賴關系
為了很好地組織起這樣的復雜執行計劃,需要一個工作流調度系統來調度執行
例如,我們可能有這樣一個需求,某個業務系統每天產生20G原始數據,我們每天都要對其進行處理,處理步驟如下所示:
1、 通過Hadoop先將原始數據同步到HDFS上;
2、 借助MapReduce計算框架對原始數據進行轉換,生成的數據以分區表的形式存儲到多張Hive表中;
3、 需要對Hive中多個表的數據進行
4、 將明細數據進行復雜的統計分析,得到結果報表信息;
5、 需要將統計分析得到的結果數據同步到業務系統中,供業務調用使用。
工作流調度實現方式
簡單的任務調度:直接使用linux的crontab來定義;
復雜的任務調度:開發調度平臺
或使用現成的開源調度系統,比如ooize、azkaban等
常見工作流調度系統
市面上目前有許多工作流調度器
在hadoop領域,常見的工作流調度器有Oozie, Azkaban,Cascading,Hamake等
各種調度工具特性對比
特性 |
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有兩種運行模式,分別是solo server mode(executor server和web server部署在同一臺節點)和multi server mode(executor server和web server可以部署在不同節點)
Oozie作為工作流服務器運行,支持多用戶和多工作流
- 工作流管理
Azkaban支持瀏覽器以及ajax方式操作工作流
Oozie支持命令行、HTTP REST、Java API、瀏覽器操作工作流
Azkaban介紹
Azkaban是由Linkedin開源的一個批量工作流任務調度器。用於在一個工作流內以一個特定的順序運行一組工作和流程。Azkaban定義了一種KV文件格式來建立任務之間的依賴關系,並提供一個易於使用的web用戶界面維護和跟蹤你的工作流。
它有如下功能特點:
² Web用戶界面
² 方便上傳工作流
² 方便設置任務之間的關系
² 調度工作流
² 認證/授權(權限的工作)
² 能夠殺死並重新啟動工作流
² 模塊化和可插拔的插件機制
² 項目工作區
² 工作流和任務的日誌記錄和審計
Azkaban安裝部署
準備工作
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
安裝
將安裝文件上傳到集群,最好上傳到安裝 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;
Azkaban實戰
Azkaba內置的任務類型支持command、java
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包
啟動執行該job
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
HDFS操作任務
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
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
HIVE腳本任務
l 創建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
工作流調度器azkaban