目錄
- 一、Azkaban概論
- 1.1 為什么需要工作流調(diào)度系統(tǒng)
- 1.2 常見(jiàn)工作流調(diào)度系統(tǒng)
- 1.3 Azkaban 與 Oozie 對(duì)比
- 二、Azkaban集群安裝
- 2.1 集群模式安裝
- 2.1.1 安裝包準(zhǔn)備
- 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 作業(yè)依賴(lài)案例
- 2.2.3 自動(dòng)失敗重試案例
- 2.2.4 手動(dòng)失敗重試案例
- 三、Azkaban進(jìn)階
- 3.1 JavaProcess 作業(yè)類(lèi)型案例
- 3.2 條件工作流案例
- 3.2.1 運(yùn)行時(shí)參數(shù)案例
- 3.2.2 預(yù)定義宏案例
- 3.3 定時(shí)執(zhí)行案例
- 3.4 郵件報(bào)警案例
- 3.4.1 登錄郵箱開(kāi)啟SMTP
- 3.4.2 默認(rèn)郵件報(bào)警案例
- 3.5 電話報(bào)警案例
- 3.5.1 第三方告警平臺(tái)集成
- 3.5.2 Azkaban多Executor模式注意事項(xiàng)
一、Azkaban概論
1.1 為什么需要工作流調(diào)度系統(tǒng)
一個(gè)完整的數(shù)據(jù)分析系統(tǒng)通常都是由大量任務(wù)單元組成:Shell腳本程序,Java程序,MapReduce程序,Hive腳本等;各任務(wù)單元之間存在時(shí)間先后及前后依賴(lài)關(guān)系;為了很好地組織起這樣的復(fù)雜執(zhí)行計(jì)劃,需要一個(gè)工作流調(diào)度系統(tǒng)來(lái)調(diào)度執(zhí)行;
1.2 常見(jiàn)工作流調(diào)度系統(tǒng)
簡(jiǎn)單的任務(wù)調(diào)度:直接使用 Linux 的 Crontab 來(lái)定義;
注??:Crontab不能處理具有依賴(lài)關(guān)系的任務(wù)調(diào)度!復(fù)雜的任務(wù)調(diào)度:開(kāi)發(fā)調(diào)度平臺(tái)或使用現(xiàn)成的開(kāi)源調(diào)度系統(tǒng),比如 Ooize、Azkaban、 Airflow、DolphinScheduler 等。
1.3 Azkaban 與 Oozie 對(duì)比
Ooize 相比 Azkaban 是一個(gè)重量級(jí)的任務(wù)調(diào)度系統(tǒng),功能全面,但配置使用
也更復(fù)雜。如果可以不在意某些功能的缺失,輕量級(jí)調(diào)度器 Azkaban 是很不錯(cuò)的候選對(duì)象。
二、Azkaban集群安裝
2.1 集群模式安裝
2.1.1 安裝包準(zhǔn)備
將 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 包解壓到這個(gè)目錄下:
[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/
進(jìn)入/opt/module/azkaban 目錄,修改名稱(chēng):
[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
啟動(dòng)MySQL:
[xiaobai
@hadoop102 azkaban
]$ mysql
-uroot
-p
******
登陸 MySQL,創(chuàng)建 Azkaban 數(shù)據(jù)庫(kù):
mysql
> create database azkaban
;
Query OK
, 1 row affected
(0.19 sec
)
創(chuàng)建 azkaban 用戶(hù)并賦予權(quán)限 設(shè)置密碼有效長(zhǎng)度 4 位及以上
mysql
> set global validate_password_length
=4;
Query OK
, 0 rows affected
(0.07 sec
)
設(shè)置密碼策略最低級(jí)別(ps: 僅測(cè)試使用!)
mysql
> set global validate_password_policy
=0;
Query OK
, 0 rows affected
(0.00 sec
)
創(chuàng)建 Azkaban 用戶(hù),任何主機(jī)都可以訪問(wèn) Azkaban, 密碼******:
mysql
> CREATE USER 'azkaban'@'%' IDENTIFIED
BY '******';
Query OK
, 0 rows affected
(0.17 sec
)
賦予 Azkaban 用戶(hù)增刪改查權(quán)限:
mysql
> GRANT SELECT,INSERT,UPDATE,DELETE ON azkaban
.* to 'azkaban'@'%' WITH GRANT OPTION;
Query OK
, 0 rows affected
(0.03 sec
)
創(chuàng)建 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 處理工作流和作業(yè)的實(shí)際執(zhí)行。
在/opt/module/azkaban/azkaban-exec/conf目錄下編輯 azkaban.properties:
[xiaobai@hadoop102 conf
]$
vim azkaban.properties default.timezone.id
=Asia/Shanghai
同步分發(fā) azkaban-exec:
[xiaobai@hadoop102 conf
]$ xsync /opt/module/azkaban/azkaban-exec/
需進(jìn)入/opt/module/azkaban/azkaban-exec 路徑,分別在三臺(tái)機(jī)器上,啟動(dòng) 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 目錄下出現(xiàn) executor.port 文件:
或在azkaban數(shù)據(jù)庫(kù)中的executors表中出現(xiàn)我們所連接的主機(jī)名稱(chēng)及端口號(hào),則說(shuō)明啟動(dòng)成功!
激活 executor,如下status顯示success,則說(shuō)明激活成功!
[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 處理項(xiàng)目管理,身份驗(yàn)證,計(jì)劃和執(zhí)行觸發(fā)。
在/opt/module/azkaban/azkaban-web/conf目錄下編輯 azkaban.properties:
[xiaobai@hadoop102 conf
]$
vim azkaban.properties
修改如下屬性:
tips:
StaticRemainingFlowSize:正在排隊(duì)的任務(wù)數(shù);
CpuStatus:CPU占用情況:
MinimumFreeMemory:內(nèi)存占用情況。
修改 azkaban-users.xml 文件,添加用戶(hù)xiaobai:
[xiaobai@hadoop102 conf
]$
vim azkaban-users.xml
<user
password="******" roles="admin" username="xiaobai"/
>
需進(jìn)入到 hadoop102 的/opt/module/azkaban/azkaban-web 路徑,啟動(dòng) web server:
[xiaobai@hadoop102 azkaban-web
]$ bin/start-web.sh
停止命令:
[xiaobai@hadoop102 azkaban-web
]$ bin/shutdown-web.sh
訪問(wèn) http://hadoop102:8081,并用 xiaobai用戶(hù)登錄:
2.2 Work Flow 案例
2.2.1 HelloWorld
創(chuàng)建command.job文件:
jane@janedeMacBook-Pro Desktop %
vim command.job
type=command
command=echo 'hello world'
壓縮command.job,在WebServer新建項(xiàng)目,點(diǎn)擊Create Project==>Upload==>command.job??
點(diǎn)擊Execute Flow??
點(diǎn)擊Execute ??
Continue??
工作單元日志在Job List??
2.2.2 作業(yè)依賴(lài)案例
需求:
job A和job B執(zhí)行完之后才能執(zhí)行jobC。
實(shí)現(xiàn):
新建first.project 文件,編輯內(nèi)容如下:
azkaban-flow-version: 2.0
注??: 該文件作用,是采用新的 Flow-API 方式解析 flow 文件。
新建 first.flow 文件,內(nèi)容如下
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對(duì)齊 是數(shù)組類(lèi)型!
1). Name: job 名稱(chēng);
2). Type: job 類(lèi)型;command 表示要執(zhí)行作業(yè)的方式為命令;
3). Config: job 配置。
將文件壓縮上傳至Azkaban Web Client,點(diǎn)擊Execute flow,可以看到j(luò)obA / joB / jobC之間的依賴(lài)關(guān)系:
查看job list:
2.2.3 自動(dòng)失敗重試案例
需求:
如果執(zhí)行任務(wù)失敗,需要重試 3 次,重試的時(shí)間間隔 10000ms。
實(shí)現(xiàn):
編譯配置流: autoretry.flow:
nodes:- name: jobA
type: command
config:command: sh /not_exists.sh
retries: 3retry.backoff: 5000
tips:
retries: 重試次數(shù);
retry.backoff: 重試的時(shí)間間隔
注??:
可在 Flow 全局配置中添加任務(wù)失敗重試配置,此時(shí)重試配置會(huì)應(yīng)用到所有 Job:
config:retries: 3retry.backoff: 10000
nodes:- name: JobA
type: command
config:command: sh /not_exists.sh
2.2.4 手動(dòng)失敗重試案例
需求:
JobA=》JobB(依賴(lài)于 A)=》JobC=》JobD=》JobE=》JobF。生產(chǎn)環(huán)境,任何 Job 都 有可能掛掉,可以根據(jù)需求執(zhí)行想要執(zhí)行的 Job。
實(shí)現(xiàn):
編譯配置流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執(zhí)行圖:
若是有失敗的job,可在history==>flow里進(jìn)行查看
之后點(diǎn)擊prepare execution可接著從失敗的job開(kāi)始執(zhí)行:
或在excute flow中手動(dòng)將已經(jīng)成功的job設(shè)為disable / children,再繼續(xù)點(diǎn)擊execute!
tips:
Enable 和 Disable 下面都分別有如下參數(shù):
Parents: 該作業(yè)的上一個(gè)任務(wù);
Ancestors: 該作業(yè)前的所有任務(wù);
Children: 該作業(yè)后的一個(gè)任務(wù);
Descendents: 該作業(yè)后的所有任務(wù);
Enable All: 所有的任務(wù)。
三、Azkaban進(jìn)階
3.1 JavaProcess 作業(yè)類(lèi)型案例
JavaProcess 類(lèi)型可以運(yùn)行一個(gè)自定義主類(lèi)方法,type 類(lèi)型為 javaprocess,可用的配置為:
Xms:最小堆;
Xmx:最大堆;
classpath:類(lèi)路徑;
java.class:要運(yùn)行的 Java 對(duì)象,其中必須包含 Main 方法 main.args:main 方法的參數(shù)。
🌰:
新建一個(gè)azkaban的maven工程;創(chuàng)建包名: cpm.xiaobai;創(chuàng)建TestJavaProcess類(lèi):
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;創(chuàng)建prohect–>upload–>executor:
3.2 條件工作流案例
條件工作流功能允許用戶(hù)自定義執(zhí)行條件來(lái)決定是否運(yùn)行某些 Job。條件可以由當(dāng)前 Job 的父 Job 輸出的運(yùn)行時(shí)參數(shù)構(gòu)成,也可以使用預(yù)定義宏。在這些條件下,用戶(hù)可以在確定 Job 執(zhí)行邏輯時(shí)獲得更大的靈活性,例如,只要父 Job 之一成功,就可以運(yùn)行當(dāng)前 Job。
3.2.1 運(yùn)行時(shí)參數(shù)案例
基本原理
父 Job 將參數(shù)寫(xiě)入 JOB_OUTPUT_PROP_FILE 環(huán)境變量所指向的文件;子 Job 使用 ${jobName:param}來(lái)獲取父 Job 輸出的參數(shù)并定義執(zhí)行條件。
支持的條件運(yùn)算符
== 等于!= 不等于> 大于>= 大于等于< 小于<= 小于等于&& 與|| 或! 非
🌰:
需求:
JobA 執(zhí)行一個(gè) shell 腳本。
JobB 執(zhí)行一個(gè) shell 腳本,但 JobB 不需要每天都執(zhí)行,而只需要每個(gè)周一執(zhí)行。
實(shí)現(xiàn):
新建 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執(zhí)行:
JobA執(zhí)行成功,JobB cancelled,要等到周一才執(zhí)行jobB。
3.2.2 預(yù)定義宏案例
Azkaban 中預(yù)置了幾個(gè)特殊的判斷條件,稱(chēng)為預(yù)定義宏。
預(yù)定義宏會(huì)根據(jù)所有父 Job 的完成情況進(jìn)行判斷,再?zèng)Q定是否執(zhí)行;可用的預(yù)定義宏如下:
all_success: 表示父 Job 全部成功才執(zhí)行(默認(rèn));all_done:表示父 Job 全部完成才執(zhí)行;all_failed:表示父 Job 全部失敗才執(zhí)行;one_success:表示父 Job 至少一個(gè)成功才執(zhí)行;one_failed:表示父 Job 至少一個(gè)失敗才執(zhí)行。
需求:
JobA 執(zhí)行一個(gè) shell 腳本;
JobB 執(zhí)行一個(gè) shell 腳本;
JobC 執(zhí)行一個(gè) shell 腳本,要求 JobA、JobB 中有一個(gè)成功即可執(zhí)行;
實(shí)現(xiàn):
新建 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執(zhí)行:
JobA success,JobB fail,JobC success!
3.3 定時(shí)執(zhí)行案例
需求:
JobA 每間隔 1 分鐘執(zhí)行一次;
實(shí)現(xiàn):
在執(zhí)行工作流時(shí)候,選擇左下角 Schedule
填寫(xiě)定時(shí)規(guī)則:
可在history中查看first的執(zhí)行情況,每間隔一分鐘執(zhí)行一次:
scheduling中有next execution time可查看下一次執(zhí)行時(shí)間和remove schedule選項(xiàng)移除掉這個(gè)定時(shí)任務(wù):
3.4 郵件報(bào)警案例
3.4.1 登錄郵箱開(kāi)啟SMTP
在郵箱的賬戶(hù)里面開(kāi)啟SMTP服務(wù):
復(fù)制授權(quán)碼:
3.4.2 默認(rèn)郵件報(bào)警案例
Azkaban 默認(rèn)支持通過(guò)郵件對(duì)失敗的任務(wù)進(jìn)行報(bào)警,配置方法如下:
在/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 電話報(bào)警案例
3.5.1 第三方告警平臺(tái)集成
有時(shí)任務(wù)執(zhí)行失敗后郵件報(bào)警接收不及時(shí),因此可能需要其他報(bào)警方式,比如電話報(bào)警。
此時(shí),可與第三方告警平臺(tái)進(jìn)行集成,例如睿象云。
官網(wǎng)地址:
https://www.aiops.com/集成告警平臺(tái),使用 Email 集成;獲取郵箱地址,后需將報(bào)警信息發(fā)送至該郵箱;可配置分派策略/ 通知策略;
注??: 若要使用睿象云集成方式,則不可用QQ郵箱,需修改郵箱地址。
3.5.2 Azkaban多Executor模式注意事項(xiàng)
Azkaban 多 Executor 模式是指,在集群中多個(gè)節(jié)點(diǎn)部署 Executor。在這種模式下, Azkaban web Server 會(huì)根據(jù)策略,選取其中一個(gè) Executor 去執(zhí)行任務(wù)。
為確保所選的 Executor 能夠準(zhǔn)確的執(zhí)行任務(wù),我們須在以下兩種方案任選其一,推薦使 用方案二。
方案一:
指定特定的 Executor(hadoop102)去執(zhí)行任務(wù)。
在 MySQL 中 azkaban 數(shù)據(jù)庫(kù) executors 表中,查詢(xún) hadoop102 上的 Executor 的 id;
在執(zhí)行工作流程時(shí)加入 useExecutor 屬性:
方案二??:
在 Executor 所在所有節(jié)點(diǎn)部署任務(wù)所需腳本和應(yīng)用。
總結(jié)
以上是生活随笔為你收集整理的大数据之Azkaban部署的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。