天天看點

阿裡雲HBase Ganos在海量實時軌迹中的應用(一)

場景需求

在移動對象軌迹監控與分析的項目中,收集了數十萬的車輛資訊,每個車輛會定時的上報目前位置、事件、狀态等資訊,每天約數億條軌迹點,需要能夠存儲。且前端使用者在查詢時,要能快速傳回目标船舶的資訊。

入庫需求:

軌迹資料,每日新增10億條左右,包括時間點、經緯度坐标、對象目前的屬性資訊

基本不涉及到資料的修改(不斷的追加資料)

查詢需求:

  • 區域回放:根據時間和空間範圍兩個次元共同查詢。例如:查詢東經110°~120°,北緯25°~35°空間範圍内,2019.3.1~2019.3.10時間範圍内的所有軌迹點。
  • 軌迹線查詢:根據某個移動對象的id,查出某段時間内的軌迹。例如:查詢編号為"205073000"的船舶在2019.3.1~2019.3.10時間範圍内的所有軌迹點。

要求:

  • 要能支撐每日10億量級的寫入,要能承載千億軌迹規模的存儲
  • 時空查詢(區域回放)要能在秒級響應,軌迹線查詢要能在百毫秒級響應

技術調研

關系型資料庫

現有的關系型資料庫如Oracle、MySQL、PostgreSQL都提供了Spatial的插件,尤其是PG的空間引擎PostGIS,使用率較高,具有豐富的空間處理算法,适合做空間關系判斷與分析等。但衆所周知,關系型資料庫的強項在于OLTP,即适合資料更新、查詢等,但對于大規模資料的存儲則需要分庫分表等操作,操作相對繁瑣,是以對于上述需求來說,暫不考慮關系型資料庫。(這裡提一下,除了阿裡雲PG Ganos外,都沒有時空處理)

NoSQL資料庫

NoSQL适合處理海量資料的存儲與查詢,如Cassandra、HBase、MongoDB、Redis等,都支援海量資料的水準擴充。但在時空方面都沒有一個完善的方案,比如MongoDB、Redis雖然都提供了空間處理的算法,但總體來說隻能實作Within等操作,即空間範圍查詢操作。

阿裡雲已經釋出了基于HBase的時空引擎HBase Ganos(參考:

https://help.aliyun.com/document_detail/87287.html?spm=a2c4g.11174283.6.619.3c693c2e29oyDM

),不僅可以處理空間查詢,還可以處理時空查詢場景。是以,本文基于HBase Ganos時空引擎對上述場景進行測試。

執行個體規格

HBase Ganos具有高吞吐特點,本着節省的原則,我們以最小規格配置為基礎(約2000元+/月,成本與HBase相同),來看看是否能夠支撐上述需求。具體配置如下:

  • master節點:2核4G
  • core節點:4核8G(數量可動态擴充)
  • 磁盤:高效磁盤(500G,可動态擴充)

具體實施

通路接口

HBase Ganos支援RESTful和GeoTools兩種接口通路形式,前者通過HTTP協定可以友善的使用任何一種程式設計語言通路;而GeoTools接口基于Java語言,較為通用。本文采用該接口方式,這裡封裝了一個Ganos Client工具,可以直接下載下傳使用(附案例代碼連接配接)

資料模型表

通過GanosSchemaUtil工具類建立SimpleFeature(Point類型),并添加了對象id(為其建立索引)、速度、事件、狀态、時間(預設建立索引)等資訊,具體如下:

GanosSchemaUtil ganosSchemaUtil = new GanosSchemaUtil();
ganosSchemaUtil.addField("objId", "String", true);  
ganosSchemaUtil.addField("speed", "Double", false);
ganosSchemaUtil.addField("event", "Integer", false);
ganosSchemaUtil.addField("status", "Integer", false);
ganosSchemaUtil.setGeometry("Point", null);
ganosSchemaUtil.setDate("dtg");
SimpleFeatureType sft  = ganosClient.createSFT(schemaName, ganosSchemaUtil.toString(),"zstd");
ganosClient.createSchema(sft);           

資料構造

上述字段的值采用随機生成方式(按照真實資料規則模拟),資料構造方法為:

  • 時間視窗:2019-02-25 00:00:00~2019-03-05 00:00:00
  • 空間視窗:經度範圍 115.37465076~120.37465076, 緯度範圍:26.23923772~31.23923772
  • 移動對象數量(可了解為車、船的數量):100萬
  • 其他屬性資料:速度、狀态、事件等,均采用随機生成方式

資料導入

啟動10個線程并發寫入

導入方法:

  • 啟動10個線程寫入,每次批量寫入1000條。
  • 這1000條資料中,随機選取多個移動對象,同時随機生成該移動對象的時間點、空間位置以及其他屬性資訊。比如這1000條軌迹點可屬于N個對象,每個對象的軌迹點個數也不相同。

    代碼參考:

資料查詢

  • 啟動10個線程查詢,查詢場景包含兩種:a、區域回放(時空查詢);b、單條軌迹查詢(id+時間)
  • 每次從一百萬個移動對象中随機選取一條,同時随機選取查詢的時間視窗,考察系統吞吐、RT等

    代碼:參考

性能

  • 寫入性能:存儲層的IO可達8萬+/s,在建構三張索引表的情況下,可了解為每秒能支撐3萬個軌迹點的導入,完全能夠滿足一天10億級的寫入需求。
阿裡雲HBase Ganos在海量實時軌迹中的應用(一)
  • 查詢性能:

    區域回放(時空查詢):每次查詢傳回資料量在幾百條左右,緩存為命中情況下,耗時在1秒鐘以内;若緩存命中情況下,在100ms左右。

軌迹線查詢:每次傳回資料量在幾百條左右,耗時在800ms以内。

總結

HBase Ganos不僅能夠支援空間查詢、還能夠支援“時間+空間”的查詢,以及軌迹線(時序)查詢。在2個4核8G的節點配置下,能夠支撐每日10億量級的資料寫入,且性能維持在秒級以下,适合海量軌迹的存儲和查詢場景。