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也重啟下。