hbase存儲查詢的實際案例

1 前言

具體場景是解決過車數據的查詢問題,過車數據每天的數據量大概在2000萬級別。關係型數據庫無法滿足數據存儲與查詢的需求。過車數據包含的字段有: 卡口編號,過車時間,車牌,方向,號牌種類等。

經過調研,選擇hbase進行數據的存儲查詢,但有一個前提,需要事先定義好查詢的場景,根據需要支持的查詢場景來進行hbase的rowkey設計(hbase的關鍵就在於rowkey的設計),其關鍵點在於設置 startRow,stopRow , 讓rowkey能連續匹配的長度越長,查詢越快。filter過濾只是起到錦上添花的作用。

設計的hbase表有2個,1個是過車主表vehicle_main,1個是車牌索引表 vehicle_idx_chepai (二級索引表)。滿足以下2個查詢場景:
1 卡口編號+過車時間段 + 其他(車牌like查詢,方向,號牌種類等條件非必選):
譬如:where 卡口編號 =‘0272015ZM12360’
and 過車時間 between ‘20170610230343’
and ‘20170610230410’ and …………

2 車牌號精確+過車時間段(時間範圍可以較大一些)+其他……
譬如: where 車牌號=‘鄂A1JF13’ and 過車時間 between ‘20170610230343’ and ‘20170610233420’ and …………

2 表設計

2.1 vehicle_main表

過車主表vehicle_main的rowkey設計爲:
分區3byte - 卡口編號32byte - T過車時間17byte - C車牌8byte - FX方向2byte - H號牌種類2byte - murhash取末尾8byte

  1. 自定義預分區的目的是爲了避免數據熱點。 有20個datanode,暫定分200個區(000-199),計算方式爲 :卡口編號32字節murhash除以200取餘
  2. 卡口編號32
  3. T+過車時間17
  4. C+車牌統一編碼8,包含四種(普通,普通軍隊,武警,普通警察)
  5. FX+方向,本身2
  6. H+號牌種類,本身2
  7. murhash取末尾8, 爲了避免rowkey重複(同一毫秒可能多條相同記錄,數據源問題)
    注:字母全部轉化爲大寫。rowkey示例爲:
    098-1006121FFFFFASDDF0061006FFFFFFFF-T20170819113536207-C25A1JF13-FX99-HFF-88281530

列族存放:卡口編號,過車時間,車牌,方向,號牌種類等基礎信息

2.2 vehicle_idx_chepai 表

車牌索引表 vehicle_idx_chepai 的rowkey設計爲:
分區3byte - C車牌8byte - T過車時間17byte - 卡口編號32byte - murhash取末尾8byte
1 分100個區(000-099),計算方式爲 :車牌統一編碼8字節處理後murhash 除以100取餘
2 C+車牌8字節
3 T+過車時間 17字節
4 卡口編號32字節
5 murhash取末尾8位 8字節 爲了避免idx表的rowkey重複
注:字母全部轉化爲大寫。rowkey示例爲:
027-C25A1JF13-T20171029111836189-3492011XX100233492011XX10023FFFF-92875092
(注意!!)列族裏的列只存放1列,即主表vehicle_main的 rowkey

3 兩種查詢場景的查詢策略

3.1

卡口編號+過車時間段 + 其他(車牌like查詢,方向,號牌種類等條件非必選):
譬如:where 卡口編號 =‘0272015ZM12360’
and 過車時間 between ‘20170610230343’
and ‘20170610230410’ and …………

此場景直接走vehicle_main表查詢,查詢時設置
startRow=098-0272015ZM12360FFFFFFFFFFFFFFFFFF-T20170610230343
stopRow=098-0272015ZM12360FFFFFFFFFFFFFFFFFF-T20170610230410
再加上其他的filter過濾,去hbase裏面查詢

3.2

車牌號精確+過車時間段(時間範圍可以較大一些)+其他……
譬如: where 車牌號=‘鄂A1JF13’ and 過車時間 between ‘20170610230343’ and ‘20170610233420’ and …………

此場景先走vehicle_idx_chepai 表查詢,
查詢時設置
startRow=027-C25A1JF13-T20170610230343
stopRow=027-C25A1JF13-T20170610233420
再加上其他的filter過濾

查詢後拿到vehicle_main主表的rowkey,去vehicle_main主表中直接通過rowkey來get數據即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章