一、概述
1.1 為什么需要工作流調(diào)度系統(tǒng)
1)一個完整的數(shù)據(jù)分析系統(tǒng)通常都是由大量任務(wù)單元組成:
shell腳本程序,java程序,mapreduce程序、hive腳本等
2)各任務(wù)單元之間存在時間先后及前后依賴關(guān)系
3)為了很好地組織起這樣的復(fù)雜執(zhí)行計劃,需要一個工作流調(diào)度系統(tǒng)來調(diào)度執(zhí)行;
例如,我們可能有這樣一個需求,某個業(yè)務(wù)系統(tǒng)每天產(chǎn)生20G原始數(shù)據(jù),我們每天都要對其進行處理,處理步驟如下所示:
通過Hadoop先將原始數(shù)據(jù)上傳到HDFS上(HDFS的操作);
使用MapReduce對原始數(shù)據(jù)進行清洗(MapReduce的操作);
將清洗后的數(shù)據(jù)導(dǎo)入到hive表中(hive的導(dǎo)入操作);
對Hive中多個表的數(shù)據(jù)進行JOIN處理,得到一張hive的明細表(創(chuàng)建中間表);
通過對明細表的統(tǒng)計和分析,得到結(jié)果報表信息(hive的查詢操作);
1.2 Azkaban的適用場景
根據(jù)以上業(yè)務(wù)場景: (2)任務(wù)依賴(1)任務(wù)的結(jié)果,(3)任務(wù)依賴(2)任務(wù)的結(jié)果,(4)任務(wù)依賴(3)任務(wù)的結(jié)果,(5)任務(wù)依賴(4)任務(wù)的結(jié)果。一般的做法是,先執(zhí)行完(1)再執(zhí)行(2),再一次執(zhí)行(3)(4)(5)。
這樣的話,整個的執(zhí)行過程都需要人工參加,并且得盯著各任務(wù)的進度。但是我們的很多任務(wù)都是在深更半夜執(zhí)行的,通過寫腳本設(shè)置crontab執(zhí)行。其實,整個過程類似于一個有向無環(huán)圖(DAG)。每個子任務(wù)相當(dāng)于大任務(wù)中的一個節(jié)點,也就是,我們需要的就是一個工作流的調(diào)度器,而Azkaban就是能解決上述問題的一個調(diào)度器。
1.3 什么是azkaban
Azkaban是由Linkedin公司推出的一個批量工作流任務(wù)調(diào)度器,主要用于在一個工作流內(nèi)以一個特定的順序運行一組工作和流程,它的配置是通過簡單的key:value對的方式,通過配置中的dependencies 來設(shè)置依賴關(guān)系。Azkaban使用job配置文件建立任務(wù)之間的依賴關(guān)系,并提供一個易于使用的web用戶界面維護和跟蹤你的工作流。
1.4 Azkaban特點
兼容任何版本的hadoop
易于使用的Web用戶界面
簡單的工作流的上傳
方便設(shè)置任務(wù)之間的關(guān)系
調(diào)度工作流
模塊化和可插拔的插件機制
認證/授權(quán)(權(quán)限的工作)
能夠殺死并重新啟動工作流
有關(guān)失敗和成功的電子郵件提醒
1.5 常見工作流調(diào)度系統(tǒng)
1)簡單的任務(wù)調(diào)度:直接使用crontab實現(xiàn);
2)復(fù)雜的任務(wù)調(diào)度:開發(fā)調(diào)度平臺或使用現(xiàn)成的開源調(diào)度系統(tǒng),比如ooize、azkaban等
1.6 ooize和azkaban特性對比
下面的表格對上述四種hadoop工作流調(diào)度器的關(guān)鍵特性進行了比較,盡管這些工作流調(diào)度器能夠解決的需求場景基本一致,但在設(shè)計理念,目標(biāo)用戶,應(yīng)用場景等方面還是存在顯著的區(qū)別,在做技術(shù)選型的時候,可以提供參考
1.7 Azkaban的架構(gòu)
Azkaban由三個關(guān)鍵組件構(gòu)成:
AzkabanWebServer:AzkabanWebServer是整個Azkaban工作流系統(tǒng)的主要管理者,它用戶登錄認證、負責(zé)project管理、定時執(zhí)行工作流、跟蹤工作流執(zhí)行進度等一系列任務(wù)。
AzkabanExecutorServer:負責(zé)具體的工作流的提交、執(zhí)行,它們通過mysql數(shù)據(jù)庫來協(xié)調(diào)任務(wù)的執(zhí)行。
關(guān)系型數(shù)據(jù)庫(MySQL):存儲大部分執(zhí)行流狀態(tài),AzkabanWebServer和AzkabanExecutorServer都需要訪問數(shù)據(jù)庫。
1.8 Azkaban下載地址
下載地址:http://azkaban.github.io/downloads.html
密碼:9h71
二、Azkaban安裝部署
2.1 安裝前準(zhǔn)備
將Azkaban Web服務(wù)器、Azkaban執(zhí)行服務(wù)器、Azkaban的sql執(zhí)行腳本及MySQL安裝包拷貝到bigdata111虛擬機/opt/software目錄下
azkaban-web-server-2.5.0.tar.gz
azkaban-executor-server-2.5.0.tar.gz
azkaban-sql-script-2.5.0.tar.gz
mysql-libs.zip
選擇Mysql作為Azkaban數(shù)據(jù)庫,因為Azkaban建立了一些Mysql連接增強功能,以方便Azkaban設(shè)置,并增強服務(wù)可靠性。
2.2 安裝Azkaban
在/opt/module/目錄下創(chuàng)建azkaban目錄
[AncientMing@bigdata111 module]$ mkdir azkaban
解壓azkaban-web-server-2.5.0.tar.gz、azkaban-executor-server-2.5.0.tar.gz、azkaban-sql-script-2.5.0.tar.gz到/opt/module/azkaban目錄下
[AncientMing@bigdata111 software]$ tar -zxvf azkaban-web-server-2.5.0.tar.gz -C /opt/module/azkaban/
[AncientMing@bigdata111 software]$ tar -zxvf azkaban-executor-server-2.5.0.tar.gz -C /opt/module/azkaban/
[AncientMing@bigdata111 software]$ tar -zxvf azkaban-sql-script-2.5.0.tar.gz -C /opt/module/azkaban/
對解壓后的文件重新命名
[AncientMing@bigdata111 azkaban]$ mv azkaban-web-2.5.0/ server
[AncientMing@bigdata111 azkaban]$ mv azkaban-executor-2.5.0/ executor
azkaban腳本導(dǎo)入
進入mysql,創(chuàng)建azkaban數(shù)據(jù)庫,并將解壓的腳本導(dǎo)入到azkaban數(shù)據(jù)庫。
[AncientMing@bigdata111 azkaban]$ mysql -uroot -p000000
mysql> create database azkaban;
mysql> use azkaban;
mysql> source /opt/module/azkaban/azkaban-2.5.0/create-all-sql-2.5.0.sql
注:source后跟.sql文件,用于批量處理.sql文件中的sql語句。
2.3 生成密鑰庫
Keytool是java數(shù)據(jù)證書的管理工具,使用戶能夠管理自己的公/私鑰對及相關(guān)證書。
-keystore 指定密鑰庫的名稱及位置(產(chǎn)生的各類信息將不在.keystore文件中)
-genkey 在用戶主目錄中創(chuàng)建一個默認文件".keystore"
-alias 對我們生成的.keystore 進行指認別名;如果沒有默認是mykey
-keyalg 指定密鑰的算法 RSA/DSA 默認是DSA
1)生成 keystore的密碼及相應(yīng)信息的密鑰庫
[AncientMing@bigdata111 azkaban]$ keytool -keystore keystore -alias jetty -genkey -keyalg RSA
輸入密鑰庫口令: 000000
再次輸入新口令: 000000
您的名字與姓氏是什么?
[Unknown]:
您的組織單位名稱是什么?
[Unknown]:
您的組織名稱是什么?
[Unknown]:
您所在的城市或區(qū)域名稱是什么?
[Unknown]:
您所在的省/市/自治區(qū)名稱是什么?
[Unknown]:
該單位的雙字母國家/地區(qū)代碼是什么?
[Unknown]:
CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown是否正確?
[否]: y
輸入 <jetty> 的密鑰口令 000000
(如果和密鑰庫口令相同, 按回車):
再次輸入新口令: 000000
注意:
密鑰庫的密碼至少必須6個字符,可以是純數(shù)字或者字母或者數(shù)字和字母的組合等等
密鑰庫的密碼最好和<jetty> 的密鑰相同,方便記憶
2)將keystore 拷貝到 azkaban web服務(wù)器根目錄中
[AncientMing@bigdata111 azkaban]$ mv keystore /opt/module/azkaban/server/
2.4 時間同步配置
先配置好服務(wù)器節(jié)點上的時區(qū)
如果在/usr/share/zoneinfo/這個目錄下不存在時區(qū)配置文件Asia/Shanghai,就要用 tzselect 生成。
[AncientMing@bigdata111 azkaban]$ tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent or ocean.
- Africa
- Americas
- Antarctica
- Arctic Ocean
- Asia
- Atlantic Ocean
- Australia
- Europe
- Indian Ocean
- Pacific Ocean
- none - I want to specify the time zone using the Posix TZ format.
#? 5
Please select a country.
- Afghanistan 18) Israel 35) Palestine
- Armenia 19) Japan 36) Philippines
- Azerbaijan 20) Jordan 37) Qatar
- Bahrain 21) Kazakhstan 38) Russia
- Bangladesh 22) Korea (North) 39) Saudi Arabia
- Bhutan 23) Korea (South) 40) Singapore
- Brunei 24) Kuwait 41) Sri Lanka
- Cambodia 25) Kyrgyzstan 42) Syria
- China 26) Laos 43) Taiwan
- Cyprus 27) Lebanon 44) Tajikistan
- East Timor 28) Macau 45) Thailand
- Georgia 29) Malaysia 46) Turkmenistan
- Hong Kong 30) Mongolia 47) United Arab Emirates
- India 31) Myanmar (Burma) 48) Uzbekistan
- Indonesia 32) Nepal 49) Vietnam
- Iran 33) Oman 50) Yemen
- Iraq 34) Pakistan
#? 9
Please select one of the following time zone regions.
- Beijing Time
- Xinjiang Time
#? 1
The following information has been given:
China
Beijing Time
Therefore TZ='Asia/Shanghai' will be used.
Local time is now: Thu Oct 18 16:24:23 CST 2018.
Universal Time is now: Thu Oct 18 08:24:23 UTC 2018.
Is the above information OK?
- Yes
- No
#? 1
You can make this change permanent for yourself by appending the line
TZ='Asia/Shanghai'; export TZ
to the file '.profile' in your home directory; then log out and log in again.
Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
Asia/Shanghai
2)拷貝該時區(qū)文件,覆蓋系統(tǒng)本地時區(qū)配置
[AncientMing@bigdata111 azkaban]$ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
3)集群時間同步(同時發(fā)給三個窗口)
[AncientMing@bigdata111 azkaban]$ sudo date -s '2019-05-20 20:39:30'
2.5 配置文件
2.5.1 Web服務(wù)器配置
1)進入azkaban web服務(wù)器安裝目錄 conf目錄,打開azkaban.properties文件
[AncientMing@bigdata111 conf]$ pwd
/opt/module/azkaban/server/conf
[AncientMing@bigdata111 conf]$ vi azkaban.properties
2)按照如下配置修改azkaban.properties文件。
#Azkaban Personalization Settings
#服務(wù)器UI名稱,用于服務(wù)器上方顯示的名字
azkaban.name=Test
#描述
azkaban.label=My Local Azkaban
#UI顏色
azkaban.color=#FF3601
azkaban.default.servlet.path=/index
#默認web server存放web文件的目錄
web.resource.dir=/opt/module/azkaban/server/web/
#默認時區(qū),已改為亞洲/上海 默認為美國
default.timezone.id=Asia/Shanghai
#Azkaban UserManager class
user.manager.class=azkaban.user.XmlUserManager
#用戶權(quán)限管理默認類(絕對路徑)
user.manager.xml.file=/opt/module/azkaban/server/conf/azkaban-users.xml
#Loader for projects
#global配置文件所在位置(絕對路徑)
executor.global.properties=/opt/module/azkaban/executor/conf/global.properties
azkaban.project.dir=projects
#數(shù)據(jù)庫類型
database.type=mysql
#端口號
mysql.port=3306
#數(shù)據(jù)庫連接IP
mysql.host=bigdata112
#數(shù)據(jù)庫實例名
mysql.database=azkaban
#數(shù)據(jù)庫用戶名
mysql.user=root
#數(shù)據(jù)庫密碼
mysql.password=000000
#最大連接數(shù)
mysql.numconnections=100
# Velocity dev mode
velocity.dev.mode=false
# Azkaban Jetty server properties.
# Jetty服務(wù)器屬性.
#最大線程數(shù)
jetty.maxThreads=25
#Jetty SSL端口
jetty.ssl.port=8443
#Jetty端口
jetty.port=8081
#SSL文件名(絕對路徑)
jetty.keystore=/opt/module/azkaban/server/keystore
#SSL文件密碼
jetty.password=000000
#Jetty主密碼與keystore文件相同
jetty.keypassword=000000
#SSL文件名(絕對路徑)
jetty.truststore=/opt/module/azkaban/server/keystore
#SSL文件密碼
jetty.trustpassword=000000
# Azkaban Executor settings
executor.port=12321
# mail settings
mail.sender=
mail.host=
job.failure.email=
job.success.email=
lockdown.create.projects=false
cache.directory=cache
3)web服務(wù)器用戶配置
在azkaban web服務(wù)器安裝目錄 conf目錄,按照如下配置修改azkaban-users.xml 文件,增加管理員用戶。
[AncientMing@bigdata111 conf]$ 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>
2.5.2 執(zhí)行服務(wù)器配置
1)進入執(zhí)行服務(wù)器安裝目錄conf,打開azkaban.properties
[AncientMing@bigdata111 conf]$ pwd
/opt/module/azkaban/executor/conf
[AncientMing@bigdata111 conf]$ vim azkaban.properties
按照如下配置修改azkaban.properties文件。
#Azkaban
#時區(qū)
default.timezone.id=Asia/Shanghai
# Azkaban JobTypes Plugins
#jobtype 插件所在位置
azkaban.jobtype.plugin.dir=plugins/jobtypes
#Loader for projects
executor.global.properties=/opt/module/azkaban/executor/conf/global.properties
azkaban.project.dir=projects
database.type=mysql
mysql.port=3306
mysql.host=bigdata112
mysql.database=azkaban
mysql.user=root
mysql.password=000000
mysql.numconnections=100
# Azkaban Executor settings
#最大線程數(shù)
executor.maxThreads=50
#端口號(如修改,請與web服務(wù)中一致)
executor.port=12321
#線程數(shù)
executor.flow.threads=30
2.6 啟動executor服務(wù)器
在executor服務(wù)器目錄下執(zhí)行啟動命令
[AncientMing@bigdata111 executor]$ pwd
/opt/module/azkaban/executor
[AncientMing@bigdata111 executor]$ bin/azkaban-executor-start.sh
2.7 啟動web服務(wù)器
在azkaban web服務(wù)器目錄下執(zhí)行啟動命令
[AncientMing@bigdata111 server]$ pwd
/opt/module/azkaban/server
[AncientMing@bigdata111 server]$ bin/azkaban-web-start.sh
注意:
先執(zhí)行executor,再執(zhí)行web,避免Web Server會因為找不到執(zhí)行器啟動失敗。
jps查看進程
[AncientMing@bigdata111 server]$ jps
3601 AzkabanExecutorServer
5880 Jps
3661 AzkabanWebServer
啟動完成后,在瀏覽器(建議使用谷歌瀏覽器)中輸入https://服務(wù)器IP地址:8443,即可訪問azkaban服務(wù)了。
在登錄中輸入剛才在azkaban-users.xml文件中新添加的戶用名及密碼,即admin和admin,點擊 login。
三、Azkaban實戰(zhàn)
Azkaba內(nèi)置的任務(wù)類型支持command、java
3.1單一job案例
1)創(chuàng)建job描述文件
[AncientMing@bigdata111 jobs]$ vim first.job
#first.job
type=command
command=echo 'this is my first job'
- 將job資源文件打包成zip文件
[AncientMing@bigdata111 jobs]$ zip first.zip first.job
adding: first.job (deflated 15%)
[AncientMing@bigdata111 jobs]$ ll
總用量 8
-rw-rw-r--. 1 AncientMing AncientMing 60 10月 18 17:42 first.job
-rw-rw-r--. 1 AncientMing AncientMing 219 10月 18 17:43 first.zip
注意:
目前,Azkaban上傳的工作流文件只支持xxx.zip文件。zip應(yīng)包含xxx.job運行作業(yè)所需的文件和任何文件(文件名后綴必須以.job結(jié)尾,否則無法識別)。作業(yè)名稱在項目中必須是唯一的。
3)通過azkaban的web管理平臺創(chuàng)建project并上傳job的zip包
首先創(chuàng)建project
上傳zip包
4)啟動執(zhí)行該job
點擊執(zhí)行工作流
點擊繼續(xù)
5)Job執(zhí)行成功
6)點擊查看job日志
3.2多job工作流案例
1)創(chuàng)建有依賴關(guān)系的多個job描述
第一個job:1.job
[AncientMing@bigdata111 jobs]$ vi 1.job
type=command
command=/opt/module/hadoop-2.8.4/bin/hadoop fs -put /opt/module/datas/word.txt /
第二個job:2.job依賴1.job
[AncientMing@bigdata111 jobs]$ vi 2.job
type=command
command=/opt/module/hadoop-2.8.4/bin/hadoop jar /opt/module/hadoop-2.8.4/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.4.jar wordcount /word.txt /out
dependencies=1
2)注意:將所有job資源文件打到一個zip包中
3)在azkaban的web管理界面創(chuàng)建工程并上傳zip包
4)查看結(jié)果
思考:
將student.txt文件上傳到hdfs,根據(jù)所傳文件創(chuàng)建外部表,再將表中查詢到的結(jié)果寫入到本地文件
3.3 java操作任務(wù)
使用Azkaban調(diào)度java程序
1)編寫java程序
import java.io.FileOutputStream;
import java.io.IOException;
public class AzkabanTest {
public void run() throws IOException {
// 根據(jù)需求編寫具體代碼
FileOutputStream fos = new FileOutputStream("/opt/module/azkaban/output.txt");
fos.write("this is a java progress".getBytes());
fos.close();
}
public static void main(String[] args) throws IOException {
AzkabanTest azkabanTest = new AzkabanTest();
azkabanTest.run();
}
}
2)將java程序打成jar包,創(chuàng)建lib目錄,將jar放入lib內(nèi)
[AncientMing@bigdata111 azkaban]$ mkdir lib
[AncientMing@bigdata111 azkaban]$ cd lib/
[AncientMing@bigdata111 lib]$ ll
總用量 4
-rw-rw-r--. 1 AncientMing AncientMing 3355 10月 18 20:55 azkaban-0.0.1-SNAPSHOT.jar
3)編寫job文件
[AncientMing@bigdata111 jobs]$ vi azkabanJava.job
#azkabanJava.job
type=javaprocess
java.class=AzkabanTest(全類名)
classpath=/opt/module/azkaban/lib/*
4)將job文件打成zip包
[AncientMing@bigdata111 jobs]$ zip azkabanJava.zip azkabanJava.job
adding: azkabanJava.job (deflated 19%)
5)通過azkaban的web管理平臺創(chuàng)建project并上傳job壓縮包,啟動執(zhí)行該job
[AncientMing@bigdata111 azkaban]$ cat /opt/module/azkaban/output.txt
3.3 HDFS操作任務(wù)
1)創(chuàng)建job描述文件
[AncientMing@bigdata111 jobs]$ vi hdfs.job
#hdfs job
type=command
command=/opt/module/hadoop-2.8.4/bin/hadoop fs -mkdir /azkaban
2)將job資源文件打包成zip文件
[AncientMing@bigdata111 jobs]$ zip fs.zip fs.job
adding: fs.job (deflated 12%)
3)通過azkaban的web管理平臺創(chuàng)建project并上傳job壓縮包
4)啟動執(zhí)行該job
5)查看結(jié)果
3.4 mapreduce任務(wù)
mapreduce任務(wù)依然可以使用azkaban進行調(diào)度
創(chuàng)建job描述文件,及mr程序jar包
[AncientMing@bigdata111 jobs]$ vim mapreduce.job
#mapreduce job
type=command
command=/opt/module/hadoop-2.8.4/bin/hadoop jar /opt/module/hadoop-2.8.4/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.4.jar wordcount /wordcount/input /wordcount/output
將所有job資源文件打到一個zip包中
[AncientMing@bigdata111 jobs]$ zip mapreduce.zip mapreduce.job
adding: mapreduce.job (deflated 43%)
3)在azkaban的web管理界面創(chuàng)建工程并上傳zip包
4)啟動job
5)查看結(jié)果
3.5 Hive腳本任務(wù)
1)創(chuàng)建job描述文件和hive腳本
(1)Hive腳本:student.sql
[AncientMing@bigdata111 jobs]$ vim student.sql
use default;
drop table student;
create table student(id int, name string)
row format delimited fields terminated by '\t';
load data local inpath '/opt/module/datas/student.txt' into table student;
insert overwrite local directory '/opt/module/datas/student'
row format delimited fields terminated by '\t'
select * from student;
(2)Job描述文件:hive.job
[AncientMing@bigdata111 jobs]$ vim hive.job
#hive job
type=command
command=/opt/module/hive/bin/hive -f /opt/module/azkaban/jobs/student.sql
將所有job資源文件打到一個zip包中
3)在azkaban的web管理界面創(chuàng)建工程并上傳zip包
4)啟動job
5)查看結(jié)果
[AncientMing@bigdata111 student]$ cat /opt/module/datas/student/000000_0