1. 程式人生 > 實用技巧 >Azkaban入門實戰(1)--安裝部署

Azkaban入門實戰(1)--安裝部署

本文主要介紹Azkaban的安裝部署,文中文中使用到的軟體版本:Azkaban 3.90.0、MySQL 5.7、Centos 7。

1、Azkaban簡介

Azkaban是由Linkedin公司推出的一個批量工作流任務排程器,主要用於在一個工作流內以一個特定的順序執行一組工作和流程,它的配置是通過簡單的key:value對的方式,通過配置中的dependencies 來設定依賴關係。Azkaban使用job配置檔案建立任務之間的依賴關係,並提供一個易於使用的web使用者介面維護和跟蹤你的工作流。

1.1、Azkaban結構

Azkaban由三個關鍵元件構成:
1.AzkabanWebServer:AzkabanWebServer是整個Azkaban工作流系統的主要管理者,它負責使用者登入認證、project管理、定時執行工作流、跟蹤工作流執行進度等一系列任務。
2.AzkabanExecutorServer:負責具體的工作流的提交、執行,它們通過mysql資料庫來協調任務的執行。
3.關係型資料庫(MySQL):儲存大部分執行流狀態,AzkabanWebServer和AzkabanExecutorServer都需要訪問資料庫

1.2、Azkaban部署模式

在3.0後,Azkaban提供了兩種部署模式:

1.2.1、solo-server模式

DB使用的是一個內嵌的H2,Web Server和Executor Server執行在同一個程序裡。這種模式包含Azkaban的所有特性,但一般用來學習和測試,也可以用於小的應用。

1.2.2、distributed multiple-executor模式

DB使用的是MySQL,MySQL最好使用master-slave架構,Web Server和Executor Server執行在不同機器上,且有多個Executor Server;這為Azkaban提供了很強的擴充套件性。

2、安裝

2.1、編譯

2.1.1、下載原始碼並解壓

下載地址:https://github.com/azkaban/azkaban/releases

tar zxvf azkaban-3.90.0.tar.gz

2.1.2、修改maven地址

修改build.gradle中maven地址為阿里雲倉庫,不然下載jar包會很慢。

buildscript {
  repositories {
    //mavenCentral()
    //maven {
      //url 'https://plugins.gradle.org/m2/'
    //}
    maven {
      url 'https://maven.aliyun.com/repository/gradle-plugin
' } } allprojects { apply plugin: 'jacoco' repositories { //mavenCentral() //mavenLocal() maven { url 'https://maven.aliyun.com/repository/gradle-plugin' } } }

2.1.3、編譯

進入解壓的目錄(/home/hadoop/app/azkaban-3.90.0),執行:

# Build Azkaban
./gradlew build

# Clean the build
./gradlew clean

# Build and install distributions
./gradlew installDist

# Run tests
./gradlew test

# Build without running tests
./gradlew build -x test

在執行./gradlew build時,大概執行到58%時會卡住,Ctrl+c後在重新執行成功了。

在執行這命令時偶爾會出現超時錯誤,導致命令執行失敗(failed);可以重新執行命令。

2.2、部署

2.2.1、solo-server模式

編譯完成後,進入/home/hadoop/app/azkaban-3.90.0/azkaban-solo-server/build/install/azkaban-solo-server目錄

3.2.1.1、修改時區

conf/azkaban.properties:

#default.timezone.id=America/Los_Angeles
default.timezone.id=Asia/Shanghai
2.2.1.2、啟停
bin/start-solo.sh

停止命令:

bin/shutdown-solo.sh
2.2.1.3、控制檯

http://10.49.196.10:8081/ (azkaban/azkaban)

使用者可以在conf/azkaban-users.xml檔案中配置。

2.2.1.4、部署包

在/home/hadoop/app/azkaban-3.90.0/azkaban-solo-server/build/distributions目錄下有部署包可以copy到其他地方部署。

2.2.2、distributed multiple-executor模式

2.2.2.1、規劃

假設Mysql已經安裝完成,這裡只考慮Web Server和Executor Server;原始碼的編譯在10.49.196.10上,目錄為/home/hadoop/app/azkaban-3.90.0。

10.49.196.10 Web Server
10.49.196.11 Executor Server
10.49.196.12 Executor Server

2.2.2.2、初始化資料庫
mysql> CREATE DATABASE azkaban;

然後在azkaban庫中執行/home/hadoop/app/azkaban-3.90.0/azkaban-db/build/install/azkaban-db/create-all-sql-0.1.0-SNAPSHOT.sql指令碼

2.2.2.3、部署Executor Server
2.2.2.3.1、分發部署包

從10.49.196.10上拷貝部署包到10.49.196.11上

cd /home/hadoop/app/azkaban-3.90.0/azkaban-exec-server/build/distributions
scp ./azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz hadoop@10.49.196.11:/home/hadoop/app
2.2.2.3.2、10.49.196.11上部署Executor Server
cd /home/hadoop/app
tar zxvf azkaban-exec-server-0.1.0-SNAPSHOT.tar.gz

修改conf/azkaban.properties檔案:

#default.timezone.id=America/Los_Angeles
default.timezone.id=Asia/Shanghai
azkaban.webserver.url=http://10.49.196.10:8081 mysql.port
=3306 mysql.host=10.49.196.10 mysql.database=azkaban mysql.user=root mysql.password=123 executor.port=9000#設定啟動埠,不然每次會隨機生成一個埠

啟動:

bin/start-exec.sh

啟動完之後,還需要啟用:

curl -G "localhost:9000/executor?action=activate" && echo
2.2.2.3.3、10.49.196.12上部署Executor Server

10.49.196.12上的部署與10.49.196.11類似的操作步驟;或者直接把10.49.196.11上的部署目錄直接拷貝到10.49.196.12上。

2.2.2.3、部署Web Server

可以直接使用10.49.196.10上編譯好的部署目錄/home/hadoop/app/azkaban-3.90.0/azkaban-web-server/build/install/azkaban-web-server

a、修改/etc/hosts檔案,設定Executor Server主機的主機名和ip的對應關係:

10.49.196.11 pxc2
10.49.196.12 pxc3

b、修改conf/azkaban.properties檔案:

#default.timezone.id=America/Los_Angeles
default.timezone.id=Asia/Shanghai

mysql.port=3306
mysql.host=10.49.196.10
mysql.database=azkaban
mysql.user=root
mysql.password=123

c、啟動:

bin/start-web.sh
2.2.2.4、控制檯

http://10.49.196.10:8081/

使用者名稱密碼為:azkaban/azkaban 使用者可用在conf/azkaban-users.xml中配置。

2.2.2.5、啟動順序

一定要先啟動Exector Server,再啟動Web Server;如果有Exector Server需要重啟,Web Server也需要重啟以同步Exector Server資訊。

2.2.2.6、常見異常處理

a、job不執行

Web Server控制提示如下資訊:

2020/10/22 10:24:02.453 +0800  INFO [ExecutorManager] [AzkabanWebServer-QueueProcessor-Thread] [Azkaban] Reached handleNoExecutorSelectedCase stage for exec 124 with error count 0

可能原因:

MinimumFreeMemory過濾器會檢查executor主機空餘記憶體是否會大於6G,如果不足6G,則web-server不會將任務交由該主機執行。

處理方法:

修改conf/azkaban.properties檔案,去除MinimumFreeMemory過濾器

#azkaban.executorselector.filters=StaticRemainingFlowSize,MinimumFreeMemory,CpuStatus
azkaban.executorselector.filters=StaticRemainingFlowSize,CpuStatus

b、Cannot request memory (Xms 0 kb, Xmx 0 kb) from system for job second

Azkaban控制檯Job Logs報如下錯誤:

原因:

azkaban要求執行主機可用記憶體必須大於3G才能滿足執行任務的條件。

處理方法:

Executor Server部署目錄下plugins/jobtypes/commonprivate.properties檔案增加:

memCheck.enabled=false

c、Failed to assign non-existent executor Id: xxx to execution : yyy

Web Server後臺報:

2020/10/22 10:45:47.047 +0800  WARN [ExecutorManager] [AzkabanWebServer-QueueProcessor-Thread] [Azkaban] Executor pxc2:9000 (id: 12), active=true responded with exception for exec: 131
azkaban.executor.ExecutorManagerException: Failed to assign non-existent executor Id: 12 to execution : 131  
        at azkaban.executor.AssignExecutorDao.assignExecutor(AssignExecutorDao.java:43)
        at azkaban.executor.JdbcExecutorLoader.assignExecutor(JdbcExecutorLoader.java:331)
        at azkaban.executor.ExecutorManager.dispatch(ExecutorManager.java:1059)
        at azkaban.executor.ExecutorManager.access$500(ExecutorManager.java:69)
        at azkaban.executor.ExecutorManager$QueueProcessorThread.selectExecutorAndDispatchFlow(ExecutorManager.java:1238)
        at azkaban.executor.ExecutorManager$QueueProcessorThread.processQueuedFlows(ExecutorManager.java:1210)
        at azkaban.executor.ExecutorManager$QueueProcessorThread.run(ExecutorManager.java:1148)

原因:

重啟Executor後,它的id會變化(自增),導致Web Server根據快取的id找不到Executor。

處理方法:

Executor Server重啟後,Web Server也重啟下。