背景介紹
作為地震監(jiān)測(cè)的核心業(yè)務(wù)單位,中國(guó)地震臺(tái)網(wǎng)中心承擔(dān)著全國(guó)乃至全球地震監(jiān)測(cè)任務(wù)。在地震發(fā)生后,臺(tái)網(wǎng)中心的科學(xué)家會(huì)第一時(shí)間進(jìn)行震源定位并為公眾提供地震速報(bào)信息。地震波形數(shù)據(jù)就是各地震臺(tái)站的直接觀測(cè)數(shù)據(jù)。通過對(duì)地震波的到時(shí)分析地震學(xué)家們可以來分析地震發(fā)生時(shí)間、定位震源、計(jì)算震級(jí)等。臺(tái)網(wǎng)中心地震科學(xué)技術(shù)開放實(shí)驗(yàn)室一直密切跟蹤地震學(xué)方法與減災(zāi)技術(shù)的發(fā)展動(dòng)態(tài),研發(fā)新一代地震業(yè)務(wù)處理平臺(tái); 承擔(dān)新業(yè)務(wù)系統(tǒng)上線前的測(cè)試評(píng)估工作。最近也在大數(shù)據(jù)領(lǐng)域嘗新新技術(shù),本文介紹一種用時(shí)序數(shù)據(jù)庫TDengine來存儲(chǔ)歸檔地震波形數(shù)據(jù)的新思路。
實(shí)際應(yīng)用場(chǎng)景
業(yè)務(wù)背景介紹
地震監(jiān)測(cè)業(yè)務(wù)可簡(jiǎn)化成數(shù)據(jù)采集、數(shù)據(jù)傳輸和數(shù)據(jù)處理三部分。其中數(shù)據(jù)采集使用的設(shè)備一般為地震計(jì)(可視為特殊的物聯(lián)網(wǎng)采集設(shè)備),其由多個(gè)國(guó)家布設(shè)在全球各地(如圖1),并7x24小時(shí)不間斷測(cè)量和記錄當(dāng)?shù)氐牡孛孢\(yùn)動(dòng)數(shù)據(jù)供各國(guó)使用。采集的數(shù)據(jù)通過有線或無線網(wǎng)絡(luò)傳輸至臺(tái)網(wǎng)中心,臺(tái)網(wǎng)中心的數(shù)據(jù)處理軟件采用人工交互處理或自動(dòng)處理方式對(duì)數(shù)據(jù)進(jìn)行處理,監(jiān)測(cè)全國(guó)和全球的地震活動(dòng)情況。

近幾年,隨著國(guó)家對(duì)防震減災(zāi)要求不斷提高,我國(guó)先后實(shí)施了多個(gè)大型地震監(jiān)測(cè)工程項(xiàng)目,優(yōu)化和加密觀測(cè)臺(tái)網(wǎng)和觀測(cè)儀器(如地震計(jì)),預(yù)計(jì)未來幾年,用于數(shù)據(jù)采集的地震計(jì)數(shù)量將會(huì)呈數(shù)量級(jí)增長(zhǎng),并且隨著物聯(lián)網(wǎng)的發(fā)展,將會(huì)有更多數(shù)據(jù)接入用于地震監(jiān)測(cè)。因此,原有在單臺(tái)機(jī)器上運(yùn)行的地震數(shù)據(jù)處理軟件(如地震自動(dòng)測(cè)定軟件)的數(shù)據(jù)處理壓力會(huì)越來越大。同時(shí)海量數(shù)據(jù)的匯入,對(duì)數(shù)據(jù)存儲(chǔ)、管理、回溯等都提出了新的要求。
為了解決海量數(shù)據(jù)處理和存儲(chǔ)的問題,中國(guó)地震臺(tái)網(wǎng)中心地震科學(xué)開放實(shí)驗(yàn)室研發(fā)團(tuán)隊(duì)開發(fā)了SeisFLINK2地震自動(dòng)監(jiān)測(cè)系統(tǒng)(如圖2)。SeisFLINK2系統(tǒng)是基于大數(shù)據(jù)技術(shù)構(gòu)建系統(tǒng)框架,并集成地震專業(yè)處理模塊的地震實(shí)時(shí)流處理平臺(tái)。其使用Kafka作為分布式消息交換子系統(tǒng),實(shí)現(xiàn)海量地震數(shù)據(jù)的接入和交換;使用Ignite作為分布式數(shù)據(jù)緩存子系統(tǒng),方便各地震數(shù)據(jù)處理模塊獲取近線數(shù)據(jù)用于地震數(shù)據(jù)處理;使用Flink對(duì)海量地震數(shù)據(jù)流進(jìn)行實(shí)時(shí)處理(主要用于震相檢測(cè));正逐步使用TDengine替代Hbase實(shí)現(xiàn)地震數(shù)據(jù)的存儲(chǔ)和檢索(圖2左下)。

用TDengine存儲(chǔ)地震波形數(shù)據(jù)
我國(guó)的地震計(jì)一般1秒鐘采集100次地面運(yùn)動(dòng)數(shù)據(jù)(100Hz),并定期(零點(diǎn)幾秒至幾秒)打包后向后方數(shù)據(jù)服務(wù)器傳輸數(shù)據(jù),數(shù)據(jù)一般為國(guó)際通用的MiniSeed格式,一個(gè)數(shù)據(jù)包均包含頭文件和數(shù)據(jù)文件,頭文件包含數(shù)據(jù)元信息,如地震計(jì)所屬臺(tái)網(wǎng)、臺(tái)站、通道、位置號(hào)、采樣率、包數(shù)據(jù)起始時(shí)間和結(jié)束時(shí)間等。數(shù)據(jù)文件包括時(shí)間段內(nèi)采樣值。
按照業(yè)務(wù)需要,我們將MiniSeed數(shù)據(jù)分兩部分存儲(chǔ)。第一部分我們?cè)O(shè)計(jì)了一張超級(jí)表Seismometer,設(shè)有兩個(gè)字段以及4個(gè)標(biāo)簽,ts為采樣時(shí)間,value為采樣值,四個(gè)tags分別為地震計(jì)對(duì)應(yīng)的臺(tái)網(wǎng)、臺(tái)站、通道和位置號(hào)。我們?yōu)槊總€(gè)地震計(jì)創(chuàng)建了兩張表(通過超級(jí)表創(chuàng)建),一張用于存儲(chǔ)該地震計(jì)傳輸回來的數(shù)據(jù),地震計(jì)的數(shù)據(jù)包經(jīng)過解包后把采樣點(diǎn)數(shù)據(jù)按照時(shí)間順序存入該表中(如圖5右側(cè)所示)。另一張表記錄每一個(gè)數(shù)據(jù)包的數(shù)據(jù)起始時(shí)間和結(jié)束時(shí)間。第二部分對(duì)于長(zhǎng)期保持不變的元數(shù)據(jù)信息如某個(gè)地震計(jì)的采樣率,存儲(chǔ)在固定文件中。這樣做目的是雖然只需利用存儲(chǔ)的采樣值數(shù)據(jù)就可進(jìn)行波形顯示,但地震專業(yè)分析軟件大多支持MiniSeed格式,因此考慮后續(xù)通過讀取上述兩部分?jǐn)?shù)據(jù),將元數(shù)據(jù)和采樣數(shù)據(jù)還原成MiniSeed包,供地震專業(yè)分析軟件使用。


在數(shù)據(jù)量方面,一個(gè)地震計(jì)一般1秒采樣100次,在數(shù)據(jù)沒有缺失的情況下,一天一張表約存儲(chǔ)8,640,000條記錄,共約5000張表。在這種數(shù)據(jù)量情況下,經(jīng)簡(jiǎn)單測(cè)試,數(shù)據(jù)檢索效率仍然很快。
在數(shù)據(jù)寫入方面,采用C接口單線程批量的寫入方式,一條波形一天的數(shù)據(jù)(17000個(gè)數(shù)據(jù)包)大概20秒就可以寫完。按照接入1000多個(gè)臺(tái)站計(jì)算,每秒就有1000多個(gè)包,大概消費(fèi)時(shí)間在1.2秒,通過多線程消費(fèi)入庫,可比較輕松滿足實(shí)時(shí)性要求。用Python接口會(huì)更方便,我也將從www.iris.edu拉取的地震數(shù)據(jù)并寫入TDengine的Python程序開源,操作很簡(jiǎn)單(https://github.com/schenton/seedlink2taos_py)。
在數(shù)據(jù)壓縮率方面,由于原有MiniSeed包內(nèi)數(shù)據(jù)已進(jìn)行過壓縮,故原有數(shù)據(jù)與TDengine數(shù)據(jù)占用磁盤空間比例約為1:1。TDengine壓縮后的數(shù)據(jù)文件與未壓縮的原始數(shù)據(jù)相比,壓縮比大概在9.5%,還是相當(dāng)優(yōu)秀的。
集成Grafana做地震數(shù)據(jù)展示
為了將存入TDengine的地震數(shù)據(jù)利用起來,我們嘗試?yán)胓rafana輔以簡(jiǎn)單的消息轉(zhuǎn)發(fā)程序,成功將地震波形數(shù)據(jù)在grafana上進(jìn)行顯示。應(yīng)用場(chǎng)景為在某個(gè)地震發(fā)生后,在grafana web頁面上自動(dòng)顯示距震中最近6個(gè)臺(tái)站(可理解為地震計(jì))的波形數(shù)據(jù)。

如圖5所示,首先我們利用一個(gè)簡(jiǎn)單的python消息轉(zhuǎn)發(fā)程序,在接收到新的地震事件后,計(jì)算得出距震中最近的6個(gè)臺(tái)站,并將臺(tái)站名寫入MySql的waveform_station表中。然后在grafana上配置6個(gè)變量用于動(dòng)態(tài)表示6個(gè)臺(tái)站,變量可定時(shí)從Mysql數(shù)據(jù)庫中讀取臺(tái)站名(如圖6)。這樣我們就實(shí)現(xiàn)了在grafana中實(shí)時(shí)地顯示最新地震的最近6個(gè)臺(tái)站的波形變化,即不僅波形實(shí)時(shí)變化,各個(gè)面板中顯示的臺(tái)站也會(huì)隨著地震事件而更新(如圖8)。

最后,在grafana input sql中,用變量代表需要在TDengine中查詢的表名,tbname1動(dòng)態(tài)的表示為seisflink.IU_RAO_00_BHZ(圖7)。


采用TDengine的原因
我們接觸TDengine時(shí)間不長(zhǎng),使用它的初衷是通用的大數(shù)據(jù)軟件(如HBase等)的維護(hù)對(duì)人員的技術(shù)要求較高,不利于我們專業(yè)軟件的推廣和使用。同時(shí),使用HBase存儲(chǔ)MiniSeed數(shù)據(jù)后,按時(shí)間、按臺(tái)站檢索地震數(shù)據(jù)的效率并沒有想象中的快。
相比之下,開源版TDengine的安裝包只有不到5MB,對(duì)硬件資源也沒有什么硬性要求,安裝部署只需運(yùn)行一個(gè)腳本,十分簡(jiǎn)單。對(duì)應(yīng)用而言,TDengine沒有區(qū)分歷史和實(shí)時(shí)數(shù)據(jù)庫,支持Ad Hoc查詢,并且是SQL語法。這個(gè)就大大降低了開發(fā)的難度,不需要我們做分庫分表的操作,并且可以做到大量地震波形數(shù)據(jù)的實(shí)時(shí)顯示。TDengine的超級(jí)表設(shè)計(jì)也非常適合對(duì)各個(gè)臺(tái)站數(shù)據(jù)的分片,每個(gè)臺(tái)站的數(shù)據(jù)獨(dú)立存放在各自的表中,但可以通過超級(jí)表統(tǒng)一過濾、查詢,高效方便。
總結(jié)與展望
毫無疑問,TDengine是一款非常好的時(shí)序數(shù)據(jù)庫產(chǎn)品,輕量、高效、簡(jiǎn)單。經(jīng)過前期的開發(fā),它可以方便的將地震數(shù)據(jù)高速入庫并快速地檢索出來。但如果想要在地震業(yè)務(wù)中更好的得到應(yīng)用,我們認(rèn)為還需要在如何更方便的使用TDengine存儲(chǔ)的地震數(shù)據(jù)上做文章:如何無縫的將地震專業(yè)分析軟件與TDengine集成使用?
例如地震行業(yè)通用的python工具包obspy,它可通過webservice按時(shí)間,按臺(tái)站方便的請(qǐng)求MiniSeed數(shù)據(jù)并實(shí)時(shí)進(jìn)行濾波、仿真等數(shù)據(jù)處理。就像前面提到的,我們后續(xù)可能嘗試在obspy的上層做一個(gè)數(shù)據(jù)接口,同樣實(shí)現(xiàn)按臺(tái)站、按時(shí)間從TDengine中獲取采樣點(diǎn)數(shù)據(jù)并打包成MiniSeed數(shù)據(jù),供obspy、sac等地震專業(yè)軟件使用。
同時(shí)TDengine的許多高級(jí)部分我們尚未完全挖掘應(yīng)用,如流計(jì)算,某個(gè)時(shí)間段的最大值最小值等對(duì)我們量取地震波形數(shù)據(jù)峰值,計(jì)算震級(jí)等應(yīng)該會(huì)有幫助,簡(jiǎn)化我們的開發(fā),以后有機(jī)會(huì)繼續(xù)深入研究和使用。