RowKey设计可以说是一个非常基础的话题,因为每一个HBase的使用/开发人员,都是从表/RowKey设计着手的。但细究起来,RowKey设计也有很多难点,尤其是如何与应用特点很好的结合起来。
这篇演讲的第一部分,首先简单介绍HBase的基础内容,而后探讨RowKey在读写流程中所发挥的关键作用。HBase的基础内容大部分已经在下面的文章里面详细探讨:
RowKey与索引设计,需要紧密结合业务需求场景。索引的设计目标是为HBase提供更多维度的查询能力。在实际应用中应该通过构建尽量少的索引,来满足更多的查询场景。因此第二部分介绍设计前需求调研的几个关键维度包括负载特点、查询场景以及数据特点。
-
负载特点
-
读写TPS;读写比重
- 重写轻读?重读轻写?读写相当?
-
-
数据负载均衡与高效读取时常是矛盾的。
-
在重读轻写的大数据场景中,RowKey设计应该更侧重于如何高效读取。
-
查询场景
-
最高频的查询场景是什么?
- 最有价值的数据排序场景是什么
-
是否有其它维度的价值查询场景?频度?
-
是否是组合字段场景?
-
各个字段的匹配类型?
- Equal? Prefix Match? Wildcard? Text-Search?
-
数据特点
-
查询条件字段的离散度信息?
-
字段离散度的定义:
- 字段A的离散度 = (字段A的可能的枚举值数目)/数据总记录条数
-
-
查询条件字段的数据分布特点?
- 数据分布影响RowKey的设计,更进一步影响如何合理的划分Region信息
-
数据生命周期?
- 影响到一个表的一次Major Compaction发生时涉及到的最大数据量
第三部分介绍RowKey设计的几点技巧,二级索引RowKey设计的方法,组合字段RowKey/索引的适用场景/设计原则,字段组合的合理顺序等等。
-
知识点备注:查询驱动条件与查询过滤条件:直接影响数据扫描范围的查询条件,称之为查询驱动条件。而其它的能够起到过滤作用的查询条件,则称之为查询过滤条件。影响查询的关键因素在于如何合理的设置查询驱动条件。
-
RowKey字段的选取
-
遵循的最基本原则:
-
唯一性: RowKey必须能够唯一的识别一行数据。
-
无论应用是什么样的负载特点,RowKey字段都应该参考最高频的查询场景。数据库通常都是以如何高效的读取和消费数据为目的,而不是数据存储本身。
- 而后,结合具体的负载特点,再对选取的RowKey字段值进行改造,组合字段场景下需要重点考虑字段的顺序。
-
-
如果经初步设计出的RowKey在数据分布上不均匀,但RowKey尾部的数据却呈现出了良好的随机性,此时,可以考虑将RowKey的信息翻转,或者直接将尾部的bytes提前到RowKey的前部。
- 缺点:更场景利于Get但不利于Scan,因为数据在原RowKey上的自然顺序已被打乱。
-
-
避免数据热点的方法 - Salting
-
分布式数据库的常见数据分片方式
-
有两种常见的基础数据分片方式:Hash分片和Range分片
- 原理与区别如图所示。在实际应用中,两者还可以结合应用。
-
“Hash分片”方式:尽管可以保证所有数据到各个“桶”的分布均匀性。但打乱了数据原有的顺序,从而使得按顺序读取方式的性能偏低
“Range分片”方式: 每一个Region负责管辖一个Key值范围。这样的存储,保留了数据原有的顺序,从而按顺序读取方式的性能很高
-
HBase基于Range的方式可以为使用者带来很大的灵活度,但却提升了使用门槛!!!
- 二级索引RowKey设计常见方法-无Schema模式
-
这是常见的设计思路,如果原数据RowKey中已经包含了索引列的信息,该设计容易导致数据冗余。
二级索引RowKey设计常见方法-有Schema模式
-
当原数据RowKey中的列与索引列有重叠时,该设计能避免一个列在索引列中被重复存储。但该设计需要事先支持Schema,也就是需要事先定义原数据的RowKey结构以及索引的结构信息。
-
二级索引字段的选取
-
对所有的价值查询场景进行详细分析,基于确实能够缩小查询范围的一部分列来构建二级索引。即,我们应该基于离散度较好的一些列来构建索引。
-
组合索引适用场景/构建原则
-
组合索引的创建,取决于对用户查询场景的详细分析。组合索引的确可极大的优化这些字段组合时的查询场景,但却会带来相对较大的数据膨胀。在不了解用户数据特点以及用户查询场景的情形下,盲目的构建组合索引,是要坚决避免的。
- 组合索引中字段组合的顺序
-
先导列的选取:
-
被选作先导列的列,一定是经常被用到的列
-
应选择设置了EQUALS查询条件的列作为先导列
-
先导列应该具备较好的离散度
-
尽量不要重复选择其它索引的先导列作为本索引的先导列
-
附加列的选取:
-
关于索引的其它建议
最后一部分围绕着OpenTSDB,JanusGraph以及GeoMesa三个典型的HBase生态技术,结合了它们各自的数据模型、查询场景,探讨它们的RowKey设计方案。
附上HBase RowKey与索引设计PPT:
备注:历届HBase Meetup会议的PPT: http://hbase.group/slides/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。