乾貨丨DolphinDB啓動腳本教程

DolphinDB database從1.0版本開始,提供了啓動腳本功能。用戶能夠經過配置參數startup來指定用戶級的啓動腳本,默認值是startup.dos。經過設定啓動腳本,DolphinDB啓動的時候會自動完成每次啓動都須要執行的工做,譬如初始化流數據,定義共享變量,加載插件腳本等。mysql

1. DolphinDB啓動順序sql

DolphinDB節點的啓動是一個複雜的過程。與啓動腳本相關的腳本和任務至少包括:系統級的初始化腳本(經過init參數指定,默認值dolphindb.dos),函數視圖(function view)以及定時任務(scheduled job)。啓動腳本以及相關組件資源的初始化順序以下圖所示。網絡

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

啓動腳本以及相關組件資源的初始化順序app

系統級初始化腳本是必需的,默認是版本發佈目錄中的dolphindb.dos,其中定義了一些系統級的函數。從啓動順序圖中咱們能夠看到,dolphindb.dos腳本在執行時腳本解釋器、工做線程等已完成初始化,但系統的網絡和分佈式文件系統還沒有啓動、函數視圖還沒有加載。而啓動腳本執行前,系統的網絡和分佈式文件系統已啓動,函數視圖已加載。所以在啓動腳本中咱們幾乎能夠作任何事情。分佈式

從圖中也能夠看到用戶事先安排的定時任務在啓動腳本執行後加載。所以scheduled jobs中若用到了插件函數、共享表等,須要在啓動腳本中預先加載或定義,不然反序列化scheduled job會失敗。須要注意的是,函數視圖的加載在啓動腳本執行以前。若是函數視圖中用了插件,加載插件必須在dolphindb.dos中完成。與定時任務存儲在數據節點不一樣,函數視圖存儲在控制節點。因此咱們不建議在函數視圖中使用插件,不然在集羣中每一個節點的dolphindb.dos都須要加載插件。ide

2. 啓動腳本的執行函數

啓動腳本的配置項名爲startup,參數值是自定義的啓動腳本文件名,可配置絕對路徑或相對路徑,參數的默認值是startup.dos。若配置了相對路徑或者沒有指定目錄,系統會在節點的home目錄、工做目錄和可執行文件所在目錄依次搜索。該參數單機模式時在dolphindb.cfg中配置,集羣模式時在節點配置文件cluster.cfg中配置。插件

配置舉例以下:線程

startup=/home/streamtest/init/server/startup.dos

啓動腳本以本地管理員的身份運行,但並無登陸集羣,因此訪問集羣的分佈式功能時以guest身份運行。所以,若要遠程執行控制節點的某些功能,訪問集羣中的某個分佈式表,須要先以管理員(admin)或其餘受權用戶身份登陸。具體能夠經過login函數來完成。調試

腳本執行過程當中若遇到錯誤,執行會中斷,但系統不會退出,而是繼續運行。運行過程當中的全部輸出,都會記錄在本地節點的日誌文件中。

3.啓動腳本的常見應用場景

系統重啓後可能須要作的初始化工做主要有:定義並共享內存表,定義、加載並共享流數據表、訂閱流數據、加載插件等。

例子1:定義內存表並共享

下面代碼中定義了一張內存表t,並分享爲sharedT。在其餘會話中就能夠對錶sharedT進行增長、更新、刪除和查詢記錄。

t=table(1:0,`date`sym`val,[DATE,SYMBOL,INT])
share(t, `sharedT);

例子2:定義、加載流數據表並共享、訂閱

流數據表的定義不可在DolphinDB中持久化保存,因此流數據表的初始化工做可在啓動腳本中執行。下面代碼加載並共享了流數據表st1:

login("admin","123456")
t1=streamTable(1:0,`date`sym`val,[DATE,SYMBOL,INT])
enableTableShareAndPersistence(table=t1,tableName=`st1,cacheSize=1000)

流數據表的訂閱也可在啓動腳本中完成。下面的代碼訂閱了上述流數據表st1,並把訂閱的數據保存到分佈式庫表:

tb=loadTable("dfs://db1","tb")
subscribeTable(,"st1","subst",-1,append!{tb},true)

例子3:加載插件

若scheduled jobs中用到了插件函數,必須在啓動腳本中加載插件,不然會因反序列化失敗致使系統退出。下列代碼在scheduled jobs中用到了odbc插件:

use odbc
def jobDemo(){
	conn = odbc::connect("dsn=mysql_factorDBURL");
	//...
}
scheduleJob("job demo","example of init",jobDemo,15:48m, 2019.01.01, 2020.12.31, 'D')

但odbc插件在系統啓動時沒有加載,因此讀取scheduled job的時候,因沒法識別這個函數,輸出下列日誌後退出系統。

<ERROR>:Failed to unmarshall the job [job demo]. Failed to deserialize assign statement.. Invalid message format

在啓動腳本中加入下列代碼加載odbc插件後,系統即啓動成功。

loadPlugin("plugins/odbc/odbc.cfg")

4. 啓動腳本的編寫

編寫DolphinDB啓動腳本時,能夠使用module來聲明和使用可重用模塊,能夠自定義函數,能夠使用分佈式的功能。幾乎沒有限制。

若須要調試啓動腳本,能夠在腳本中用print與writeLog等函數打印日誌。系統會把啓動腳本運行狀況輸出到節點日誌,譬如一開始系統會輸出下列日誌表示啓動腳本開始執行:

 <INFO> :Executing the startup script:

編寫啓動腳本時,爲了防止出現異常而中止執行後續的腳本,可以使用try-catch語句俘獲異常。

5. 啓動腳本不適用的場景

啓動腳本幾乎能夠作任何事情,可是少數功能和任務仍然不適合在啓動腳本中完成。

  • 定時任務在啓動腳本以後運行,因此不能在啓動腳本中使用跟定時任務相關的任何功能,包括函數scheduleJob, getScheduledJobs和deleteScheduledJob。
  • 若須要定義系統級的函數,全部用戶都能看到,並且不能被覆蓋,請在初始化腳本dolphindb.dos中定義。
  • 若任務須要依賴其餘節點,不適合在啓動腳本中完成,極有可能由於其餘節點還沒有啓動而致使不能運行任務。
相關文章
相關標籤/搜索