本文共 2518 字,大约阅读时间需要 8 分钟。
1、为什么Rowkey这么重要
1.1、Rowkey是什么
Rowkey类似于MySQL、Oracle中的主键,用于标示唯一的行。它完全由用户指定,是一串不重复的字符串。HBase中的数据根据Rowkey的字典排序来排序,读写数据都以Rowkey为核心。
1.2、Rowkey的作用
Rowkey在HBase中起着关键作用:
- 用于将读写数据定向特定的Region,确保数据以高效方式管理和检索。
- MemStore中的数据按照Rowkey的字典顺序排序,使得增删改查操作更高效。
- HFile中的数据同样按Rowkey字典顺序排列,保证数据的可持续性和高效读取。
1.3、Rowkey对查询的影响
举例说明—Rowkey:uid+phone+name
Rowkey在数据检索中的表现非常出色,可以支持以下场景:
- 支持“固定字段+扩展字段”的复合查询,例如:uid=001 AND phone=12345678901 AND name=zhang
- 支持部分字段查询,例如:uid=001 AND phone=123?
- 支持单字段查询,例如:uid=001
不过,Rowkey并不擅长支持字段之间的独立查询,例如:
- phone=12345678901 AND name=zhang
- phone=12345678901
- name=zhang
1.4、Rowkey对Region划分的影响
HBase表的数据是根据Rowkey划分到不同的Region中。如果Rowkey设计不合理,可能会导致热点问题,即大量客户集中访问少数节点,导致高负载和性能下降。
2、Rowkey设计技巧
2.1、Salting
Salting的核心思想是在Rowkey的前缀中添加一定长度的随机数。主要优点是增加数据的分布性,但其缺点是:
- 会增加查询时的排序开销。
- 虽然增大了写操作的吞吐量,但也让读取性能下降,因为需要额外处理随机前缀的排序。
2.2、Hashing
Hashing时,将Rowkey转换为哈希值,并将哈希值的部分字符串与原Rowkey拼接最终形成新的Rowkey。这种方法可以显著增加Rowkey的唯一性,但存在以下问题:
- 哈希函数的随机性会导致数据分布不均匀,影响到全表扫描等操作的性能。
- 为了提升读取性能,通常会对哈希值进行截取处理,但这又会降低数据的唯一性和可读性。
2.3、Reversing
Reversing则是将Rowkey的现有值反转一部分或全部字符,其优点在于有效打散数据,避免长时间的单 Keyhotspot问题。
2.4、Rowkey的长度
Rowkey的长度应当控制在合理范围内(如16字节左右),主要原因包括:
- 过长的Rowkey会导致HFile存储效率下降,尤其是在处理大量数据时。
- MemStore缓存效率较低,减少了内存的利用率。
- 长Rowkey难以同时满足系统的8字节对齐和多字节平台兼容性要求。
3、Rowkey设计案例剖析
3.1、交易类表Rowkey设计
在交易处理中,Rowkey设计建议包括:
- 查询卖家某段时间内的交易记录时,可以使用sellerId+timestamp+orderId作为Rowkey。
- 查询买家的交易记录,可采用buyId+timestamp+orderId的设计。
- 查询订单信息时,直接使用orderNo作为唯一标识符。
3.2、多卖家的交易记录查询
为了支持高效的搜索,建议将Rowkey设计为salt+sellerId+timestamp。这种设计可以同时满足以下场景:
- 全表Scand رفع全局锁定,实现快速Range Query。
- 按sellerId或sellerId+timestamp进行快速查找。
- 支持批量查询多个卖家的交易记录。
3.3、金融风控Rowkey设计
在用户画像分析中,Rowkey设计可采用prefix+uid、prefix+idcard、prefix+tele等方式,其中prefix可通过取md5(uid)的前缀部分获取。
3.4、车联网Rowkey设计
在车联网场景中,Rowkey设计建议:
- 查询车辆历史交易记录,可按carId+timestamp来设计。
- 通过prefix+carId+timestamp来避免热点问题,提升负载均衡性。
3.5、倒序时间戳
在支持倒序时间查询时,推荐将时间戳转换为倒序形式(如Long.MaxValue - timestamp),从而实现以下功能:
- 查询用户某段时间内的操作记录,可以按 DefensiveStencil(例如uid)的startRow和stopRow进行范围查询。
- 支持根据特定时间点获取最新操作记录的场景。
3.6、OpenTSDB的Rowkey设计
数据存储要求
- 指标名称
- 时间戳(支持毫米或秒精度)
- 数值类型(单值或多值)
- 标签组合(用于筛选和分类)
复杂查询场景
OpenTSDB支持以下查询模式:
- 按照时间范围、指标名称、标签组合等条件组合的多关键字查询。
- 支持复杂的时间范围组合,如timege(≥)和 time <=(≤)等条件。
- 可以通过指定特定标签值进行精确查找。
优化设计示例—slat+metric_uid+timestamp+tagk1+tagv1+[tankN+tagvN]
这种设计不仅确保了时间序列数据的唯一性,还通过多层次的标签增强数据的可检索性和分析能力。
3.7、HBase二级索引
二级索引的意义
二级索引的主要目的是对特定字段进行高效查询,比如:
- 根据phone=1311111111快速查找用户信息。
- 支持复杂的查询需求,如(phone=* AND name=*)等。
实现方法
通过在主表中创建二级索引表,索引字段为主表的Rowkey,可以快速定位到相关数据。这种方式类似于传统数据库中的辅助索引,适用于需要频繁根据特定字段查询的场景。
应用场景
二级索引的应用可分为以下几类:
- OLTP系统中的传统查询需求,例如使用Phoenix实现SQL+OLTP。
- 全文检索场景,结合Solr或Es进行高级文本检索。
转载地址:http://cddxz.baihongyu.com/