Azkaban 一款輕量級調度工具

分享 ? 楓艾 ? 于 2020-06-19 12:37:00 ? 最后回復由 青牛 2020-06-19 15:14:56 ? 739 閱讀

Azkaban

調度工具是實際工作中非常重要的部分, 在大公司往往獨自開發獨有的調度系統;
平常工作可以使用開源的組件, 其中Azkaban就是這樣一款輕量級的調度系統

1. 運用場景

大數據場景中調度的作用:以ETL為例
大數據場景中,較為常見的一個ETL流程:
RDBMS ===Sqoop===> Hadoop ==Sqoop==> RDBMS/NoSQL/…

完成上述場景需要經歷3個過程:

數據抽取 01:00 3h ==> 凌晨1點開始數據抽取,需要3個小時
數據處理 04:00 4h ==> 凌晨4點開始數據處理,需要3個小時
數據入庫 08:00
一個完整的ETL過程,通常情況下是有多個作業一起協作來完成的,每個作業之間都是有相互間的依賴關系的
那么如何將這些依賴關系設置好呢?這就需要使用調度框架來執行。
假設現在不存在Azkakan/Oozie這樣的調度框架,如何實現???
通常情況下會使用:crontab + shell

優點

簡單易用;把該寫的東西寫到shell腳本里,定時開始執行就行了;
1點跑數據抽取作業;4點跑數據處理作業;8點跑數據入庫的作業

缺點

1.如果我們任務多的話,crontab里面的配置會多到瘋掉
2.不便維護
3.作業的監控不好做
4.無法通過WebUI的方式來進行配置,所有的東西都得通過shell的方式來進行配置
5.HA如何進行保證
 在一臺機器上配了crontab + shell,如果哪一天機器掛了,這種方式是無法保證HA的
6.存在DAG/Dependency這種關系
 如果依賴關系很多的話,數據入庫這步肯定是需要等到數據處理完成之后才能入庫;
 同理,數據處理也是需要等數據抽取完成之后才可以進行的;舉個例子:
 場景一:
   假設我們的數據處理作業是在凌晨4點開始跑的
   恰巧那天碰到我們生產環境上集群的負載比較高,壓力比較大
   3個小時數據沒有抽取完,這就意味著4點開始跑數據處理的作業等于是白跑了的,跑出來的結果根本是不對的
   面對這種場景使用crontab + shell是很難解決的,除非進行重跑
   但是一涉及到重跑,對于代碼各方面就要進行大量的調整
 場景二:
   凌晨1點開始數據抽取,那天恰巧壓力不大,2個小時抽取完了
   還要等1個小時到凌晨四點再來數據處理
   早跑完,造成資源浪費

從上述的問題中引出:
調度框架在我們數據平臺中的重要性

2. 大數據中常見的調度框架

Linux中的crontab
Quartz(Java中的)
開源的框架:
Azkaban/Oozie(結合HUE進行使用)/Zeus(阿里的,停止維護很久了,不建議使用)
大數據調度框架對比的網站:http://ww去w.thebigdata.cn/Hadoop/15755.htm
內部研發的調度框架(上規模的公司中,調度框架都是自己研發的)

3. Azkaban概述

LinkedIn開源的
官網:https://azkaban.github.io/
官網的介紹:
Azkaban is a batch workflow job scheduler created at LinkedIn to run Hadoop jobs.
Azkaban resolves the ordering through job dependencies and provides an easy to use web user interface to maintain and track your workflows.
重點的一句話:
Azkaban resolves the ordering through job dependencies
Azkaban解決了job依賴關系順序的問題

特性

1.? ??Compatible with any version of Hadoop
能夠和任意版本的Hadoop做兼容(在編譯的時候,只需要指定Hadoop的版本就可以)

2.? ??Easy to use web UI
非常易用的web ui

3.? ??Simple web and http workflow uploads
非常簡單的web和http workflow的上傳
只需要預先將workflow定義好以后,就可以通過瀏覽器把我們需要的job的配置文件傳到Azkaban的web server上面去就ok了
Azkaban中的配置都是使用key-value的形式的

4.? ??Project workspaces
工作空間的管理
不同的項目可以歸屬于不同的空間,而且不同的空間又可以設置不同的權限
多個項目之間是不會產生任何的影響與干擾

5.? ??Scheduling of workflows
調度workflows(可以手工運行,也可以讓它定時去處理)

6.? ??Modular and pluginable
模塊化和可插拔
舉例:
 在實際生產上,spark的作業有很多,有ETL的作業、有流處理的作業
 它們都是以插件的方式進行定義的
 這樣做的好處是:可以很好的與Azkaban做整合

7.? ??Authentication and Authorization
認證和授權

8.? ??Tracking of user actions
能夠跟蹤用戶的行為(比如:誰在什么時候提交了什么作業,這個作業什么時候開始的,作業運行完的時間是什么時候,
作業的結果又是什么,作業的運行是成功還是失敗)

9.? ??Email alerts on failure and successes
支持Email的告警(你的作業成功還是失敗)
官方目前支持Email(message告警可以對接進來)

10.? ??SLA alerting and auto killing
SLA的告警
假設凌晨1點開始數據抽取,計劃是3小時抽取完,如果抽取耗時3小時1分鐘,那么你的SLA就已經超了
這個地方也是需要告警的

11.? ??Retrying of failed jobs
對于失敗作業的重試機制
注意:少了HA

4. Azkaban架構

文檔地址:http://azkaban.github.io/azkaban/docs/latest/
有3個重要的組件構成:
1.? ??Relational Database (MySQL)
關系型數據庫,用于存儲元數據(可以配成MySQL,默認是h2)
2.? ??AzkabanWebServer
既然提供了web ui,那么必然有WebServer
3.? ??AzkabanExecutorServer
如何解決該架構中的HA問題?如何入手?
這3個組件都要做HA(AzkabanWebServer這個的HA,其實不是那么的重要)
如果AzkabanWebServer掛掉之后,實質上是不影響我們的使用的,只是我們不能通過web界面去查看或者是監控而已
3.X的版本中AzkabanExecutorServer的HA已經是支持了

Relational Database (MySQL)
Azkaban使用MySQL存儲state的內容;
AzkabanWebServer和AzkabanExecutorServer 都是能夠訪問MySQL的

How does AzkabanWebServer use the DB?
web server使用DB的原因如下:
1.? ??Project Management
項目,項目的權限以及上傳的文件
2.? ??Executing Flow State
跟蹤執行流,執行程序運行它們
3.? ??Previous Flow/Jobs
搜索之前的作業和流程執行,以及訪問他們的日志文件
4.? ??Scheduler
保持預定的工作狀態
5.? ??SLA
保持所有sla規則

How does the AzkabanExecutorServer use the DB?
executor server使用DB的原因如下:
1.? ??Access the project
從數據庫中檢索項目文件
2.? ??Executing Flows/Jobs
檢索和更新 流和正在執行的數據
3.? ??Logs
將輸出日志存儲到作業中并流入到db中
4.? ??Interflow dependency
如果流在不同的執行器上運行,則它將從DB中獲取狀態

AzkabanWebServer
AzkabanWebServer是所有Azkaban的主要管理者。
它處理項目管理、身份驗證、調度器和執行監視。它還作為web用戶界面。

AzkabanExecutorServer
以前版本的Azkaban在同一個服務器上擁有AzkabanWebServer和AzkabanExecutorServer功能。
此后,Executor有了自己的服務器(言下之意即AzkabanWebServer和AzkabanExecutorServer不在同一server上了,分開了)

Azkaban的運行模式

在3.x版本里,提供了3種運行模式
1.? ??the stand alone “solo-server” mode standalone模式
2.? ??the heavier weight two server mode 兩個server的模式
3.? ??distributed multiple-executor mode 分布式(多個executor的模式)
solo server mode
采用的DB是H2,而web server和executor server都在同一個進程中運行。
應用于小規模的用例。
two server mode
應用于生產環境,采用的DB是MySQL,master-slave模式。
web server和executor server在不同的進程中運行,因此升級和維護不會影響用戶。
multiple executor mode
應用于生產環境(分布式),采用的DB是MySQL,master-slave模式。
web server和executor server在不同的主機上運行,因此升級和維護不應該影響用戶。
該模式為Azkaban帶來了健壯和可伸縮的性能。

5. Azkaban “solo-server” mode部署 & 簡單使用

官網:http://azkaban.github.io/azkaban/docs/latest/#solo-setup
這種模式的三大優點:
Easy to install
Easy to start up
Full featured

下載Azkaban的源碼

直接clone下來

git clone https://github.com/azkaban/azkaban.git

下載release版本(建議使用這種方式下載源碼,而不是使用1這種方式)

wget https://github.com/azkaban/azkaban/archive/3.38.0.tar.gz

解壓

cd /opt/software
tar -zxvf azkaban-3.38.0.tar.gz -C /opt/source/
cd azkaban-3.38.0/

目錄結構:
azkaban-common         常用的工具類(基礎架構)
azkaban-db            與數據庫相關的
azkaban-exec-server        執行的server
azkaban-hadoop-security-plugin   hadoop安全的插件(不用去管它)
azkaban-solo-server        我們所要部署的模式
azkaban-spi            存儲一些接口相關的東西(異常處理這些)
azkaban-web-server        web-server(ui上的東西)

編譯

3.x是需要編譯,官方沒有提供直接的安裝包

cd $AZKABAN_SOURCE_HOME
./gradlew 去掉build installDist

默認會去網絡上下載gradle-4.1-all.zip(這個包有差不多100MB),我不建議這么干,因為下載速度非常慢
建議大家通過修改配置的方式完成gradle-4.1-all.zip的本地化
做法:
先下載gradle-4.1-all.zip到/opt/software下

wget https://services.gradle.org/distributions/gradle-4.1-all.zip

修改對應配置文件

cp /opt/software/gradle-3.5-all.zip /opt/source/azkaban-3.38.0/gradle/wrapper
cd /opt/source/azkaban-3.38.0/gradle/wrapper
vi gradle-wrapper.properties
distributionUrl=gradle-3.5-all.zip
#distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-all.zip

開始編譯:

./gradlew 去掉build installDist -x test

編譯成功見圖:
file

編譯中的坑

加上 -test 跳過測試,不然會發生編譯報錯:
錯誤見圖:
file

此處有坑,大坑,好大的坑: jdk7/git/nodejs/npm/…
強依賴于jdk1.8
安裝npm(不安裝會報錯):

curl --silent --location https://rpm.nodesource.com/setup_5.x | bash -
yum install -y nodejs

部署

  1. 啟動
    (在啟動的時候,有個小坑,值得注意)
    cd /opt/source/azkaban-3.38.0/azkaban-solo-server/build/distributions
    tar -zxvf azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz -C /opt/app/
    cd /opt/app/azkaban-solo-server-0.1.0-SNAPSHOT/bin
    ./azkaban-solo-start.sh

    報錯:

    Exception in thread "main" java.io.IOException: Cannot find 'database.properties' file in /opt/app/azkaban-solo-server-0.1.0-SNAPSHOT/bin/sql/database.properties
    at azkaban.database.AzkabanDatabaseSetup.loadDBProps(AzkabanDatabaseSetup.java:174)
    at azkaban.database.AzkabanDatabaseSetup.loadTableInfo(AzkabanDatabaseSetup.java:98)
    at azkaban.database.AzkabanDatabaseUpdater.runDatabaseUpdater(AzkabanDatabaseUpdater.java:82)
    at azkaban.soloserver.AzkabanSingleServer.main(AzkabanSingleServer.java:71)

    解決方案:

    cd ../
    bin/azkaban-solo-start.sh
    成功啟動
    打印出日志:
    2018/02/28 09:08:46.308 +0800 INFO [AzkabanWebServer] [Azkaban] Azkaban Web Server started...
    2018/02/28 09:08:46.772 +0800 INFO [AzkabanWebServer] [Azkaban] Azkaban Exec Server started...
  2. 檢查是否成功啟動
    http://192.168.26.131:8081/
    控制臺輸入jps,顯示進程:AzkabanSingleServer
    注:在solo-server模式下,會將web-server和exec-server放在一起,名字叫singleserver

注意事項:

查看 web 和 exec 日志;

整體的流程是
exec啟動后, 去指定的mysql進行注冊
azkaban庫里面
executor表,
當確定 exec 啟動之后, 并在表里注冊的時候,active為0, 需要將其改變為1;
然后 啟動 web, 因為沒有 exec web起不起來
隨時關注 web端的日志;?

基本都可以調控ok;

版權聲明:原創作品,允許轉載,轉載時務必以超鏈接的形式表明出處和作者信息。否則將追究法律責任。來自海牛部落-楓艾,http://hainiubl.com/topics/75143
本帖已被設為精華帖!
本帖由 青牛 于 5月前 加精
點贊
成為第一個點贊的人吧 :bowtie:
回復數量: 3
  • 青牛 國內首批大數據從業者,就職于金山,擔任大數據團隊核心研發工程師
    ? 2020-06-19 12:41:59

    打賞碼可以上傳一下

  • 楓艾 開開心心每一天~~~!!!
    ? 2020-06-19 13:26:57

    屏蔽字符, 用 "去掉" 來進行過度

  • 青牛 國內首批大數據從業者,就職于金山,擔任大數據團隊核心研發工程師
    ? 2020-06-19 15:14:56

    @楓艾 文章不錯,打賞10元。對你放開權限了,以后不用“去掉“了。

暫無評論~~
  • 請注意單詞拼寫,以及中英文排版,參考此頁
  • 支持 Markdown 格式, **粗體**、~~刪除線~~、`單行代碼`, 更多語法請見這里 Markdown 語法
  • 支持表情,可用Emoji的自動補全, 在輸入的時候只需要 ":" 就可以自動提示了 :metal: :point_right: 表情列表 :star: :sparkles:
  • 上傳圖片, 支持拖拽和剪切板黏貼上傳, 格式限制 - jpg, png, gif,教程
  • 發布框支持本地存儲功能,會在內容變更時保存,「提交」按鈕點擊時清空
Ctrl+Enter
上海麻将垃圾胡技巧 6737443914153342926695149618220034395501312774654807924246636763886753425252942966107346595141114 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();