本章節(jié)主要為您介紹基于表格存儲的海量氣象格點數(shù)據(jù)解決方案的模型及方案設(shè)計。
標準化格點數(shù)據(jù)模型
維度 | 說明 |
---|---|
variable | 變量,例如各種物理量 |
time | 時間維度 |
z | z軸,一般表示空間高度 |
x | x軸,一般表示經(jīng)度或緯度 |
y | y軸,一般表示經(jīng)度或緯度 |
GridDataSet = F(variable, time, z, x, y)
名稱 | 說明 |
---|---|
GridDataSetId | 唯一標記這個GridDataSet的ID。 |
Attributes | 自定義屬性信息,例如該數(shù)據(jù)的產(chǎn)生時間、數(shù)據(jù)來源、預報類型等等。
您可以自定義屬性,也可以給某些屬性建立索引,建立索引后就可以通過各種組合條件來查詢符合條件的數(shù)據(jù)集。 |
例如,假設(shè)某種氣象預報每次預報未來72小時的每個整點的各個高度、各個經(jīng)緯度的各種物理量,則這次預報就是一個標準的五維數(shù)據(jù),是一個單獨的GridDataSet,下一次相同的預報則是另一個數(shù)據(jù)集。這兩個數(shù)據(jù)集需要有不同的GridDataSetId。這兩個數(shù)據(jù)集比較類似,只是起報時間不同,但是因為起報時間不在五維模型中(五維內(nèi)的時間為一次預報中的未來不同時刻),所以屬于不同的數(shù)據(jù)集,起報時間可以作為數(shù)據(jù)集的自定義屬性。本方案中,也支持對自定義屬性設(shè)置條件進行檢索。
數(shù)據(jù)存儲方案
表格存儲設(shè)計了兩張表分別存儲數(shù)據(jù)集的meta和data:- meta表示這個數(shù)據(jù)集的元數(shù)據(jù),例如GridDataSetId、各維度長度、自定義屬性等。
- data表示這個數(shù)據(jù)集里實際的網(wǎng)格數(shù)據(jù)。data相比meta在數(shù)據(jù)大小上要大很多。
- 用戶會有根據(jù)多種條件查詢數(shù)據(jù)集的要求,例如查詢最近有哪些數(shù)據(jù)集已經(jīng)完成入庫,或者查詢表中有哪些某種類型的數(shù)據(jù)集等。傳統(tǒng)方案中主要是通過MySQL等關(guān)系型數(shù)據(jù)庫來存儲,在本方案中我們通過單獨的meta表來存儲,并通過表格存儲的多元索引功能來實現(xiàn)多條件的組合查詢和多種排序方式,相比傳統(tǒng)方案更加易用。
- 在查詢格點數(shù)據(jù)之前,一般要知道格點數(shù)據(jù)中各維度的長度等信息,這些信息就是存儲在meta表中的,即需要先查詢meta表,再查詢data表。因為meta數(shù)據(jù)一般都很小,因此查詢效率相比查詢data要高,多一次查詢并不會明顯增加延遲。
meta表設(shè)計
由于GridDataSetId可以唯一標記一個GridDataSet,所以meta表的主鍵只有一列,用于記錄GridDataSetId。各種系統(tǒng)屬性和自定義屬性保存在meta表的屬性列中。
查詢meta表有兩種方式:一種是通過GridDataSetId直接查詢,另外一種是通過多元索引??梢愿鶕?jù)多種屬性條件組合進行查詢,例如篩選某種類型的數(shù)據(jù),按照入庫時間從新到老返回等。
data表設(shè)計
data表的設(shè)計要解決五維數(shù)據(jù)在不同的切分模式下的查詢效率問題,不能簡單直接的對數(shù)據(jù)進行存儲。
為了高效查詢,需要盡量減少一次查詢需要掃描的數(shù)據(jù)量。一個數(shù)據(jù)集的數(shù)據(jù)量可能在幾GB的級別,但是一次查詢往往只需要其中的幾MB的數(shù)據(jù),如果無法高效的定位要查詢的數(shù)據(jù),那么就要掃描全部的幾GB的數(shù)據(jù),從中篩選出符合某個范圍的數(shù)據(jù),顯然效率是很低的。如何才能高效定位到需要的數(shù)據(jù)之中是提高查詢效率的關(guān)鍵。
主鍵 | 說明 |
---|---|
GridDataSetId | 數(shù)據(jù)集Id,唯一標記這個數(shù)據(jù)集。 |
Variable | 變量名,即五維模型中的第一維。 |
Time | 時間,即五維模型中的第二維。 |
Z | 高度,即五維模型中的第三維。 |
這四列主鍵列標記一行表格存儲中的數(shù)據(jù),這行數(shù)據(jù)需要保存后兩維的數(shù)據(jù),即一個格點平面。
這種設(shè)計下,五維中的前三維都可以通過主鍵列的值來定位,即對于前三維的每一種情況,都對應表格存儲中的一行。由于前三維分別代表變量、時間和高度,一般不會很多,每個維度在幾個到幾十個的級別,可以通過一些并行查詢的方法來加速查詢速度。
后兩維代表了一個水平的平面,一般是一個經(jīng)緯度網(wǎng)格,這兩維的大小是比前三維要大很多的,每維在幾百到幾千的級別,隨著數(shù)值預報越來越精細化,這個網(wǎng)格的大小還會成倍增加。這樣的一個稠密的網(wǎng)格數(shù)據(jù),不能把每個格點都用一列來保存,這樣列的數(shù)量會非常多,存儲效率也會非常的低。另一方面,如果我們把一個平面的格點數(shù)據(jù)存儲到一列中,在整讀整取時效率比較高,但是如果只讀取某個點,就會讀取很多的無效數(shù)據(jù),效率又會變得比較低。因此我們采取一種折中的方案,對平面的二維數(shù)據(jù)再次進行切分,切分成更小的平面數(shù)據(jù)塊,這樣就可以做到只讀取部分數(shù)據(jù)塊,而不總是讀取整個平面,因此極大的提高了查詢性能。