前置知识:
HBase基本概念与基本使用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
- 自定义预分区的目的是为了避免数据热点。 有20个datanode,暂定分200个区(000-199),计算方式为 :卡口编号32字节murhash除以200取余
- 卡口编号32
- T+过车时间17
- C+车牌统一编码8,包含四种(普通,普通军队,武警,普通警察)
- FX+方向,本身2
- H+号牌种类,本身2
- 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数据即可
4 扩展
可以了解一下phoenix,提供了基于hbase的二级索引功能,但是能否在生产环境中使用还需要验证。
phoenix官网