目錄
- 一、Azkaban概論
- 1.1 為什么需要工作流調度系統
- 1.2 常見工作流調度系統
- 1.3 Azkaban 與 Oozie 對比
- 二、Azkaban集群安裝
- 2.1 集群模式安裝
- 2.1.1 安裝包準備
- 2.1.2 配置 MySQL
- 2.1.3 配置 Executor Server
- 2.1.4 配置 Web Server
- 2.2 Work Flow 案例
- 2.2.1 HelloWorld
- 2.2.2 作業依賴案例
- 2.2.3 自動失敗重試案例
- 2.2.4 手動失敗重試案例
- 三、Azkaban進階
- 3.1 JavaProcess 作業類型案例
- 3.2 條件工作流案例
- 3.2.1 運行時參數案例
- 3.2.2 預定義宏案例
- 3.3 定時執行案例
- 3.4 郵件報警案例
- 3.4.1 登錄郵箱開啟SMTP
- 3.4.2 默認郵件報警案例
- 3.5 電話報警案例
- 3.5.1 第三方告警平臺集成
- 3.5.2 Azkaban多Executor模式注意事項
一、Azkaban概論
1.1 為什么需要工作流調度系統
一個完整的數據分析系統通常都是由大量任務單元組成:Shell腳本程序,Java程序,MapReduce程序,Hive腳本等;各任務單元之間存在時間先后及前后依賴關系;為了很好地組織起這樣的復雜執行計劃,需要一個工作流調度系統來調度執行;
1.2 常見工作流調度系統
簡單的任務調度:直接使用 Linux 的 Crontab 來定義;
注??:Crontab不能處理具有依賴關系的任務調度!復雜的任務調度:開發調度平臺或使用現成的開源調度系統,比如 Ooize、Azkaban、 Airflow、DolphinScheduler 等。
1.3 Azkaban 與 Oozie 對比
Ooize 相比 Azkaban 是一個重量級的任務調度系統,功能全面,但配置使用
也更復雜。如果可以不在意某些功能的缺失,輕量級調度器 Azkaban 是很不錯的候選對象。
二、Azkaban集群安裝
2.1 集群模式安裝
2.1.1 安裝包準備
將 azkaban-db-3.84.4.tar.gz,azkaban-exec-server-3.84.4.tar.gz,azkaban-web-server-3.84.4.tar.gz 上傳到 hadoop102 的/opt/software 路徑;
新建/opt/module/azkaban 目錄,并將所有 tar 包解壓到這個目錄下:
[xiaobai@hadoop102 azkaban
]$
mkdir /opt /module/azkaban
[xiaobai@hadoop102 azkaban
]$
tar -zxvf azkaban-web-server-3.84.4.tar.gz -C /opt/module/azkaban/
[xiaobai@hadoop102 azkaban
]$
tar -zxvf azkaban-exec-server-3.84.4.tar.gz -C /opt/module/azkaban/
[xiaobai@hadoop102 azkaban
]$
tar -zxvf azkaban-db-3.84.4.tar.gz -C /opt/module/azkaban/
進入/opt/module/azkaban 目錄,修改名稱:
[xiaobai@hadoop102 azkaban
]$
mv azkaban-web-server-3.84.4/ azkaban-web
[xiaobai@hadoop102 azkaban
]$
mv azkaban-exec-server-3.84.4/ azkaban-exec
[xiaobai@hadoop102 azkaban
]$ ll
total
4
drwxr-xr-x.
2 xiaobai xiaobai
4096 Apr
18 2020 azkaban-db-3.84.4
drwxr-xr-x.
6 xiaobai xiaobai
55 Apr
18 2020 azkaban-exec
drwxr-xr-x.
6 xiaobai xiaobai
51 Apr
18 2020 azkaban-web
2.1.2 配置 MySQL
啟動MySQL:
[xiaobai
@hadoop102 azkaban
]$ mysql
-uroot
-p
******
登陸 MySQL,創建 Azkaban 數據庫:
mysql
> create database azkaban
;
Query OK
, 1 row affected
(0.19 sec
)
創建 azkaban 用戶并賦予權限 設置密碼有效長度 4 位及以上
mysql
> set global validate_password_length
=4;
Query OK
, 0 rows affected
(0.07 sec
)
設置密碼策略最低級別(ps: 僅測試使用!)
mysql
> set global validate_password_policy
=0;
Query OK
, 0 rows affected
(0.00 sec
)
創建 Azkaban 用戶,任何主機都可以訪問 Azkaban, 密碼******:
mysql
> CREATE USER 'azkaban'@'%' IDENTIFIED
BY '******';
Query OK
, 0 rows affected
(0.17 sec
)
賦予 Azkaban 用戶增刪改查權限:
mysql
> GRANT SELECT,INSERT,UPDATE,DELETE ON azkaban
.* to 'azkaban'@'%' WITH GRANT OPTION;
Query OK
, 0 rows affected
(0.03 sec
)
創建 Azkaban 表,完成后退出 MySQL:
mysql
> use azkaban
;
Database changed
mysql
> source
/opt
/module
/azkaban
/azkaban
-db
-3.84.4/create-all-sql-3.84.4.sql;
mysql
> show tables;
+
| Tables_in_azkaban
|
+
| QRTZ_BLOB_TRIGGERS
|
| QRTZ_CALENDARS
|
| QRTZ_CRON_TRIGGERS
|
| QRTZ_FIRED_TRIGGERS
|
| QRTZ_JOB_DETAILS
|
| QRTZ_LOCKS
|
| QRTZ_PAUSED_TRIGGER_GRPS
|
| QRTZ_SCHEDULER_STATE
|
| QRTZ_SIMPLE_TRIGGERS
|
| QRTZ_SIMPROP_TRIGGERS
|
| QRTZ_TRIGGERS
|
| active_executing_flows
|
| active_sla
|
| execution_dependencies
|
| execution_flows
|
| execution_jobs
|
| execution_logs
|
| executor_events
|
| executors
|
| project_events
|
| project_files
|
| project_flow_files
|
| project_flows
|
| project_permissions
|
| project_properties
|
| project_versions
|
| projects
|
| properties
|
| ramp
|
| ramp_dependency
|
| ramp_exceptional_flow_items
|
| ramp_exceptional_job_items
|
| ramp_items
|
| triggers
|
| validated_dependencies
|
+
35 rows in set (0.01 sec
)
mysql
> quit
;
Bye
所需腳本為create-all-sql-3.84.4.sql,如圖:
更改 MySQL 包大小;防止 Azkaban 連接 MySQL 阻塞:
[xiaobai@hadoop102 azkaban
]$
sudo vim /etc/my.cnf
max_allowed_packet=1024M
注??: 要放在在[mysqld]下面哦!
重啟 MySQL:
[xiaobai@hadoop102 azkaban
]$
sudo systemctl restart mysqld
2.1.3 配置 Executor Server
Azkaban Executor Server 處理工作流和作業的實際執行。
在/opt/module/azkaban/azkaban-exec/conf目錄下編輯 azkaban.properties:
[xiaobai@hadoop102 conf
]$
vim azkaban.properties default.timezone.id
=Asia/Shanghai
同步分發 azkaban-exec:
[xiaobai@hadoop102 conf
]$ xsync /opt/module/azkaban/azkaban-exec/
需進入/opt/module/azkaban/azkaban-exec 路徑,分別在三臺機器上,啟動 executor server:
[xiaobai@hadoop102 azkaban-exec
]$ bin/start-exec.sh
[xiaobai@hadoop103 azkaban-exec
]$ bin/start-exec.sh
[xiaobai@hadoop104 azkaban-exec
]$ bin/start-exec.sh
停止命令:
[xiaobai@hadoop102 azkaban-exec
]$ bin/shutdown-exec.sh
注??:
若在/opt/module/azkaban/azkaban-exec 目錄下出現 executor.port 文件:
或在azkaban數據庫中的executors表中出現我們所連接的主機名稱及端口號,則說明啟動成功!
激活 executor,如下status顯示success,則說明激活成功!
[xiaobai@hadoop102 azkaban-exec
]$
curl -G
"hadoop102:12321/executor?action=activate" && echo
{"status":"success"}
[xiaobai@hadoop103 azkaban-exec
]$
curl -G
"hadoop102:12321/executor?action=activate" && echo
{"status":"success"}
[xiaobai@hadoop104 azkaban-exec
]$
curl -G
"hadoop102:12321/executor?action=activate" && echo
{"status":"success"}
如圖,激活成功后active欄顯示為1!
2.1.4 配置 Web Server
Azkaban Web Server 處理項目管理,身份驗證,計劃和執行觸發。
在/opt/module/azkaban/azkaban-web/conf目錄下編輯 azkaban.properties:
[xiaobai@hadoop102 conf
]$
vim azkaban.properties
修改如下屬性:
tips:
StaticRemainingFlowSize:正在排隊的任務數;
CpuStatus:CPU占用情況:
MinimumFreeMemory:內存占用情況。
修改 azkaban-users.xml 文件,添加用戶xiaobai:
[xiaobai@hadoop102 conf
]$
vim azkaban-users.xml
<user
password="******" roles="admin" username="xiaobai"/
>
需進入到 hadoop102 的/opt/module/azkaban/azkaban-web 路徑,啟動 web server:
[xiaobai@hadoop102 azkaban-web
]$ bin/start-web.sh
停止命令:
[xiaobai@hadoop102 azkaban-web
]$ bin/shutdown-web.sh
訪問 http://hadoop102:8081,并用 xiaobai用戶登錄:
2.2 Work Flow 案例
2.2.1 HelloWorld
創建command.job文件:
jane@janedeMacBook-Pro Desktop %
vim command.job
type=command
command=echo 'hello world'
壓縮command.job,在WebServer新建項目,點擊Create Project==>Upload==>command.job??
點擊Execute Flow??
點擊Execute ??
Continue??
工作單元日志在Job List??
2.2.2 作業依賴案例
需求:
job A和job B執行完之后才能執行jobC。
實現:
新建first.project 文件,編輯內容如下:
azkaban-flow-version: 2.0
注??: 該文件作用,是采用新的 Flow-API 方式解析 flow 文件。
新建 first.flow 文件,內容如下
nodes:- name: jobA
type: command
config:command: echo "hello world A"
- name: jobB
type: command
config:command: echo "hello world B"
- name: jobC
type: command
dependsOn:- jobA
- jobB
config:command: echo "hello world C"
注??:
dependsOn與name/type對齊 是數組類型!
1). Name: job 名稱;
2). Type: job 類型;command 表示要執行作業的方式為命令;
3). Config: job 配置。
將文件壓縮上傳至Azkaban Web Client,點擊Execute flow,可以看到jobA / joB / jobC之間的依賴關系:
查看job list:
2.2.3 自動失敗重試案例
需求:
如果執行任務失敗,需要重試 3 次,重試的時間間隔 10000ms。
實現:
編譯配置流: autoretry.flow:
nodes:- name: jobA
type: command
config:command: sh /not_exists.sh
retries: 3retry.backoff: 5000
tips:
retries: 重試次數;
retry.backoff: 重試的時間間隔
注??:
可在 Flow 全局配置中添加任務失敗重試配置,此時重試配置會應用到所有 Job:
config:retries: 3retry.backoff: 10000
nodes:- name: JobA
type: command
config:command: sh /not_exists.sh
2.2.4 手動失敗重試案例
需求:
JobA=》JobB(依賴于 A)=》JobC=》JobD=》JobE=》JobF。生產環境,任何 Job 都 有可能掛掉,可以根據需求執行想要執行的 Job。
實現:
編譯配置流handsretry.flow:
nodes:- name: JobA
type: command
config:command: echo "This is JobA."
- name: JobB
type: command
dependsOn:- JobA
config:command: echo "This is JobB."
- name: JobC
type: command
dependsOn:- JobB
config:command: echo "This is JobC."
- name: JobD
type: command
dependsOn:- JobC
config:command: echo "This is JobD."
- name: JobE
type: command
dependsOn:- JobD
config:command: echo "This is JobE."
- name: JobF
type: command
dependsOn:- JobE
config:command: echo "This is JobF."
jobA-jobF執行圖:
若是有失敗的job,可在history==>flow里進行查看
之后點擊prepare execution可接著從失敗的job開始執行:
或在excute flow中手動將已經成功的job設為disable / children,再繼續點擊execute!
tips:
Enable 和 Disable 下面都分別有如下參數:
Parents: 該作業的上一個任務;
Ancestors: 該作業前的所有任務;
Children: 該作業后的一個任務;
Descendents: 該作業后的所有任務;
Enable All: 所有的任務。
三、Azkaban進階
3.1 JavaProcess 作業類型案例
JavaProcess 類型可以運行一個自定義主類方法,type 類型為 javaprocess,可用的配置為:
Xms:最小堆;
Xmx:最大堆;
classpath:類路徑;
java.class:要運行的 Java 對象,其中必須包含 Main 方法 main.args:main 方法的參數。
🌰:
新建一個azkaban的maven工程;創建包名: cpm.xiaobai;創建TestJavaProcess類:
package com.xiaobai;
public class TestJavaProcess
{public static void main(String
[] args)
{System.out.println("Java Process Test
!");
}
}
打包jar包azkaban-javaprocess-1.0-SNAPSHOT.jar新建javatest.flow:
nodes:- name: test_java
type: javaprocess
config:Xms: 96M
Xmx: 200M
java.class: com.xiaobai.TestJavaProcess
將jar包/ flow包/ project文件一起打包成javatest.zip;創建prohect–>upload–>executor:
3.2 條件工作流案例
條件工作流功能允許用戶自定義執行條件來決定是否運行某些 Job。條件可以由當前 Job 的父 Job 輸出的運行時參數構成,也可以使用預定義宏。在這些條件下,用戶可以在確定 Job 執行邏輯時獲得更大的靈活性,例如,只要父 Job 之一成功,就可以運行當前 Job。
3.2.1 運行時參數案例
基本原理
父 Job 將參數寫入 JOB_OUTPUT_PROP_FILE 環境變量所指向的文件;子 Job 使用 ${jobName:param}來獲取父 Job 輸出的參數并定義執行條件。
支持的條件運算符
== 等于!= 不等于> 大于>= 大于等于< 小于<= 小于等于&& 與|| 或! 非
🌰:
需求:
JobA 執行一個 shell 腳本。
JobB 執行一個 shell 腳本,但 JobB 不需要每天都執行,而只需要每個周一執行。
實現:
新建 JobA.sh:
#!/bin/bash
echo "do JobA"
wk=`date +%w`
echo "{\"wk\":$wk}" > $JOB_OUTPUT_PROP_FILE
新建 JobB.sh:
#!/bin/bash
echo "do JobB"
新建 condition.flow:
nodes:- name: JobA
type: command
config:command: sh JobA.sh
- name: JobB
type: command
dependsOn:- JobA
config:command: sh JobB.sh
condition: $
{JobA
:wk
} == 1
將 JobA.sh、JobB.sh、condition.flow 和 frist.project 打包成 condition.zip;在Azkaban Web Client執行:
JobA執行成功,JobB cancelled,要等到周一才執行jobB。
3.2.2 預定義宏案例
Azkaban 中預置了幾個特殊的判斷條件,稱為預定義宏。
預定義宏會根據所有父 Job 的完成情況進行判斷,再決定是否執行;可用的預定義宏如下:
all_success: 表示父 Job 全部成功才執行(默認);all_done:表示父 Job 全部完成才執行;all_failed:表示父 Job 全部失敗才執行;one_success:表示父 Job 至少一個成功才執行;one_failed:表示父 Job 至少一個失敗才執行。
需求:
JobA 執行一個 shell 腳本;
JobB 執行一個 shell 腳本;
JobC 執行一個 shell 腳本,要求 JobA、JobB 中有一個成功即可執行;
實現:
新建 JobA.sh:
#!/bin/bash
echo "do JobA"
新建 JobC.sh:
#!/bin/bash
echo "do JobC"
新建 macro.flow:
nodes:- name: JobA
type: command
config:command: sh JobA.sh
- name: JobB
type: command
config:command: sh JobB.sh
- name: JobC
type: command
dependsOn:- JobA
- JobB
config:command: sh JobC.sh
condition: one_success
JobA.sh、JobC.sh、macro.flow、frist.project 文件,打包成 macro.zip;在Azkaban Web Client執行:
JobA success,JobB fail,JobC success!
3.3 定時執行案例
需求:
JobA 每間隔 1 分鐘執行一次;
實現:
在執行工作流時候,選擇左下角 Schedule
填寫定時規則:
可在history中查看first的執行情況,每間隔一分鐘執行一次:
scheduling中有next execution time可查看下一次執行時間和remove schedule選項移除掉這個定時任務:
3.4 郵件報警案例
3.4.1 登錄郵箱開啟SMTP
在郵箱的賬戶里面開啟SMTP服務:
復制授權碼:
3.4.2 默認郵件報警案例
Azkaban 默認支持通過郵件對失敗的任務進行報警,配置方法如下:
在/opt/module/azkaban/azkaban-web/conf目錄下修改azkaban.properties文件:
[xiaobai@hadoop102 conf
]$
vim azkaban.properties
需重啟 web-server:
[xiaobai@hadoop102 azkaban-web
]$ bin/shutdown-web.sh
[xiaobai@hadoop102 azkaban-web
]$ bin/start-web.sh
3.5 電話報警案例
3.5.1 第三方告警平臺集成
有時任務執行失敗后郵件報警接收不及時,因此可能需要其他報警方式,比如電話報警。
此時,可與第三方告警平臺進行集成,例如睿象云。
官網地址:
https://www.aiops.com/集成告警平臺,使用 Email 集成;獲取郵箱地址,后需將報警信息發送至該郵箱;可配置分派策略/ 通知策略;
注??: 若要使用睿象云集成方式,則不可用QQ郵箱,需修改郵箱地址。
3.5.2 Azkaban多Executor模式注意事項
Azkaban 多 Executor 模式是指,在集群中多個節點部署 Executor。在這種模式下, Azkaban web Server 會根據策略,選取其中一個 Executor 去執行任務。
為確保所選的 Executor 能夠準確的執行任務,我們須在以下兩種方案任選其一,推薦使 用方案二。
方案一:
指定特定的 Executor(hadoop102)去執行任務。
在 MySQL 中 azkaban 數據庫 executors 表中,查詢 hadoop102 上的 Executor 的 id;
在執行工作流程時加入 useExecutor 屬性:
方案二??:
在 Executor 所在所有節點部署任務所需腳本和應用。
總結
以上是生活随笔為你收集整理的大数据之Azkaban部署的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。