Java 分散式任務排程平臺:PowerJob 快速開始+配置詳解
阿新 • • 發佈:2020-07-15
> 本文適合有 Java 基礎知識的人群
![](https://img2020.cnblogs.com/blog/759200/202007/759200-20200714212306208-772904771.png)
作者:HelloGitHub-**Salieri**
## 引言
HelloGitHub 推出的[《講解開源專案》](https://github.com/HelloGitHub-Team/Article)系列。
> 專案地址:
>
> https://github.com/KFCFans/PowerJob
PowerJob 的設計目標為企業級的分散式任務排程平臺,即成為公司內部的排程中介軟體。整個公司統一部署排程中心 powerjob-server,旗下所有業務線應用只需要依賴 'powerjob-worker' 即可接入獲取任務排程與分散式計算能力。
因此,PowerJob 由排程伺服器(powerjob-server)和執行器(powerjob-worker)兩部分組成,powerjob-server 負責提供 Web 服務和完成任務的排程,powerjob-worker 則負責執行使用者所編寫的任務程式碼,同時提供分散式計算能力。
以下為在本地開發環境快速搭建並試用 PowerJob 的教程。
## 一、STEP1: 初始化專案
1. `git clone https://github.com/KFCFans/PowerJob.git`
2. 匯入 IDE,原始碼結構如下,我們需要啟動排程伺服器(powerjob-server),同時在 samples 工程中編寫自己的處理器程式碼
![](https://img2020.cnblogs.com/blog/759200/202007/759200-20200714212340501-1023750931.png)
## 二、STEP2: 啟動排程伺服器
1. 建立資料庫(不需要建表,只需要建立資料庫)powerjob-daily
2. 修改配置檔案,配置檔案的說明[官方文件](https://www.yuque.com/ohmyscheduler/guidence/bdvp1u#4DTFD)寫的非常詳細,此處不再贅述。由於是在本地 IDE 搭建測試環境,因此我們選擇使用開發環境的配置檔案 `application-daily.properties` 來修改並使用。需要修改的地方為資料庫配置:
- `spring.datasource.core.jdbc-url`
- `spring.datasource.core.username`
- `spring.datasource.core.password`
- 當然,有 mongoDB 的同學也可以修改 `spring.data.mongodb.uri` 以獲取完全版體驗。
3. 完成配置檔案的修改後,可以直接通過啟動類 `OhMyApplication` 啟動排程伺服器,觀察啟動日誌,檢視是否啟動成功~啟動成功後,訪問 http://127.0.0.1:7700/ ,如果能順利出現 Web 介面,則說明排程伺服器啟動成功!
4. 註冊應用:點選主頁**應用註冊**按鈕,填入 `oms-test` 和控制檯密碼(用於進入控制檯),註冊示例應用(當然你也可以註冊其他的 appName,只是別忘記在示例程式中同步修改~)
![](https://img2020.cnblogs.com/blog/759200/202007/759200-20200714212352912-728982191.png)
## 三、STEP3: 編寫示例程式碼
> 進入示例工程(powerjob-worker-samples),修改配置檔案連線 powerjob-server 並編寫自己的處理器程式碼。
1. 修改 powerjob-worker-samples 的啟動配置類 `OhMySchedulerConfig`,**將 `appName` 修改為剛剛在控制檯註冊的名稱**。
2. 編寫自己的處理器:在示例工程中新建一個類,繼承你想要使用的處理器(各個處理器的介紹可見[官方文件](https://www.yuque.com/ohmyscheduler/guidence/hczm7m)),這裡為了簡單演示,選擇使用單機處理器 `BasicProcessor` ,以下程式碼示例演示了線上日誌功能的使用。
```java
@Slf4j
@Component
public class StandaloneProcessorDemo implements BasicProcessor {
@Override
public ProcessResult process(TaskContext context) throws Exception {
OmsLogger omsLogger = context.getOmsLogger();
omsLogger.info("start process,context is {}.", context);
System.out.println("jobParams is " + context.getJobParams());
return new ProcessResult(true, "process successfully~");
}
}
```
3. 啟動示例程式,即直接執行主類 `SampleApplication`,觀察控制檯輸出資訊,判斷是否啟動成功。
## 四、STEP4: 任務的配置與執行
排程伺服器與示例工程都啟動完畢後,再次前往 Web 頁面( http://127.0.0.1:7700/ ),進行任務的配置與執行。
1. 在首頁輸入框輸入配置的應用名稱,成功操作後會正式進入前端管理介面。
![](https://img2020.cnblogs.com/blog/759200/202007/759200-20200714212406672-1031402515.png)
2. 點選任務管理 -> 新建任務(右上角),開始建立任務。
![](https://img2020.cnblogs.com/blog/759200/202007/759200-20200714212417916-722190959.png)
3. 完成任務建立後,即可在控制檯看到剛才建立的任務,如果覺得等待排程太過於漫長,可以直接點選**執行**按鈕,立即執行本任務。
![](https://img2020.cnblogs.com/blog/759200/202007/759200-20200714212425432-985227474.png)
4. 前往**任務示例**邊欄,檢視任務的執行狀態和線上日誌
![](https://img2020.cnblogs.com/blog/759200/202007/759200-20200714212434116-1733488259.png)
### 4.1 基本配置
- 任務名稱:名稱
- 任務描述:描述
- 任務引數:任務處理時能夠獲取到的引數(即各個 Processor的process 方法入參 `TaskContext` 物件的 jobParams 屬性)(進行一次處理器開發就能理解了)
- 定時資訊:該任務的觸發方式,由下拉框和輸入框組成
- API -> 不需要填寫任何引數,表明該任務由 OpenAPI 觸發
- CRON -> 填寫 CRON 表示式([線上生成網站](https://cron.qqe2.com/))
- 固定頻率 -> 填寫整數,單位**毫秒**
- 固定延遲 -> 填寫整數,單位**毫秒**
- 工作流 -> 不需要填寫任何引數,表明該任務由工作流(workflow)觸發
### 4.2 執行配置
由執行型別(單機、廣播和 MapReduce)、處理器型別和處理器引數組成,後兩項相互關聯。
- 內建 Java 處理器 -> 填寫該處理器的**全限定類名**(eg,`com.github.kfcfans.oms.processors.demo.MapReduceProcessorDemo`)
- Java(容器) -> 填寫**容器ID#處理器全限定類名**(eg,`18#com.github.kfcfans.oms.container.DemoProcessor`)
- SHELL -> 填寫需要處理的指令碼(直接複製檔案內容)或指令碼下載連結(http://xxx)
- PYTHON -> 填寫完整的 python 指令碼或下載連結(http://xxx)
### 4.3 執行配置
- 最大例項數:該任務同時執行的數量
- 單機執行緒併發數:該例項執行過程中每個 Worker 使用的執行緒數量(MapReduce 任務生效,其餘無論填什麼,都只會使用必要的執行緒數...)
- 執行時間限制:限定任務的最大執行時間,超時則視為失敗,單位**毫秒**,0 代表不限制超時時間(**不建議不限制超時時間**)。
### 4.4 重試配置
- Instance 重試次數:例項級別,失敗了整個任務例項重試,會更換 TaskTracker(本次任務例項的Master節點),代價較大,大型 Map/MapReduce 慎用。
- Task重試次數:Task 級別,每個子 Task 失敗後單獨重試,會更換 ProcessorTracker(本次任務實際執行的 Worker 節點),代價較小,推薦使用。
- 注:**請注意同時配置任務重試次數和子任務重試次數之後的重試放大**,比如對於單機任務來說,假如任務重試次數和子任務重試次數都配置了 1 且都執行失敗,實際執行次數會變成 4 次!推薦任務例項重試配置為 0,子任務重試次數根據實際情況配置。
### 4.5 機器配置
用來標明允許執行任務的機器狀態,避開那些搖搖欲墜的機器,0 代表無任何限制。
- 最低 CPU 核心數:填寫浮點數,CPU 可用核心數小於該值的 Worker 將不會執行該任務。
- 最低記憶體(GB):填寫浮點數,可用記憶體小於該值的 Worker 將不會執行該任務。
- 最低磁碟(GB):填寫浮點數,可用磁碟空間小於該值的 Worker 將不會執行該任務。
### 4.6 叢集配置
- 執行機器地址:指定叢集中的某幾臺機器執行任務(debug 的好幫手),多值英文逗號分割,如`192.168.1.1:27777,192.168.1.2:27777`
- 最大執行機器數量:限定調動執行的機器數量
### 4.7 報警配置
選擇任務執行失敗後報警通知的物件,需要事先錄入。
基礎的教程到這裡也就結束了~更多功能示例可見[官方文件](https://www.yuque.com/ohmyscheduler/guidence/ysug77),工作流、MapReduce、容器等高階特性等你來探索!
## 五、總結與預告
本章詳細介紹了 PowerJob 的快速入門,根據本文能夠快速搭建起本地開發/測試環境。下一章節,我將會對PowerJob 整體的架構做一個介紹,為後面的技術剖析做準備。
那我們下期再見嘍~
## 作者遊記
![](https://img2020.cnblogs.com/blog/759200/202007/759200-20200714212448729-1796604363.jpg)
“常在河邊走,哪有不溼鞋”,然而,這句話在茶卡鹽湖卻屬於奢望。
稍有不慎,隱祕的鹽窟便對你敞開懷抱,瞬間將你吞噬~
鹽湖如此,人生亦是如此。
難免不幸時,也要對著美好的明天微笑~
> HelloGitHub 交流群現已全面開放(作者在 Java 群),新增微訊號:HelloGitHub 為好友入群,可同前端、Java、Go 等各界大佬談笑風生、切磋技術~
![](https://img2020.cnblogs.com/blog/759200/202007/759200-20200706214622307-1765002