1. 程式人生 > >工作流調度器

工作流調度器

servle 先後 a13 strong threads 移動 plugins 流程 服務器

1. 工作流調度系統產生背景
一個完整的數據分析系統通常都是由大量任務單元組成:
shell腳本程序,java程序,mapreduce程序、hive腳本等。
各個任務單元之間存在時間先後依賴關系。
為了很好地組織起這樣的復雜執行計劃,需要一個工作流調度系統來調度執行;
2. 工作流調度實現方式
簡單的任務調度:
直接使用linux的crontab來定義,但是缺點也是比較明顯,無法設置依賴。
復雜的任務調度:
自主開發調度平臺
使用開源調度系統,比如azkaban、ooize、Zeus等。
其中知名度比較高的是Apache Oozie,但是其配置工作流的過程是編寫大量的XML配置,而且代碼復雜度比較高,不易於二次開發。

3. Azkaban調度器
3.1. Azkaban介紹
Azkaban是由Linkedin公司推出的一個批量工作流任務調度器,用於在一個工作流內以一個特定的順序運行一組工作和流程。Azkaban使用job配置文件建立任務之間的依賴關系,並提供一個易於使用的web用戶界面維護和跟蹤你的工作流。

Azkaban功能特點:
· 提供功能清晰,簡單易用的Web UI界面
· 提供job配置文件快速建立任務和任務之間的依賴關系
· 提供模塊化和可插拔的插件機制,原生支持command、Java、Hive、Pig、Hadoop
· 基於Java開發,代碼結構清晰,易於二次開發
3.2. Azkaban安裝部署
Azkaban的組成如下:

技術分享圖片
mysql服務器:用於存儲項目、日誌或者執行計劃之類的信息
web服務器:使用Jetty對外提供web服務,使用戶可以通過web頁面方便管理
executor服務器:負責具體的工作流的提交、執行。
Azkaban有兩種部署方式:solo server mode 和 cluster server mode。
· solo server mode(單機模式):該模式中webServer和executorServer運行在同一個進程中,進程名是AzkabanSingleServer。可以使用自帶的H2數據庫或者配置mysql數據。該模式適用於小規模的使用。
· cluster server mode(集群模式):該模式使用MySQL數據庫,webServer和executorServer運行在不同進程中,該模式適用於大規模應用。
其實在單機模式中,AzkabanSingleServer進程只是把AzkabanWebServer和AzkabanExecutorServer合到一起啟動而已。
準備工作
Azkaban Web服務器
azkaban-web-server-2.5.0.tar.gz
Azkaban執行服務器
azkaban-executor-server-2.5.0.tar.gz
MySQL
本文檔中默認已安裝好mysql服務器。
下載地址:http://azkaban.github.io/downloads.html
上傳安裝包
將安裝包上傳到集群,最好上傳到安裝hive、sqoop的機器上,方便命令的執行。
新建azkaban目錄,用於存放azkaban運行程序。
azkaban web服務器安裝
解壓azkaban-web-server-2.5.0.tar.gz
命令: tar –zxvf azkaban-web-server-2.5.0.tar.gz
將解壓後的azkaban-web-server-2.5.0 移動到 azkaban目錄中,並重新命名 webserver
命令: mv azkaban-web-server-2.5.0 ../azkaban
cd ../azkaban
mv azkaban-web-server-2.5.0 server
azkaban 執行服器安裝
解壓azkaban-executor-server-2.5.0.tar.gz
命令:tar –zxvf azkaban-executor-server-2.5.0.tar.gz
將解壓後的azkaban-executor-server-2.5.0 移動到 azkaban目錄中,並重新命名 executor
命令:mv azkaban-executor-server-2.5.0 ../azkaban
cd ../azkaban
mv azkaban-executor-server-2.5.0 executor
azkaban腳本導入
解壓: azkaban-sql-script-2.5.0.tar.gz
命令:tar –zxvf azkaban-sql-script-2.5.0.tar.gz
將解壓後的mysql 腳本,導入到mysql中:
進入mysql
mysql> create database azkaban;
mysql> use azkaban;
Database changed
mysql> source /home/hadoop/azkaban-2.5.0/create-all-sql-2.5.0.sql;
創建SSL配置(https)
命令: keytool -keystore keystore -alias jetty -genkey -keyalg RSA
運行此命令後,會提示輸入當前生成 keystor的密碼及相應信息,輸入的密碼請勞記,信息如下:
輸入keystore密碼:
再次輸入新密碼:
您的名字與姓氏是什麽?
[Unknown]:
您的組織單位名稱是什麽?
[Unknown]:
您的組織名稱是什麽?
[Unknown]:
您所在的城市或區域名稱是什麽?
[Unknown]:
您所在的州或省份名稱是什麽?
[Unknown]:
該單位的兩字母國家代碼是什麽
[Unknown]: CN
CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=CN 正確嗎?
[否]: y
輸入<jetty>的主密碼
(如果和 keystore 密碼相同,按回車):
再次輸入新密碼:
完成上述工作後,將在當前目錄生成 keystore證書文件,將keystore拷貝到 azkaban web服務器根目錄中.如:cp keystore azkaban/webserver
配置文件
註:先配置好服務器節點上的時區
先生成時區配置文件Asia/Shanghai,用交互式命令 tzselect 即可
拷貝該時區文件,覆蓋系統本地時區配置
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
? azkaban web服務器配置
進入azkaban web服務器安裝目錄 conf目錄
修改azkaban.properties文件
#Azkaban Personalization Settings
azkaban.name=Test #服務器UI名稱,用於服務器上方顯示的名字
azkaban.label=My Local Azkaban #描述
azkaban.color=#FF3601 #UI顏色
azkaban.default.servlet.path=/index #
web.resource.dir=web/ #默認根web目錄
default.timezone.id=Asia/Shanghai #默認時區,已改為亞洲/上海 默認為美國
#Azkaban UserManager class
user.manager.class=azkaban.user.XmlUserManager #用戶權限管理默認類
user.manager.xml.file=conf/azkaban-users.xml #用戶配置,具體配置參加下文
#Loader for projects
executor.global.properties=conf/global.properties # global配置文件所在位置
azkaban.project.dir=projects #
database.type=mysql #數據庫類型
mysql.port=3306 #端口號
mysql.host=hadoop03 #數據庫連接IP
mysql.database=azkaban #數據庫實例名
mysql.user=root #數據庫用戶名
mysql.password=root #數據庫密碼
mysql.numconnections=100 #最大連接數

Velocity dev mode

velocity.dev.mode=false

Jetty服務器屬性.

jetty.maxThreads=25 #最大線程數
jetty.ssl.port=8443 #Jetty SSL端口
jetty.port=8081 #Jetty端口
jetty.keystore=keystore #SSL文件名
jetty.password=123456 #SSL文件密碼
jetty.keypassword=123456 #Jetty主密碼 與 keystore文件相同
jetty.truststore=keystore #SSL文件名
jetty.trustpassword=123456 # SSL文件密碼

執行服務器屬性

executor.port=12321 #執行服務器端口

郵件設置

[email protected] #發送郵箱
mail.host=smtp.163.com #發送郵箱smtp地址
mail.user=xxxxxxxx #發送郵件時顯示的名稱
mail.password=** #郵箱密碼
[email protected] #任務失敗時發送郵件的地址
[email protected] #任務成功時發送郵件的地址
lockdown.create.projects=false #
cache.directory=cache #緩存目錄
? azkaban 執行服務器配置
進入執行服務器安裝目錄conf,修改azkaban.properties
vi azkaban.properties
#Azkaban
default.timezone.id=Asia/Shanghai #時區

Azkaban JobTypes 插件配置

azkaban.jobtype.plugin.dir=plugins/jobtypes #jobtype 插件所在位置
#Loader for projects
executor.global.properties=conf/global.properties
azkaban.project.dir=projects
#數據庫設置
database.type=mysql #數據庫類型(目前只支持mysql)
mysql.port=3306 #數據庫端口號
mysql.host=192.168.20.200 #數據庫IP地址
mysql.database=azkaban #數據庫實例名
mysql.user=azkaban #數據庫用戶名
mysql.password=oracle #數據庫密碼
mysql.numconnections=100 #最大連接數

執行服務器配置

executor.maxThreads=50 #最大線程數
executor.port=12321 #端口號(如修改,請與web服務中一致)
executor.flow.threads=30 #線程數
? 用戶配置
進入azkaban web服務器conf目錄,修改azkaban-users.xml
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>
啟動
web服務器
在azkaban web服務器目錄下執行啟動命令
bin/azkaban-web-start.sh
註:在web服務器根目錄運行
執行服務器
在執行服務器目錄下執行啟動命令
bin/azkaban-executor-start.sh ./
註:只能要執行服務器根目錄運行
啟動完成後,在瀏覽器(建議使用谷歌瀏覽器)中輸入https://服務器IP地址:8443 ,即可訪問azkaban服務了.在登錄中輸入剛才新的戶用名及密碼,點擊login.

3.3. Azkaban實戰
Command類型單一job示例
? 創建job描述文件
vi command.job
#command.job
type=command
command=echo ‘hello‘
? 將job資源文件打包成zip文件
zip command.job
? 通過azkaban的web管理平臺創建project並上傳job壓縮包
首先創建Project
技術分享圖片
上傳zip包
技術分享圖片
? 啟動執行該job
技術分享圖片
Command類型多job工作流flow
? 創建有依賴關系的多個job描述
第一個job:foo.job

foo.job

type=command
command=echo foo
第二個job:bar.job依賴foo.job

bar.job

type=command
dependencies=foo
command=echo bar
? 將所有job資源文件打到一個zip包中
技術分享圖片
? 在azkaban的web管理界面創建工程並上傳zip包
? 啟動工作流flow
HDFS操作任務
? 創建job描述文件

fs.job

type=command
command=/home/hadoop/apps/hadoop-2.6.1/bin/hadoop fs -mkdir /azaz
? 將job資源文件打包成zip文件
技術分享圖片
? 通過azkaban的web管理平臺創建project並上傳job壓縮包
? 啟動執行該job
MAPREDUCE任務
mr任務依然可以使用command的job類型來執行
? 創建job描述文件,及mr程序jar包(示例中直接使用hadoop自帶的example jar)

mrwc.job

type=command
command=/home/hadoop/apps/hadoop-2.6.1/bin/hadoop jar hadoop-mapreduce-examples-2.6.1.jar wordcount /wordcount/input /wordcount/azout
? 將所有job資源文件打到一個zip包中
技術分享圖片
? 在azkaban的web管理界面創建工程並上傳zip包
? 啟動job
HIVE腳本任務
? 創建job描述文件和hive腳本
Hive腳本: test.sql
use default;
drop table aztest;
create table aztest(id int,name string) row format delimited fields terminated by ‘,‘;
load data inpath ‘/aztest/hiveinput‘ into table aztest;
create table azres as select * from aztest;
insert overwrite directory ‘/aztest/hiveoutput‘ select count(1) from aztest;
Job描述文件:hivef.job

hivef.job

type=command
command=/home/hadoop/apps/hive/bin/hive -f ‘test.sql‘
? 將所有job資源文件打到一個zip包中創建工程並上傳zip包,啟動job

工作流調度器