RowKey在读写中起到的作用
- 读写时通过RowKey路由到对应的Region;
- MemStore中的数据按RowKey进行排序;
- HFile中的数据按RowKey进行排序;
RowKey的设计直接关乎Region的划分
Hbase通过RowKey检索数据的三种方式
- 通过单个row key访问:即按照某个row key键值进行get操作;
- 通过row key的range进行scan:即通过设置startRowKey和endRowKey,在这个范围内进行扫描;
- 全表扫描:即直接扫描整张表中所有行记录。
RowKey设计的目标
- 1-结合业务特点,将数据合理的分配到每一个Region中,从而很好的满足业务的读写需求;
索引设计的目标
- 1-为Hbase提供更多维度查询的能力,在实际应用中应该通过构建尽量少的索引,来满足更多的查询场景;
需求调研的维度
- 1-负载特点;
- 2-查询场景;
- 3-数据特点;
负载特点
- 1-读写TPS;读写比重--重写轻读?重读轻写?读写相当?
- 2-数据负载均衡与高效读取时常时矛盾的。
- 3-在重读轻写的大数据场景重,RowKey设计应该更侧重于如何高效读取;
- 4-而在重写轻读的大数据场景重,在满足基本查询需求的前提下,应该更关注整体的吞吐量,这就对数据的负载均衡提出了很高的要求;
查询场景
- 1-需要支持哪些查询场景?时延要求?
- 2-最高频的查询场景是什么?
- 3-最有价值的数据排序场景是什么?
- 4-是否有其他维度的价值查询场景?维度?
- 5-是否是组合字段场景?
- 6-各个字段的匹配类型?--Equal?Prefix Match?Wildcard?Text-Search?
数据特点
- 1-查询条件字段的离散度信息?字段离散度的定义:字段A的离散度=(字段A的可能的枚举值数据)/数据总记录条数
- 2-查询条件字段的数据分布特点?--数据分布影响RowKey的设计,更进一步影响如何查询合理的划分Region信息
- 3-数据生命周期--影响到一个表的一次Major Compaction发生时涉及到的最大数据量
影响查询的关键因素
- 基于某一个索引/RowKey进行查询时,影响查询的最关键因素在于能否将扫描的候选结果集限定在一个合理的范围内。
- 知识点备注:查询驱动条件与查询过滤条件:直接影响数据扫描范围的查询条件,称之为查询驱动条件。而其他的能够起到过滤作用的查询条件,称之为查询过滤条件。影响查询的关键因素在于如何合理的设置查询驱动条件。
RowKey字段的选取
遵循的最基本原则:
- 唯一性:RowKey必须能够唯一的识别一行数据;无论应用时什么样的负载特点,RowKey字段都应该参考最高频的查询场景。数据库通常都是以如何高效的读取和消费数据为目的,而不是存储本身。而后,结合具体的负载特点,再对选取的RowKey字段值进行改造,组合字段场景下需要重点考虑字段的顺序。
避免数据热点的方法-Reversing
- 如果经过初步涉及出的RowKey在数分布不均匀,但是RowKey尾部的数据却呈现了良好的随机性。此时,可以考虑将RowKey的信息反转,或者直接将我i不的bytes提前到RowKey的前部。
- 缺点:场景利于Get但不利于Scan,因为数据在原RowKey上的自然顺序已经被打乱。
避免数据热点的方法--Salting
- Salting的原理是在原RowKey的前面添加固定长度的随机bytes,随机bytes能保障数据在所有Regions间的负载均衡。
- 缺点:既然是随机bytes,基于原RowKey查询时无法获知随机bytes信息是什么,也就是需要去各个可能的Regions中去查看。可见,Salting对于读取是利空的。
避免数据热点的方法-Hashing
- 基于RowKey的完整或部分数据进行Hash,而后将Hashing后的值完整替换原RowKey或者部分替换RowKey的前缀部分;
- 缺点:与reversing类似,Hashing也不利于Scan,因为打乱了原RowKey的自然顺序。