陶 鑫 杜 宇 關 虹
(1.內蒙古自治區氣象數據中心,內蒙古 呼和浩特 010010;2.內蒙古電力(集團)有限責任公司信息通信分公司,內蒙古 呼和浩特 010000)
氣象大數據云平臺(天擎)于2020年7月完成了國省部署運行,形成1+31的業務布局,成為了全國各省級核心氣象業務系統。天擎1.0具備海量數據存儲、全業務貫通和數據應用高效的能力,足夠開放,可直接支撐天氣、氣候、探測、公服以及人影等各類氣象應用的云化融入[1]。到2022年完成天擎2.0建設,全面支撐氣象“云+端”的應用生態。其中數據處理中心子系統DPC(Data Processing Center)是天擎的重要環節,所有的數據由數據收集與分發子系統CTS(CMA domestic Telecommunication System)收集分發后,經過DPC系統的解碼處理并入庫。因此DPC是保障數據及時處理并入庫的核心系統,穩定運行非常重要。
天擎DPC系統負責解碼入庫的資料分為結構化資料、非結構化資料、半結構化資料、雷達流資料和消息體等。不同資料對應的解碼程序框架也有區別,即結構化資料需要處理解析文件內容并入庫,非結構化資料僅入文件索引,實體文件存儲在NAS存儲;半結構化資料則需夭對其存儲的格點場進行多場多要素拆分存儲;消息體數據則采用strom框架完成解碼存儲。
根據資料類別DPC系統分別部署在18臺服務器,每類資料都有特定的消息轉發配置、解碼程序配置和入庫策略配置等各不相同的配置文件,當程序僵死或出現異常,運維非常復雜,因此天擎DPC子系統配置文件查看器的開發具有實際意義,可以提高運維效率。
天擎DPC子系統配置文件查看器總體設計包括數據層、交互層、存儲層及應用層4部分,總體架構如圖1所示。

圖1 總體架構
DPC子系統數據解碼服務器共15臺服務器,結構化資料包括地面、高空、海洋、輻射、酸雨以及農氣等數據的處理;非結構化和半結構化資料包括雷達、衛星、數據模式和其他服務產品等數據處理;消息拆分與轉發處理服務器負責實時監聽通知消息到達,把打包消息拆分為單條消息,然后根據文件的重命名策略進行重命名后保存到數據存儲目錄,發向數據處理的RabbitMQ轉發消息[2]。所有的配置文件和解碼程序均存儲在制定的服務器,交互層通過信息采集模塊讀取數據層的配置信息。
應用層向交互層發送配置文件信息獲取請求,交互層信息采集模塊接收到指令后主動連接數據層對應服務器,然后搜索配置文件,進行解析,提取用戶請求的配置信息。采集的消息轉發配置信息包括服務器IP、配置文件名稱、存儲路徑、資料的名稱、資料的CTS四級編碼及資料對應的消息對列名稱等;采集的解碼程序配置信息包括服務器IP、資料入庫腳本名稱、資料配置文件、資料使用端口號等;采集的資料入庫策略配置信息包括服務器IP、配置文件名稱、資料的名稱、資料的CTS四級編碼和SOD四級編碼、存儲方式、入庫的表名及是否發送DI狀態等。最后將讀取到的配置文件信息存儲至內存數據庫中,為應用層提供數據支撐。
圍繞運維人員查看需求,以輕計算、重連接,前臺操作、后臺分析為要求,實現天擎DPC子系統配置文件查看需求。初次使用,運維人員需要先對DPC集群的節點、數據庫連接信息進行配置,然后將消息轉發配置、解碼程序配置和入庫策略配置獲取請求提交至交互層即可查看。
天擎DPC子系統配置文件查看器采用采用的是B/S的架構,瀏覽器端程序采用JavaScript語言開發,服務器端程序采用Java和python混合方式開發;開發工具使Eclipse 4.8.0;Web服務器使用Apache-tomcat-8.0.33 Web Server。
天擎DPC子系統配置文件查看器是基于Maven倉庫和Nutz開源框架搭建的。Maven是一個項目管理和綜合工具,Maven項目的結構和內容在一個XML文件(pom.xml)中聲明,搭建一個Web項目非常便捷。Nutz框架具有輕、全、活、整等特點,整個jar文件共910kB,提供了Dao、Ioc、Aop、Mvc和Json解析等必要功能,開發人員只需把精力集中在核心算法開發即可。
Java是一種完全獨立的語言,可在任何平臺上運行,擁有大量的第三方庫和框架,如Spring、Nutz、Hibernate和Apache Kafka等,可以滿足各種開發需求,Web應用開發具有明顯的優勢。Python是一種解釋型語言,語法簡單明了、功能類庫豐富,程序寫好后無須編譯即可運行。系統總體框架用Java搭建,其中信息采集模塊核心算法采用Python語言開發。Ganymed SSH-2 for Java是用純Java實現SSH-2協議包,通過該包可以遠程登錄到遠程服務器執行Python程序請求的算法實現信息采集,完成天擎DPC子系統配置文件查看器的設計和功能實現。
數據庫主要包括傳統的數據庫和內存數據庫,傳統的數據庫是將數據庫存儲到磁盤上,而內存數據庫則是將整個數據庫放進內存中。內存數據庫和傳統數據庫相比數據部署便捷、維護簡單且處理速度更快,非常適用于庫表結構簡單,數據量小的應用場景[3]。常用的內存數據有SQLite、Altibase、H2、Derby和HSQLDB等。系統選用的是H2內存數據庫,是Thomas Mueller提供的一個開源的、純Java實現的關系數據庫,支持JDBC和ODBC API,支持SQL,并支持提供基于瀏覽器的管理控制臺[4]。
Bootstrap-table表格插件提供了非常豐富的屬性設置,可以實現查詢、分頁、排序、復選框、設置顯示列、Card view視圖、主從表顯示以及合并列等處理功能,而且該插件同時也提供了一些不錯的擴展功能,如移動行、移動列位置等一些特殊的功能[5]。將數據顯示到表格的方式有客戶端(client)和服務器(server)2種模式。客戶端模式是指在服務器中把要顯示到表格的數據轉換成JSON格式一次性加載顯示的界面中,該模式適合數據量較少的場景。數據量很大時,為了節省資源,則用服務器模式,根據設定的每頁記錄數和當前要顯示的頁碼,發送數據到服務器進行查詢,然后再顯示到界面中。系統選用的是客戶端模式顯示數據。
基于Nutz-MVC的DPC子系統配置文件查看器包括服務器信息配置模塊、配置文件信息采集模塊、配置文件信息存儲模塊和配置文件信息查看模塊,其中配置文件信息采集模塊采用Python語言開發,各模塊設計實現如下。
該模塊主要用來配置DPC各節點的基本信息和服務類型,信息采集模塊通過讀取配置信息遠程連接到服務器調用對應程序接口。DPC服務器信息設置模板格式:DPC節點IP,SSH用戶,SSH密碼,SSH端口,節點服務類型。節點服務類型可以為一個或多個,多個類型用(;)分割,格式如下。
10.*.*.25,usr,pwd,port,DecoderConf_Frename;
FrenameTables
10.*.*.26,,usr,pwd,port,DecoderConf_Frename;
FrenameTables
10.*.*.27,,usr,pwd,port,DecoderConf_Grib;GribTables
10.*.*.28,,usr,pwd,port,DecoderConf_Grib;GribTables
10.*.*.31,,usr,pwd,port,DataRouteConf
10.*.*.34,,usr,pwd,port,DataRouteConf
10.*.*.35,,usr,pwd,port,DecoderConf_Decode
10.*.*.36,,usr,pwd,port,DecoderConf_Decode
其中,DecoderConf_Frename表示非結構化資料解碼程序配置信息獲取,FrenameTables表示非結構化資料入庫策略配置信息獲取,DecoderConf_Grib半結構化資料解碼程序配置信息獲取,GribTables表示半結構化資料入庫策略配置信息獲取,DataRouteConf表示消息轉發配置信息獲取,DecoderConf_Decode表示結構化資料解碼程序配置信息獲取,將該信息存儲至service.csv文件中。
配置文件信息采集模塊是由Python語言開發并封裝的算法包,Java主程序讀取service.csv文件,獲取各個服務器的ssh登錄信息及各節點服務類型,通過使用Ganymed SSH-2 for Java工具包,完成遠程服務器的連接,并將Pyhton程序名和服務類型傳遞至接口execPythonScript實現Java-Python的跨語言調用,主要代碼如下。

配置文件信息存儲模塊采用的是Nutz框架的dao接口,創建實體類和實體表,主要包括DataRouteConf.java、DecoderConf.java、FrenameTables.java、GribTables.java共4個實體類,對應的表名是datarouteconf、decoderConf、frenameTables和gribTables,分別存儲消息轉發配置信息、解碼程序配置文件信息、非結構化資料入庫策略和半結構化資料入庫策略等信息。Nutz.dao的使用節省了insert語句的編寫,只需一條語句即可完成數據的存儲,主要代碼如下。
db-driver=org.h2.Driver
db-url=jdbc:h2:file:~/.data/overviewerdb;MODE=MYSQL;D ATABASE_TO_UPPER=
db-username=db-username
db-password=db-password
db-validationQuery=select 1
private Dao dao = Mvcs.getIoc().get(Dao.class,"dao");
result = JSONObject.parseArray(str,DataRouteConf.class);
dao.insert(result);
信息查看模塊以標簽頁的方式綜合展示天擎DPC子系統配置文件,當有信息變更時點擊“重新獲取”按鈕更新。運維人員在頁面發起請求后,通過ajax方式將請求提交至后臺獲取數據,然后利用Bootstrap-table插件在頁面顯示。
天擎DPC子系統配置文件查看器部署方便,只需要程序包overviewer.jar上傳至能訪問DPC服務器的任意臺機器,執行nohup java -jar overviewer.jar &,即可完成部署。部署完成后需要訪問網站進行DPC節點和數據庫連接初始化設置。
自2021年系統上線以來,已經在實際業務中開展應用,應用效果總結如下:1)功能性方面,從運維人員運維角度出發,提供了多個維度的配置文件檢索功能,業務人員可以很快獲取到有效信息,滿足業務求。2)穩定性方面,自運行以來,每個功能和模塊都運行穩定可靠,未出現任何故障。3)安全性方面,軟件包部署在DPC集群服務器,讀取解碼入庫程序的核心算法只能在DPC集群訪問,網頁端只提供查看功能,保證了系統的安全性,符合相關網絡安全的要求和規范[6]。4)系統擴展性方面,擴展性是系統應對業務變更的能力,擴展性優良可以減少系統開發運維的成本,系統相關參數可通過頁面配置修改,核心算法包采用python腳本,修改后項目無須部署即可實現迭代更新。
為保障“天擎”實時業務系統穩定運行,為各業務單位提供強有力的數據支撐,設計了天擎DPC子系統配置文件查看器,實現了對DPC集群各服務器的解碼入庫程序配置文件快速查找,保障了“天擎”數據環境的數據穩定、及時。系統投入業務運行之后,運維人員遇到故障后,能非常高效地查找到對應進程所在,顯著地提高了運維能力,對氣象信息化高質量可持續發展具有重要的保障意義,改系統遷移方便,僅需要修改對應省份的服務器IP即可完成本地化部署應用,后續將繼續根據實際業務需要擴充、完善系統功能。