做業(Job)是DolphinDB中最基本的執行單位,能夠簡單理解爲一段DolphinDB腳本代碼在DolphinDB系統中的一次執行。Job根據阻塞與否可分紅同步做業和異步做業。html
同步做業web
同步做業也稱爲交互式做業(Interactive Job),它的主要來源有:編程
因爲這種類型的做業對實時性要求較高,DolphinDB在執行過程當中會自動給予較高的優先級,使其更快地獲得計算資源。網絡
異步做業架構
異步做業是在DolphinDB後臺執行的做業,包括:app
這類任務通常對結果的實時反饋要求較低,且須要長期執行,DolphinDB通常會給予較低的優先級。異步
子任務編程語言
在DolphinDB中,若數據表數據量過大,通常都須要進行分區處理。若是一個Job A裏含有分區表的查詢計算任務(如SQL查詢),將會分解成多個子任務並送到不一樣的節點上並行執行,等待子任務執行完畢以後,再合併結果,繼續Job A的執行。相似的,DolphinDB的分佈式計算也會產生子任務。所以,Job也能夠理解成一系列的子任務。分佈式
Worker與Executoride
DolphinDB是一個P2P架構的系統,即每個Data Node的角色都是相同的,它們均可以執行來自用戶提交的Job,而由於一個Job可能產生子任務,每一個Data Node須要有負責Job內部執行的調度者,咱們稱它爲Worker,它負責處理用戶提交的Job,簡單計算任務的執行,並執行Job的任務分解,任務分發,並聚集最終的執行結果。Job中分解出來的子任務將會被分發到集羣中的Data Node上(也有多是本地Data Node),並由Data Node上的Worker或Executor線程負責執行。
具體Worker與executor在執行job的時候主要有如下幾種狀況:
爲了最大化性能,DolphinDB會將子任務發送到數據所在的Data Node上執行,以減小網絡傳輸開銷。好比:
Job調度
Job優先級
在DolphinDB中,Job是按照優先級進行調度的,優先級的取值範圍爲0-9,取值越高優先級則越高。對於優先級高的Job,系統會更及時地給與計算資源。每一個Job通常默認會有一個default priority,取值爲4,而後根據Job的類型又會有所調整。
Job調度策略
基於Job的優先級,DolphinDB設計了多級反饋隊列來調度Job的執行。具體來講,系統維護了10個隊列,分別對應10個優先級,系統老是分配線程資源給高優先級的Job,對於處於相同優先級的Job,系統會以round robin的方式分配線程資源給Job;當一個優先級隊列爲空的時候,纔會處理低優先級的隊列中的Job。
Job並行度
因爲一個Job可能會分紅多個並行子任務,DolphinDB的Job還擁有一個並行度parallelism,表示在一個Data Node上,將會最多同時用多少個線程來執行Job產生的並行任務,默認取值爲2,能夠認爲是一種時間片單位。舉個例子,若一個Job的並行度爲2,Job產生了100個並行子任務,那麼Job被調度的時候系統只會分配2個線程用於子任務的計算,所以須要50輪調度才能完成整個Job的執行。
Job優先級的動態變化
爲了防止處於低優先級的Job被長時間飢餓,DolphinDB會適當下降Job的優先級。具體的作法是,當一個job的時間片被執行完畢後,若是存在比其低優先級的Job,那麼將會自動下降一級優先級。當優先級到達最低點後,又回到初始的優先級。所以低優先級的任務早晚會被調度到,解決了飢餓問題。
設置Job的優先級
DolphinDB的Job的優先級能夠經過如下方式來設置:
計算容錯
DolphinDB database 的分佈式計算含有必定的容錯性,主要得益於分區副本冗餘存儲。當一個子任務被髮送到一個分區副本節點上以後,若節點出現故障或者分區副本發生了數據校驗錯誤(副本損壞),Job Scheduler(即某個Data Node的一個worke線程)將會發現這個故障,而且選擇該分區的另外一個副本節點,從新執行子任務。用戶能夠經過設置dfsReplicationFactor參數來調整這種冗餘度。
計算與存儲耦合以及做業之間的數據共享
DolphinDB的計算是儘可能靠近存儲的。DolphinDB之因此不採用計算存儲分離,主要有如下幾個緣由:
綜上這些緣由,DolphinDB採起了計算與存儲耦合的架構。具體來講: