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数据即可

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