1. 程式人生 > >排程框架Azkaban快速入門

排程框架Azkaban快速入門

作者:林偉兵 ,叩丁狼高階講師。本文為原創文章,轉載請註明出處。  

 

1. Azkaban概述

Azkaban技術產生前景:

​ 在大資料分析場景中,以ETL( Extract抽取 -Transform互動轉換 -Load載入 )為例 ,資料的操作包含了如下流程:RDBMS ==>Sqoop ==>Hadoop ==>Sqoop ==>RDBMS/NoSQL/...,這裡涉及了三個流程:資料抽取 ==> 資料清洗 ==> 資料入庫

​ 這三個步驟出現了明顯的順序問題。假設資料抽取需要3h,資料清洗需要2h,資料入庫需要1h。我們可以使用linux shell提供的crontab 來實現。他的優點是使用簡單,缺點卻有很多:

 1. 流程不便於跟蹤和監控(流程某個環境出錯沒辦法監控)。
    2. 在這個流程中有些模組執行的時間可能出現延遲/提前。比如資料清洗預測需要2h,結果用了3h,此刻資料入庫在前一個任務還沒執行完就已經開始執行了;比如清洗預測需要2h,結果用了1h,導致後面的流程出現無效等待的狀態。

因此,像Azkaban這樣的排程框架在我們資料平臺中就扮演著很重要的角色。

大資料中常見的排程框架

大資料中常見的排程框架,最常見的就是crontab。除此之外還有很多整合框架:

  1. Quartz:Quartz是OpenSymphony[ˈəʊpən ˈsɪmfəni] 開源組織在Job scheduling領域又一個開源專案,它可以與J2EE與J2SE應用程式相結合也可以單獨使用。
  2. Azkaban:Azkaban是由Linkedin公司推出的一個批量工作流任務排程器, 其使用job配置檔案建立任務之間的依賴關係,並提供一個易於使用的web使用者介面維護和跟蹤你的工作流 。
  3. Oozie:Oozie是一個工作流引擎伺服器,用於執行hadoop map/reduce和hive等任務工作流。同時Oozie還是一個java web程式,執行在java servlet容器中,如tomcat中。Oozie以action為基本單位,可以將多個action構成一個DAG圖的模式執行。Oozie工作流通過HPDL(一種通過XML自定義處理的語言)來構造Oozie工作流。
  4. Zeus
    :宙斯是阿里巴巴開源的一款分散式Hadoop作業排程平臺,實現任務的分散式排程,支援多機器的水平擴充套件。

Azkaban概述

​ Azkaban是一個由LinkedIn 建立的用來跑Hadoop 任務的批量的工作流執行器;其解決了job依賴順序的問題,並提供了一個簡單易用的使用者介面檢測我們的工作流。

Azkaban特性如下:

  • 相容所有Hadoop版本

  • 簡單易用的web操作介面和web工作流資源提交機制

  • 在Azkaban中每個專案相互獨立互不影響。
  • 良好的工作流執行封裝(執行任務流無需太複雜的操作 一個按鈕搞定)。
  • 模組化和外掛化:執行的具體任務不會與Azkaban相互耦合,程式碼侵入性低。
  • 認證與授權:良好的許可權管理機制
  • 跟蹤使用者的行為:方便出現問題後知道是哪個使用者的錯誤導致的。
  • 任務成功/失敗後的 郵件通知機制
  • 任務錯誤的重試機制

Azkaban3.x 以後不提供直接的安裝包下載,其安裝包需通過Gradle指令碼來編譯, 並且要求最低的Java版本是8. 如下是Azkaban的學習網站:

  1. Azkaban的官網:https://azkaban.github.io
  2. Azkaban的框架原始碼:https://github.com/azkaban/azkaban
  3. Azkaban文件:https://github.com/azkaban/azkaban.github.io

2. Azkaban架構簡析

Azkaban由三個關鍵元件構成(如下圖):

  • MySQL關係型資料庫:Azkaban使用資料庫儲存大部分狀態,AzkabanWebServer和AzkabanExecutorServer都需要訪問資料庫。
  • AzkabanWebServer:AzkabanWebServer是整個Azkaban工作流系統的主要管理者,它負責project管理、使用者登入認證、定時執行工作流、跟蹤工作流執行進度等一系列任務。
  • AzkabanExecutorServer:早期版本的Azkaban在單個服務中具有AzkabanWebServer和AzkabanExecutorServer功能,目前Azkaban已將AzkabanExecutorServer分離成獨立的伺服器。其好處是某個任務流失敗後,可以更方便的將其重新執行,便於Azkaban升級。

image.png

Azkaban的兩種執行模式

在版本3.0中,Azkaban提供了以下兩種模式:

  • solo server mode:最簡單的模式,資料庫內建的H2資料庫,AzkabanWebServer和AzkabanExecutorServer都在一個程序中執行,任務量不大專案可以採用此模式(特別適合初學者學習使用,功能齊全)。
  • multiple executor mode: 適用於更多的生產環境,其使用MySQL 來進行元資料管理並且支援主從結構。在這種模式下web server和executor server 獨立執行在不同的主機中。這種模式帶來的好處是可以讓Azkaban更加健壯和可擴充套件。

在學習的過程中,我們可以使用來solo server 這種模式來執行Azkaban例項。

3. Azkaban的下載和編譯

  1. 下載之前 請確保本機的 Java 版本為 1.8 。

  2. 下載Azkaban原始碼:

    image.png

  1. 解壓azkaban壓縮包並進入該目錄:

    image.png

azkaban-common: 基本的依賴包

azkaban-db: 框架核心元件-資料庫工具

azkaban-exec-server & azkaban-web-server : 框架核心元件

azkaban-solo-server: 整合執行模式工具包

azkaban-spi : azkaban儲存介面以及exception類

azkaban-hadoop-security-plugin: hadoop 有關kerberos外掛

  1. 在編譯原始碼之前,先要下載gradle的依賴包,至於要什麼版本,檢視如下:

    image.png

如下地址是Gradle的官方下載地址:https://services.gradle.org/distributions

下載好對應的版本後,將壓縮包存放到如下位置:

image.png

修改配置檔案:

image.png

  1. 返回安裝包主目錄執行編譯程式(注意官方給出的編譯版本不帶測試命令-x test,示例如下)

    # Build without running tests
    >$ ./gradlew build installDist -x test
    
  2. 執行上面的命令,出現了git有關的異常,這裡主要是系統沒有安裝git命令,使用yum install -y git,後重新執行步驟4,接下來等待漫長的下載(因為預設使用的是國外的gradle映象進行資源下載)。

    image.png

  1. 為了減少編譯時下載佔用時間,一般會為gradle遠端資源提供映象地址方便下載:

    #在 ${AZKABAN_HOME}/build.gradle檔案中配置,然後重新執行步驟4:
    mavenLocal()
    maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
    maven{ url 'http://maven.oschina.net/content/groups/public/'}
    

    image.png

  1. 編譯成功後,可以找到整個架構的每個部分都會多出一個build資料夾,這才是我們要安裝的檔案:

    [root@azkabanvm azkaban]# ls azkaban-solo-server/build
    classes  distributions  install  libs  resources  tmp
    [root@azkabanvm azkaban]# ls azkaban-exec-server/build
    classes  distributions  install  libs  resources  tmp
    [root@azkabanvm azkaban]# ls azkaban-web-server/build
    classes  distributions  dust  install  jsToPackage  less  libs  nodejs  resources  tmp
    [root@azkabanvm azkaban]# ls azkaban-db/build
    classes  distributions  install  libs  sql  tmp