Azkaban 簡介(一)
什麼是任務排程
大資料平臺技術框架支援的開發語言多種多樣,開發人員的背景差異也很大,這就產生出很多不同型別的程式(任務)執行在大資料平臺之上,如:MapReduce、Hive、Pig、Spark、Java、Shell、Python 等。
這些任務需要不同的執行環境,並且除了定時執行,各種型別之間的任務存在依賴關係,一張簡單的任務依賴圖如下:
常見任務排程工具
- crontab (Linux 自帶命令,使用方式簡單,適合不是非常複雜的場景,比如只按照時間來排程)
- oozie( Hadoop 自帶的開源排程系統,使用方式比較複雜,適合大型專案場景)
- azkaban(一個開源排程系統,使用方式比較簡單,適合中小型專案場景)
- 企業定製開發(企業自研的排程系統,不開源)
Azkaban 是什麼
Azkaban 是由 Linkedin 公司推出的一個批量工作流任務排程器,Azkaban 使用 job 檔案建立任務之間的依賴關係,並提供 Web 介面供使用者管理和排程工作流
Azkaban 特點
Azkaban 是由 Linkedin 開源的一個批量工作流任務排程器。用於在一個工作流內以一個特定的順序執行一組工作和流程。Azkaban 定義了一種 KV 檔案格式來建立任務之間的依賴關係,並提供一個易於使用的 web 使用者介面維護和跟蹤你的工作流。
它有如下功能特點:
- Web 使用者介面
- 方便上傳工作流
- 方便設定任務之間的關係
- 排程工作流
- 認證/授權(許可權的工作)
- 能夠殺死並重新啟動工作流
- 模組化和可插拔的外掛機制
- 專案工作區
- 工作流和任務的日誌記錄和審計
Azkaban 與 Oozie 對比
Azkaban 和 Oozie 是市面上最流行的兩種排程器。總體來說,Ooize 相比 Azkaban 是一個重量級的任務排程系統,功能全面,但部署和使用也更復雜,比較適合作為大型專案的任務排程系統。而 Azkaban 相對而言,配置和使用更為簡單,能夠滿足常見的任務排程,比較適合作為中小型專案的任務排程系統。
Azkaban 和 Oozie 詳情對比如下:
-
功能
兩者均可以排程 mapreduce,pig,java,指令碼工作流任務
兩者均可以定時執行工作流任務 -
工作流定義
Azkaban 使用 Properties 檔案定義工作流
Oozie 使用 XML 檔案定義工作流 -
工作流傳參
Azkaban 支援直接傳參
Oozie 支援引數和 EL 表示式
-
定時執行
Azkaban 的定時執行任務是基於時間的
Oozie 的定時執行任務基於時間和輸入資料 -
資源管理
Azkaban 有較嚴格的許可權控制,如使用者對工作流進行讀/寫/執行等操作
Oozie 暫無嚴格的許可權控制 -
工作流執行
Azkaban 有兩種執行模式,分別是單機模式和叢集模式
Oozie 作為工作流伺服器執行,支援多使用者和多工作流 -
工作流管理
Azkaban 支援瀏覽器以及 ajax 方式操作工作流
Oozie 支援命令列、HTTP REST、Java API、瀏覽器操作工作流
Azkaban 執行模式及架構
Azkaban 三大核心元件
- 關係型元資料庫(MySQL)
- Azkaban Web Server
- Azkaban Executor Server
Azkaban有兩種部署方式
-
solo server mode(單機模式)
WebServer 和 ExecutorServer 在同一個程序
-
cluster server mode(叢集模式)
WebServe r和 ExecutorServer 執行在不同程序,並用資料庫儲存定義及狀態
- 單個Executor
- 多個Executor
Azkaban Web Server
AzkabanWebServer 是 Azkaban 的主要管理者,負責專案管理、身份驗證、排程和監控執行,並且為使用者介面
Azkaban Executor
提交和執行工作流,記錄工作流日誌,和 Azkaban WebServer 可以在同一臺伺服器,也可部署在獨立的機器。把 Executor 單獨分開有幾個好處:
- 在多 Executor 模式下可以方便擴充套件
- 工作流在某一個 Executor 掛掉,可以在另一個 Executor 上重試
- 可以滾動升級,從而不影響排程
Azkaban 元資料庫
Azkaban 任務排程步驟
- Azkaban 新建專案
- 在 Azkaban Web 介面建立 Project
- 建立 job 檔案
- 將檔案壓縮為 zip 檔案
- 上傳 zip 檔案到 Web 介面
- 執行排程
Azkaban 常見任務型別
執行 shell 命令
type=command
command=echo 'hello'
執行 shell 指令碼
type=command
command=sh hello.sh
執行 Spark 程式
type=command
command=/usr/install/spark/bin/spark-submit --class com.test.AzkabanTest test-1.0-SNAPSHOT.jar
hive 命令\指令碼
type=command
command=beeline -u jdbc:hive2://localhost:10000 -n hive -p hive -f 'test.sql'
執行 MapReduce 程式
type=command
command=${HADOOP_HOME}bin/hadoop jar hadoop-mapreduce-examples-2.8.0.jar
wordcount ${input} ${output}