1. 程式人生 > >工作流調度系統Azkaban的簡介和使用

工作流調度系統Azkaban的簡介和使用

download 版本 role edi 數據分析 訪問 label rec test

1 概述

1.1 為什麽需要工作流調度系統

l 一個完整的數據分析系統通常都是由大量任務單元組成:

shell腳本程序,java程序,mapreduce程序、hive腳本等

l 各任務單元之間存在時間先後及前後依賴關系

l 為了很好地組織起這樣的復雜執行計劃,需要一個工作流調度系統來調度執行;

例如,我們可能有這樣一個需求,某個業務系統每天產生20G原始數據,我們每天都要對其進行處理,處理步驟如下所示:

1、 通過Hadoop先將原始數據同步到HDFS上;

2、 借助MapReduce計算框架對原始數據進行轉換,生成的數據以分區表的形式存儲到多張Hive表中;

3、 需要對Hive中多個表的數據進行JOIN處理,得到一個明細數據Hive大表;

4、 將明細數據進行復雜的統計分析,得到結果報表信息;

5、 需要將統計分析得到的結果數據同步到業務系統中,供業務調用使用。

1.2 工作流調度實現方式

簡單的任務調度:直接使用linux的crontab來定義;

復雜的任務調度:開發調度平臺

或使用現成的開源調度系統,比如ooize、azkaban等

1.3 常見工作流調度系統

市面上目前有許多工作流調度器

在hadoop領域,常見的工作流調度器有Oozie, Azkaban,Cascading,Hamake等

1.4 各種調度工具特性對比

下面的表格對上述四種hadoop工作流調度器的關鍵特性進行了比較,盡管這些工作流調度器能夠解決的需求場景基本一致,但在設計理念,目標用戶,應用場景等方面還是存在顯著的區別,在做技術選型的時候,可以提供參考

特性

Hamake

Oozie

Azkaban

Cascading

工作流描述語言

XML

XML (xPDL based)

text file with key/value pairs

Java API

依賴機制

data-driven

explicit

explicit

explicit

是否要web容器

No

Yes

Yes

No

進度跟蹤

console/log messages

web page

web page

Java API

Hadoop job調度支持

no

yes

yes

yes

運行模式

command line utility

daemon

daemon

API

Pig支持

yes

yes

yes

yes

事件通知

no

no

no

yes

需要安裝

no

yes

yes

no

支持的hadoop版本

0.18+

0.20+

currently unknown

0.18+

重試支持

no

workflownode evel

yes

yes

運行任意命令

yes

yes

yes

yes

Amazon EMR支持

yes

no

currently unknown

yes

1.5 Azkaban與Oozie對比

對市面上最流行的兩種調度器,給出以下詳細對比,以供技術選型參考。總體來說,ooize相比azkaban是一個重量級的任務調度系統,功能全面,但配置使用也更復雜。如果可以不在意某些功能的缺失,輕量級調度器azkaban是很不錯的候選對象。

詳情如下:

u 功能

兩者均可以調度mapreduce,pig,java,腳本工作流任務

兩者均可以定時執行工作流任務

u 工作流定義

Azkaban使用Properties文件定義工作流

Oozie使用XML文件定義工作流

u 工作流傳參

Azkaban支持直接傳參,例如${input}

Oozie支持參數和EL表達式,例如${fs:dirSize(myInputDir)}

u 定時執行

Azkaban的定時執行任務是基於時間的

Oozie的定時執行任務基於時間和輸入數據

u 資源管理

Azkaban有較嚴格的權限控制,如用戶對工作流進行讀/寫/執行等操作

Oozie暫無嚴格的權限控制

u 工作流執行

Azkaban有兩種運行模式,分別是soloserver mode(executor server和web server部署在同一臺節點)和multi server mode(executor server和web server可以部署在不同節點)

Oozie作為工作流服務器運行,支持多用戶和多工作流

u 工作流管理

Azkaban支持瀏覽器以及ajax方式操作工作流

Oozie支持命令行、HTTP REST、Java API、瀏覽器操作工作流

2 Azkaban介紹

Azkaban是由Linkedin開源的一個批量工作流任務調度器。用於在一個工作流內以一個特定的順序運行一組工作和流程。Azkaban定義了一種KV文件格式來建立任務之間的依賴關系,並提供一個易於使用的web用戶界面維護和跟蹤你的工作流。

它有如下功能特點:

2 Web用戶界面

2 方便上傳工作流

2 方便設置任務之間的關系

2 調度工作流

2 認證/授權(權限的工作)

2 能夠殺死並重新啟動工作流

2 模塊化和可插拔的插件機制

2 項目工作區

2 工作流和任務的日誌記錄和審計

2.1 Azkaban安裝部署

2.1.1 準備工作

Azkaban Web服務器

azkaban-web-server-2.5.0.tar.gz

Azkaban執行服務器

azkaban-executor-server-2.5.0.tar.gz

MySQL

目前azkaban只支持 mysql,需安裝mysql服務器,本文檔中默認已安裝好mysql服務器,並建立了 root用戶,密碼 root.

下載地址:http://azkaban.github.io/downloads.html

2.1.2 安裝

將安裝文件上傳到集群,最好上傳到安裝 hive、sqoop的機器上,方便命令的執行

在當前用戶目錄下新建 azkabantools目錄,用於存放源安裝文件.新建azkaban目錄,用於存放azkaban運行程序

2.1.3 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

2.1.4 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;

2.1.5 創建SSL配置

參考地址: http://docs.codehaus.org/display/JETTY/How+to+configure+SSL

命令: 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/server

2.1.6 配置文件

註:先配置好服務器節點上的時區

1、先生成時區配置文件Asia/Shanghai,用交互式命令 tzselect 即可

2、拷貝該時區文件,覆蓋系統本地時區配置

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

azkaban web服務器配置

進入azkaban web服務器安裝目錄 conf目錄

v 修改azkaban.properties文件

命令vi 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=localhost #數據庫連接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 #緩存目錄

v azkaban 執行服務器executor配置

進入執行服務器安裝目錄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=root #數據庫用戶名

mysql.password=root #數據庫密碼

mysql.numconnections=100 #最大連接數

# 執行服務器配置

executor.maxThreads=50 #最大線程數

executor.port=12321 #端口號(如修改,請與web服務中一致)

executor.flow.threads=30 #線程數

v 用戶配置

進入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>

2.1.7 啟動

web服務器

在azkaban web服務器目錄下執行啟動命令

bin/azkaban-web-start.sh

註:在web服務器根目錄運行

或者啟動到後臺

nohup bin/azkaban-web-start.sh 1>/tmp/azstd.out 2>/tmp/azerr.out &

執行服務器

在執行服務器目錄下執行啟動命令

bin/azkaban-executor-start.sh

註:只能要執行服務器根目錄運行

啟動完成後,在瀏覽器(建議使用谷歌瀏覽器)中輸入https://服務器IP地址:8443 ,即可訪問azkaban服務了.在登錄中輸入剛才新的戶用名及密碼,點擊 login.

3 Azkaban實戰

Azkaba內置的任務類型支持command、java

3.1 Command類型單一job示例

1、創建job描述文件

vi command.job

#command.job

type=command

command=echo ‘hello‘

2、將job資源文件打包成zip文件

zip command.job

3、通過azkaban的web管理平臺創建project並上傳job壓縮包

首先創建project

技術分享圖片

上傳zip包

技術分享圖片

4、啟動執行該job

技術分享圖片

3.2 Command類型多job工作流flow

1、創建有依賴關系的多個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

2、將所有job資源文件打到一個zip包中

技術分享圖片

3、在azkaban的web管理界面創建工程並上傳zip包

4、啟動工作流flow

3.3 HDFS操作任務

1、創建job描述文件

# fs.job

type=command

command=/home/hadoop/apps/hadoop-2.6.1/bin/hadoop fs -mkdir /azaz

2、將job資源文件打包成zip文件

技術分享圖片

3、通過azkaban的web管理平臺創建project並上傳job壓縮包

4、啟動執行該job

3.4 MAPREDUCE任務

Mr任務依然可以使用command的job類型來執行

1、創建job描述文件,及mr程序jar包(示例中直接使用hadoop自帶的examplejar)

# 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

2、將所有job資源文件打到一個zip包中

技術分享圖片

3、在azkaban的web管理界面創建工程並上傳zip包

4、啟動job

3.5 HIVE腳本任務

l 創建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‘

2、將所有job資源文件打到一個zip包中

3、在azkaban的web管理界面創建工程並上傳zip包

4、啟動job

工作流調度系統Azkaban的簡介和使用