任環(huán)宇,王 楓,范帝鑫
(1.中國(guó)科學(xué)院合肥物質(zhì)科學(xué)研究院,合肥 230031;2.中國(guó)科學(xué)技術(shù)大學(xué) 研究生院科學(xué)島分院,合肥 230026)
EAST[1]是我國(guó)設(shè)計(jì)建造的國(guó)際上第一個(gè)全超導(dǎo)托卡馬克實(shí)驗(yàn)裝置。隨著EAST 實(shí)驗(yàn)的進(jìn)一步展開,服務(wù)于EAST 的數(shù)據(jù)倉庫存儲(chǔ)的數(shù)據(jù)量越來越大,數(shù)據(jù)格式繁雜。 數(shù)據(jù)庫源眾多,數(shù)據(jù)倉庫中的相機(jī)數(shù)據(jù)、實(shí)驗(yàn)數(shù)據(jù)、工程數(shù)據(jù)所對(duì)應(yīng)的存儲(chǔ)數(shù)據(jù)庫也都不同,包括Mdsplus[2]、hdf5、視頻文件、MySQL 等多種存儲(chǔ)形式, 并且存儲(chǔ)量已經(jīng)達(dá)到100 TB 級(jí)別,數(shù)據(jù)倉庫存儲(chǔ)著豐富海量的數(shù)據(jù)。 EAST 實(shí)驗(yàn)裝置每個(gè)系統(tǒng)采用獨(dú)立的存儲(chǔ)解決方案。 各個(gè)子系統(tǒng)的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)松散,缺少統(tǒng)一的資源目錄。 這為裝置整體的數(shù)據(jù)管理、數(shù)據(jù)運(yùn)維、數(shù)據(jù)服務(wù)造成了很大的困難, 用戶對(duì)數(shù)據(jù)倉庫的資源概覽也異常困難,極大加劇了用戶使用相關(guān)數(shù)據(jù)的學(xué)習(xí)成本。
元數(shù)據(jù)是“描述數(shù)據(jù)”的數(shù)據(jù)[3]。 在核聚變工程領(lǐng)域,存在很多極有價(jià)值的元數(shù)據(jù)信息,例如信號(hào)元數(shù)據(jù)、存儲(chǔ)元數(shù)據(jù)、放電實(shí)驗(yàn)摘要等。 將聚變實(shí)驗(yàn)裝置的各類元數(shù)據(jù)有序的收集,建立統(tǒng)一的數(shù)據(jù)庫能夠形成整個(gè)聚變系統(tǒng)信息數(shù)據(jù)資源的準(zhǔn)確視圖,通過元數(shù)據(jù)的統(tǒng)一視圖,縮短聚變相關(guān)科學(xué)實(shí)驗(yàn)數(shù)據(jù)清理周期、提高科學(xué)數(shù)據(jù)質(zhì)量以便能系統(tǒng)性地管理科學(xué)數(shù)據(jù)中心項(xiàng)目中來自各子系統(tǒng)的海量數(shù)據(jù)的訪問請(qǐng)求。 梳理各個(gè)子系統(tǒng)元數(shù)據(jù)之間的關(guān)系,建立信息數(shù)據(jù)標(biāo)準(zhǔn)完善對(duì)這些數(shù)據(jù)的解釋、 定義,形成EAST 實(shí)驗(yàn)裝置內(nèi)部范圍內(nèi)一致、 統(tǒng)一的數(shù)據(jù)定義,并可以對(duì)這些實(shí)驗(yàn)數(shù)據(jù)來源、運(yùn)作情況、變遷等進(jìn)行跟蹤分析提供重要的基礎(chǔ)架構(gòu)支撐。 目前該系統(tǒng)于2021年12月開發(fā)完成并已經(jīng)在等離子體物理研究所托卡馬克裝置EAST 上驗(yàn)證并部署應(yīng)用,并計(jì)劃應(yīng)用于下一代中國(guó)工程實(shí)驗(yàn)堆(CFERT)。
國(guó)內(nèi)已有相關(guān)研究包括EAST 實(shí)驗(yàn)數(shù)據(jù)檢索系統(tǒng)[4]和統(tǒng)一數(shù)據(jù)訪問接口方法的研究[5]。 前者的系統(tǒng)基于MySQL 的數(shù)據(jù)模型,對(duì)信號(hào)元數(shù)據(jù)進(jìn)行建模和管理,后者系統(tǒng)聚焦于屏蔽底層數(shù)據(jù)格式,建立多源異構(gòu)場(chǎng)景下的統(tǒng)一數(shù)據(jù)訪問。
目前EAST 實(shí)驗(yàn)裝置都是采取獨(dú)立數(shù)據(jù)庫直接訪問數(shù)據(jù)的形式進(jìn)行數(shù)據(jù)的獲取,在多源異構(gòu)聚變實(shí)驗(yàn)數(shù)據(jù)的環(huán)境下,建立面向元數(shù)據(jù)的統(tǒng)一的資源目錄的設(shè)計(jì)和管理規(guī)范,對(duì)聚變實(shí)驗(yàn)等大科學(xué)實(shí)驗(yàn)裝置的數(shù)據(jù)運(yùn)維、數(shù)據(jù)服務(wù)有很大的工程意義。
基于EAST 實(shí)驗(yàn)裝置的多源異構(gòu)的場(chǎng)景下,需要數(shù)據(jù)庫服務(wù)開發(fā)者構(gòu)建統(tǒng)一的資源管理目錄:
(一)配合統(tǒng)一數(shù)據(jù)訪問接口UDA,建立起一整套的統(tǒng)一數(shù)據(jù)訪問的服務(wù)體系。 通過資源目錄查詢數(shù)據(jù)的狀態(tài)、獲取數(shù)據(jù)的路徑,然后通過UDA 去獲取具體的實(shí)驗(yàn)數(shù)據(jù)。
(二)優(yōu)化用戶訪問過程。 通過數(shù)據(jù)資源目錄,用戶能快速查看目標(biāo)數(shù)據(jù)的狀態(tài)。
系統(tǒng)需要提供合適的元數(shù)據(jù)存儲(chǔ)解決方案,以Mdsplus 數(shù)據(jù)源為例,當(dāng)前實(shí)驗(yàn)已經(jīng)進(jìn)行到100000+炮實(shí)驗(yàn),系統(tǒng)需要針對(duì)其龐大的元數(shù)據(jù)提供快速的、毫秒級(jí)的元數(shù)據(jù)查詢檢索功能。
在數(shù)據(jù)庫選型上,系統(tǒng)基于元數(shù)據(jù)的結(jié)構(gòu)、典型的業(yè)務(wù)訴求,需要綜合考慮以下幾個(gè)方面。
EAST 實(shí)驗(yàn)裝置本身的實(shí)驗(yàn)數(shù)據(jù)按照樹形結(jié)構(gòu)來存儲(chǔ),因此在數(shù)據(jù)庫的選型中,需要圍繞這種特殊的結(jié)構(gòu)進(jìn)行考察。 在多源異構(gòu)場(chǎng)景下,系統(tǒng)需要有很強(qiáng)的可擴(kuò)展性,豐富的API 支持,只讀性。元數(shù)據(jù)一旦存入數(shù)據(jù)庫中,基本用于查詢,很少被更改。
面向文檔數(shù)據(jù)庫會(huì)將數(shù)據(jù)以文檔的形式儲(chǔ)存[6]。 每個(gè)文檔都是自包含的數(shù)據(jù)單元,是一系列數(shù)據(jù)項(xiàng)的集合,以MongoDB 為代表。 基于它的弱模式結(jié)構(gòu), 不改變模式下就可以儲(chǔ)存不同的度量方法及添加新的度量,這帶來了極高的擴(kuò)展性。 以MongoDB 為代表面向文檔的NoSQL 數(shù)據(jù)庫適用存儲(chǔ),為多語言提供了豐富的API。 MongoShell 也支持豐富的增刪改查操作,其最大的特點(diǎn)是基于document(xml、json、bson 文件的封裝)的存儲(chǔ)格式,存儲(chǔ)字典或者嵌套字典。 MongoDB 在存儲(chǔ)、接口、數(shù)據(jù)格式、可擴(kuò)展性這些元數(shù)據(jù)庫所關(guān)注的方面有非常好的權(quán)衡。
綜上所述,針對(duì)EAST 這類科學(xué)裝置的數(shù)據(jù)資源目錄管理,面向文檔類型的NoSQL 在存儲(chǔ)、接口、數(shù)據(jù)分析、擴(kuò)展性、性能等方面有很好的平衡和適配。因此本系統(tǒng)最終選擇MongoDB 為元數(shù)據(jù)庫的底層數(shù)據(jù)庫。
整個(gè)元數(shù)據(jù)管理系統(tǒng)從采集元數(shù)據(jù)到提供給客戶服務(wù)共分為4 層,最底層的是EAST 實(shí)驗(yàn)裝置的多數(shù)據(jù)源,也是整個(gè)元數(shù)據(jù)的提取源頭。 包括了存儲(chǔ)實(shí)驗(yàn)數(shù)據(jù)的Mdsplus、MySQL 以及存儲(chǔ)相機(jī)數(shù)據(jù)的數(shù)據(jù)庫,系統(tǒng)架構(gòu)如圖1 所示。
圖1 系統(tǒng)架構(gòu)圖Fig.1 System architecture
數(shù)據(jù)層包括實(shí)驗(yàn)放電監(jiān)聽模塊、元數(shù)據(jù)提取模塊等元數(shù)據(jù)后端的管理模塊。 為了更好的元數(shù)據(jù)采集性能,這個(gè)模塊中系統(tǒng)采用的技術(shù)路線主要是以更貼近底層語言的C++, 元數(shù)據(jù)庫采用的是典型的NoSQL 類型的數(shù)據(jù)庫MongoDB 以及MongoDB 為C++提供的調(diào)用接口。
在元數(shù)據(jù)服務(wù)層,系統(tǒng)通過調(diào)用元數(shù)據(jù)庫提供的API,基于B/S 模式和spring MVC 的系統(tǒng)設(shè)計(jì)理念,使用springboot+MongoDB 的技術(shù)路線在后端封裝元數(shù)據(jù)對(duì)外服務(wù)。
用戶通過瀏覽器使用訪問所提供的元數(shù)據(jù)查詢、元數(shù)據(jù)統(tǒng)計(jì)得到的各種統(tǒng)計(jì)圖、元數(shù)據(jù)監(jiān)控等服務(wù)。 使用bootstrap 提供的JGrid 分頁工具對(duì)松散靈活的樹形層狀元數(shù)據(jù)進(jìn)行可視化展示, 使用Thymeleaf 作為模版引擎,將后臺(tái)元數(shù)據(jù)相關(guān)的業(yè)務(wù)邏輯注入前端的模版中。
系統(tǒng)按照shot 為單位存儲(chǔ)元數(shù)據(jù)。 基于炮號(hào)的反范式數(shù)據(jù)建模,在擴(kuò)展性、查詢性能充分借鑒關(guān)系型和非關(guān)系型數(shù)據(jù)模型的優(yōu)勢(shì)。 在實(shí)現(xiàn)上,基于MongoDB 的基本存儲(chǔ)單元——文檔以及基于array的文檔嵌套,能夠很容易地存儲(chǔ)樹形元數(shù)據(jù)。 具體的數(shù)據(jù)模型如圖2 所示。
圖2 元數(shù)據(jù)模型Fig.2 Meta data model
元數(shù)據(jù)提取模塊會(huì)連接多源的數(shù)據(jù)庫,并提取系統(tǒng)關(guān)注的元數(shù)據(jù)信息。 將元數(shù)據(jù)實(shí)時(shí)采集并按格式存儲(chǔ)到元數(shù)據(jù)庫中。
數(shù)據(jù)管理員通過元數(shù)據(jù)管理平臺(tái)提供的狀態(tài)巡檢模塊確保元數(shù)據(jù)庫中的數(shù)據(jù)是準(zhǔn)確的;通過統(tǒng)計(jì)數(shù)據(jù)更新模塊持久化更新常用的統(tǒng)計(jì)表、索引信息,以此來優(yōu)化訪問性能;通過元數(shù)據(jù)庫的日志來對(duì)元數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行監(jiān)控和維護(hù)。
元數(shù)據(jù)提取模塊監(jiān)聽到shot complete 事件之后,表明實(shí)驗(yàn)相關(guān)的數(shù)據(jù)已經(jīng)采集完畢入庫,實(shí)驗(yàn)裝置正在為下一次放電實(shí)驗(yàn)做準(zhǔn)備, 在這個(gè)間隙,系統(tǒng)基于mdsplus 提供的C++API 以及一系列訪問數(shù)據(jù)庫的tcl 命令,遍歷Mdsplus 數(shù)據(jù)庫的各個(gè)sub-Tree 并提取元數(shù)據(jù)。 系統(tǒng)的具體流程如圖3 所示。
圖3 系統(tǒng)流程Fig.3 System flow chart
基于Mdsplus 數(shù)據(jù)庫提供的C++的event 類,開發(fā)監(jiān)聽模塊。 使用Mdsplus 的currentShot 類獲取事件后返回最大炮號(hào),進(jìn)行元數(shù)據(jù)提取。 提取完成之后,系統(tǒng)將涉及的統(tǒng)計(jì)的mongoShell 編寫成json 文件,提取結(jié)束之后自動(dòng)執(zhí)行。 通過文檔嵌套的實(shí)現(xiàn)方法,來模擬松散、可擴(kuò)展的樹形結(jié)構(gòu)。 構(gòu)建數(shù)據(jù)結(jié)構(gòu)的偽代碼流程如下所示。
測(cè)試在Centos7.9-64bit 的操作系統(tǒng)下進(jìn)行,MongoDB 的版本號(hào)為v4.0.6。 測(cè)試數(shù)據(jù)量一共20000 shots,存儲(chǔ)空間占用23.4 G,平均每炮實(shí)驗(yàn)下有5000~10000 不等的信號(hào)元數(shù)據(jù)。
數(shù)據(jù)庫的查詢主要分成兩類。 一類是基于索引字段的點(diǎn)查詢,精確到某個(gè)文檔的數(shù)據(jù)。 一類是掃描全集元數(shù)據(jù),對(duì)某個(gè)字段進(jìn)行統(tǒng)計(jì)求和或者聚合分組。 性能測(cè)試結(jié)果如表1 所示。
表1 元數(shù)據(jù)庫查詢性能測(cè)試結(jié)果Tab.1 Metadata database performance test
元數(shù)據(jù)庫通過API 接口封裝,為外部用戶提供進(jìn)一步的數(shù)據(jù)挖掘服務(wù)。 例如用戶查詢每個(gè)信號(hào)量的數(shù)據(jù)量計(jì)數(shù),查詢語句如下文所示。 查詢的部分結(jié)果如圖4 所示。
圖4 信號(hào)名聚合統(tǒng)計(jì)結(jié)果Fig.4 Signal name aggregation statistics result
除此以外,還可以基于建立的元數(shù)據(jù)封裝更多的跨炮間的數(shù)據(jù)統(tǒng)計(jì)、分析服務(wù),這個(gè)功能彌補(bǔ)了原始多源異構(gòu)數(shù)據(jù)倉庫架構(gòu)無法實(shí)現(xiàn)的功能。
作為提供給用戶使用的資源目錄,前端設(shè)計(jì)得方便、 易用十分的重要。 本系統(tǒng)基于bootsrap 的JGrid 工具包,設(shè)計(jì)了三層的表結(jié)構(gòu)目錄來為用戶呈現(xiàn)樹狀數(shù)據(jù)。 在一級(jí)資源目錄中,如圖5 所示,用戶看到一個(gè)炮號(hào)的列表,這個(gè)列表主要包含炮號(hào)的索引、摘要索引,以及該炮的一系列元數(shù)據(jù)信息。
圖5 元數(shù)據(jù)一級(jí)資源目錄Fig.5 Metadata primary resource directory
用戶點(diǎn)擊炮號(hào)索引(即一級(jí)目錄中的shot ID),進(jìn)入到二級(jí)資源目錄,如圖6 所示,這一級(jí)目錄將有關(guān)于該炮更詳細(xì)的元數(shù)據(jù)信息以及統(tǒng)計(jì)信息。
圖6 元數(shù)據(jù)二級(jí)目錄Fig.6 Metadata secondary directory
用戶點(diǎn)擊信號(hào)名索引,進(jìn)入第三級(jí)目錄。 這一級(jí)目錄是關(guān)于該炮下該信號(hào)名元數(shù)據(jù)的具體表單。如圖7 所示,主要包括該信號(hào)的采集時(shí)間、采樣頻率、轉(zhuǎn)換系數(shù)、零漂、放大倍數(shù)等信號(hào)元數(shù)據(jù)。
圖7 三級(jí)資源目錄Fig.7 Metadata tertiary directory
以上給出了一個(gè)聚變?cè)獢?shù)據(jù)庫的展示框架,基于以炮存儲(chǔ)的樹狀存儲(chǔ)設(shè)計(jì),這種展示結(jié)構(gòu)和存儲(chǔ)格式十分靈活。 即便關(guān)于炮號(hào)、關(guān)于信號(hào)增加了新的元數(shù)據(jù),也可以方便地在對(duì)應(yīng)層級(jí)的表單中添加對(duì)應(yīng)的元數(shù)據(jù)字段,擴(kuò)展起來十分方便。
本文基于EAST 核聚變實(shí)驗(yàn)裝置的元數(shù)據(jù)結(jié)構(gòu),創(chuàng)新地提出了按實(shí)驗(yàn)炮存儲(chǔ)的反范式化的數(shù)據(jù)庫設(shè)計(jì)方案, 基于MongoDB 創(chuàng)建了統(tǒng)一元數(shù)據(jù)庫,并開發(fā)了相關(guān)的管理功能模塊,同時(shí)集成了文獻(xiàn)[7]中有關(guān)存儲(chǔ)元數(shù)據(jù)的工作。 創(chuàng)建的統(tǒng)一的資源目錄能夠打破各個(gè)子系統(tǒng)之間的數(shù)據(jù)壁壘,為后續(xù)的跨實(shí)驗(yàn)之間的數(shù)據(jù)挖掘打下堅(jiān)實(shí)基礎(chǔ),很好地完成了文章開頭提出的需求。
本文在元數(shù)據(jù)模型的擴(kuò)展性、查詢性能、統(tǒng)計(jì)性能具有明顯的優(yōu)勢(shì)。 100000 炮數(shù)據(jù),平均響應(yīng)時(shí)間在毫秒級(jí), 證實(shí)了系統(tǒng)所用技術(shù)選型是合理、可用的。 并且能夠和統(tǒng)一數(shù)據(jù)訪問接口相互集成,提供一套完整的統(tǒng)一數(shù)據(jù)訪問、檢索服務(wù)。
未來需要繼續(xù)與統(tǒng)一數(shù)據(jù)訪問接口系統(tǒng)進(jìn)行持續(xù)的集成,為EAST 實(shí)驗(yàn)裝置提供方便可用的數(shù)據(jù)中臺(tái)服務(wù)。