文章内容輸出來源:拉勾教育大資料高薪訓練營
第 1 節 概述
1.1 工作流排程系統
⼀個完整的資料分析系統通常都是由⼤量任務單元組成:
- shell腳本程式
- java程式
- mapreduce程式
- hive腳本等
各任務單元之間存在時間先後及前後依賴關系,為了很好地組織起這樣的複雜執行計劃,需要⼀個工作流排程系統來排程任務的執行。
假如,我有這樣一個需求,某個業務系統每天産生20G原始資料,每天都要對其進行處理,處理步驟如下所示:
- 通過Hadoop先将原始資料同步到HDFS上;
- 借助MapReduce計算架構對原始資料進行轉換,生成的資料以分區表的形式存儲到多張Hive表中;
- 需要對Hive中多個表的資料進行JOIN處理,得到一個明細資料Hive大表;
- 将明細資料進行各種統計分析,得到結果報表資訊;
- 需要将統計分析得到的結果資料同步到業務系統中,供業務調用使用。
1.2 工作流排程實作方式
- 簡單的任務排程
- 直接使用linux的crontab
- 複雜的任務排程
- 開發排程平台或使用現成的開源排程系統,比如Ooize、Azkaban、Airflow等
1.3 Azkaban與Oozie對比
對市⾯上最流行的兩種排程器,進行對⽐分析。總體來說,Ooize相⽐Azkaban是⼀個重量級的任務排程系統,功能全面,但配置使用也更複雜(xml)。如果可以不在意某些功能的缺失,輕量級排程器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作為⼯作流伺服器運⾏,⽀持多使用者和多工作流
第 2 節 Azkaban介紹
Azkaban是由linkedin(領英)公司推出的⼀個批量工作流任務排程器,⽤于在一個⼯作流内以一個特定的順序運行⼀組工作和流程。Azkaban使用job配置檔案建立任務之間的依賴關系,并提供一個易于使用的web⽤戶界面維護和跟蹤你的工作流。
Azkaban定義了一種KV⽂件(properties)格式來建立任務之間的依賴關系,并提供一個易于使用的web使用者界⾯維護和跟蹤你的工作流。
有如下功能特點
- Web⽤戶界⾯
- ⽅便上傳工作流
- 友善設定任務之間的關系
- 排程工作流
架構⻆色
- mysql伺服器: 存儲中繼資料,如項⽬名稱、項目描述、項目權限、任務狀态、SLA規則等
- AzkabanWebServer:對外提供web服務,使使用者可以通過web⻚面管理。職責包括項⽬管理、權限授權、任務排程、監控executor。
- AzkabanExecutorServer:負責具體的工作流的送出、執行。
第 3 節 Azkaban安裝部署
3.1 Azkaban的安裝準備工作
1 編譯
這⾥選⽤azkaban3.51.0這個版本⾃己進行重新編譯,編譯完成之後得到我們需要的安裝包進行安裝
cd /opt/lagou/software/
wget https://github.com/azkaban/azkaban/archive/3.51.0.tar.gz
tar -zxvf 3.51.0.tar.gz -C ../servers/
cd /opt/lagou/servers/azkaban-3.51.0/
yum -y install git
yum -y install gcc-c++
./gradlew build installDist -x test
Gradlew是一個基于Apache Ant和Apache Maven的項⽬自動化建構工具。-x test 跳過測試。(注意聯網!下載下傳jar可能會失敗、慢)
2 上傳編譯後的安裝檔案
在linux122節點建立⽬錄
mkdir /opt/lagou/servers/azkaban
3.2 solo-server模式部署
1. 單服務模式安裝
1 解壓
azkaban的solo server使用的是一個單節點的模式來進行啟動服務的,隻需要一個azkaban-solo- server-0.1.0-SNAPSHOT.tar.gz的安裝包即可啟動,所有的資料資訊都是儲存在H2這個azkaban預設的資料當中
tar -zxvf azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz -C ../../servers/azkaban
2 修改配置⽂件
修改時區
cd /opt/lagou/servers/azkaban/azkaban-solo-server-0.1.0-SNAPSHOT/conf
vim azkaban.properties
default.timezone.id=Asia/Shanghai
修改commonprivate.properties配置檔案
cd /opt/lagou/servers/azkaban/azkaban-solo-server-0.1.0-SNAPSHOT/plugins/jobtypes
vim commonprivate.properties
execute.as.user=false
memCheck.enabled=false
azkaban預設需要3G的記憶體,剩餘記憶體不足則會報異常。
3 啟動solo-server
cd /opt/lagou/servers/azkaban/azkaban-solo-server-0.1.0-SNAPSHOT
bin/start-solo.sh
4 浏覽器⻚面通路
http://linux122:8081/index
使用者名:azkaban 密碼: azkaban
2. 單服務模式使用
需求:使⽤azkaban排程我們的shell腳本,執行linux的shell指令
具體步驟
開發job⽂件
建立普通⽂本檔案foo.job,檔案内容如下
type=command
command=echo 'hello world'
打成壓縮包foo.zip,上傳壓縮包到Azkaban
建立project
指定project名稱和描述資訊
Azkaban上傳壓縮包
檢視⼯作流計劃并執⾏
執行結果界面
停止程式
bin/shutdown-solo.sh
3.3 multiple-executor模式部署
1 安裝所需軟體
Azkaban Web服務安裝包
azkaban-web-server-0.1.0-SNAPSHOT.tar.gz
Azkaban執行服務安裝包
azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz
sql腳本
節點規劃
2 資料庫準備
linux123
#解壓資料庫腳本
tar -zxvf azkaban-db-0.1.0-SNAPSHOT.tar.gz -C /opt/lagou/servers/azkaban
進入mysql的用戶端執行以下指令
mysql -uroot -p
-- 設定密碼位數和強度
SET GLOBAL validate_password_length=5;
SET GLOBAL validate_password_policy=0;
-- 建立使用者azkaban
CREATE USER 'azkaban'@'%' IDENTIFIED BY 'azkaban';
-- 賦權
GRANT all privileges ON azkaban.* to 'azkaban'@'%' identified by 'azkaban' WITH GRANT OPTION;
CREATE DATABASE azkaban;
use azkaban;
-- 加載初始化sql建立表
source /opt/lagou/servers/azkaban/azkaban-db-0.1.0-SNAPSHOT/create-all-sql-0.1.0-SNAPSHOT.sql;
執行source後生成的表
3 配置Azkaban-web-server
進入linux122節點
解壓azkaban-web-server
tar -zxvf azkaban-web-server-0.1.0-SNAPSHOT.tar.gz -C ../../servers/azkaban/
進入解壓後的目錄
cd /opt/lagou/servers/azkaban/azkaban-web-server-0.1.0-SNAPSHOT
#生成ssl證書:
keytool -keystore keystore -alias jetty -genkey -keyalg RSA
注意:運行此指令後,會提示輸入目前⽣成keystore的密碼及相應資訊,輸入的密碼請記住(所有密碼統一以azkaban輸入)
修改 azkaban-web-server的配置檔案
cd /opt/lagou/servers/azkaban-web-server-3.51.0/conf
vim azkaban.properties
# Azkaban Personalization Settings
azkaban.name=Test
azkaban.label=My Local Azkaban
azkaban.color=#FF3601
azkaban.default.servlet.path=/index
web.resource.dir=web/
default.timezone.id=Asia/Shanghai # 修改點1:時區注意後⾯不要有空格
# Azkaban UserManager class
user.manager.class=azkaban.user.XmlUserManager
user.manager.xml.file=conf/azkaban-users.xml
# Azkaban Jetty server properties. 開啟使用ssl 并且指定端⼝
jetty.use.ssl=true # 修改點2:改為true
jetty.port=8443 # 修改點3:端口改為8443
jetty.maxThreads=25
# 修改點4:增加KeyStore for SSL ssl相關配置
jetty.keystore=keystore
jetty.password=azkaban
jetty.keypassword=azkaban
jetty.truststore=keystore
jetty.trustpassword=azkaban
注意密碼和證書路路徑
# 修改點5:Azkaban mysql settings by default. Users should configure their own username and password.
database.type=mysql
mysql.port=3306
mysql.host=linux123
mysql.database=azkaban
mysql.user=root
mysql.password=12345678
mysql.numconnections=100
#Multiple Executor 設定為false
azkaban.use.multiple.executors=true
# 修改點6:注釋掉校驗
#azkaban.executorselector.filters=StaticRemainingFlowSize,MinimumFreeMemory,Cp uStatus
azkaban.executorselector.comparator.NumberOfAssignedFlowComparator=1
azkaban.executorselector.comparator.Memory=1
azkaban.executorselector.comparator.LastDispatched=1
azkaban.executorselector.comparator.CpuUsage=1
添加屬性
mkdir -p plugins/jobtypes
cd plugins/jobtypes/
vim commonprivate.properties
azkaban.native.lib=false
execute.as.user=false
memCheck.enabled=false
4 配置Azkaban-exec-server
linux123節點,上傳exec安裝包到/opt/lagou/software/azkaban
tar -zxvf azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz –C /opt/lagou/servers/azkaban/
修改azkaban-exec-server的配置檔案
cd /opt/lagou/servers/azkaban-exec-server-0.1.0-SNAPSHOT/conf
vim azkaban.properties
# 修改點1:修改時區
default.timezone.id=Asia/Shanghai
# 修改點2:webserver url
azkaban.webserver.url=https://linux122:8443
# 修改點3:資料庫配置
database.type=mysql
mysql.port=3306
mysql.host=linux123
mysql.database=azkaban
mysql.user=root
mysql.password=12345678
# 修改點4:增加 Azkaban Executor settings
executor.port=12321
分發exec-server到linux121節點
scp -r azkaban-exec-server-0.1.0-SNAPSHOT/ linux121:/opt/lagou/servers/azkaban/
5 啟動服務
先啟動exec-server(linux121,linux123)
再啟動web-server(linux122)
#啟動exec-server
bin/start-exec.sh
#啟動web-server
bin/start-web.sh
激活exec-server
啟動webServer之後程序失敗消失,可通過安裝包根⽬錄下對應啟動日志進行排查。
需要⼿動激活executor
cd /opt/lagou/servers/azkaban/azkaban-exec-server-0.1.0-SNAPSHOT
curl -G "linux123:$(<./executor.port)/executor?action=activate" && echo
通路位址:https://linux122:8443
啟動時遇到的問題:
原因:權限不夠
解決辦法:
- 方式一:配置檔案中mysql配置前面建立的azkaban使用者
- 方式二:修改root使用者權限,允許其他節點連接配接
-- 賦予最大的權限
GRANT all ON *.* to 'root'@'%' identified by '12345678' WITH GRANT OPTION;
flush privileges;
第 4 節 Azkaban使用
4.1 shell command排程
與單機模式操作案例一樣
- 建立job描述檔案:vim command.job
type=command
command=echo 'hello'
- 将描述檔案打包成command.zip:zip command.job
- 通過azkaban的web界面建立project并上傳壓縮包
- 執行該job
4.2 job依賴排程
建立有依賴關系的多個job描述
第一個job:foo.job
type=command
command=echo 'hello'
第二個job:bar.job依賴foo.job
type=command
dependencies=foo
command=echo 'bar'
将上述兩個檔案打包成一個壓縮包:foobar.zip
在azkaban的web管理界面建立工程并上傳zip包
啟動⼯作流flow
4.3 HDFS任務排程
建立job描述檔案fs.job
type=command
command=/opt/lagou/servers/hadoop-2.9.2/bin/hadoop fs -mkdir /azkaban
打包、web界面建立project、上傳、啟動執行。
4.4 MapReduce任務排程
mr任務依然可以使用command的job類型來執行
建立job描述檔案,及mr程式jar包(示例中直接使用hadoop⾃帶的example jar)
mrwc.job
type=command
command=/opt/lagou/servers/hadoop-2.9.2/bin/hadoop jar hadoop-mapreduce-examples-2.9.2.jar wordcount /wordcount/input /wordcount/azout
将所有job資源檔案打到⼀個zip包中
在azkaban的web管理界面建立工程并上傳zip包
啟動job
遇到虛拟機記憶體不足運作緩慢的情況:
1. 增大機器記憶體
2. 使用清除系統緩存指令,暫時釋放一些記憶體
[[email protected] mapreduce]# echo 1 >/proc/sys/vm/drop_caches
[[email protected] mapreduce]# echo 2 >/proc/sys/vm/drop_caches
[[email protected] mapreduce]# echo 3 >/proc/sys/vm/drop_caches
4.5 Hive腳本任務排程
建立job描述檔案和hive腳本
Hive腳本: test.sql
use default;
drop table aztest;
create table aztest(id int,name string) row format delimited fields terminated by ',';
Job描述⽂件:hivef.job
type=command
command=/opt/lagou/servers/hive-2.3.7/bin/hive -f 'test.sql'
将所有job資源檔案打到一個zip包中建立工程并上傳zip包,啟動job
4.6 定時任務排程
6 定時任務排程
除了⼿動立即執行工作流任務外,azkaban也支援配置定時任務排程。
開啟方式如下: ⾸頁選擇待處理的project 選擇左邊schedule表示配置定時排程資訊,選擇右邊execute表示⽴即執行工作流任務。