博客
关于我
谈笑间学会-Hbase Rowkey设计
阅读量:592 次
发布时间:2019-03-12

本文共 2518 字,大约阅读时间需要 8 分钟。

谈笑间学会-Hbase Rowkey设计

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/

你可能感兴趣的文章
Vector 实现类
查看>>
HashMap类、HashSet
查看>>
HashTable类
查看>>
TreeSet、TreeMap
查看>>
ObjectInputStream、ObjectOutputStream
查看>>
JVM内存模型
查看>>
反射机制
查看>>
可变长度参数
查看>>
堆空间常用参数总结
查看>>
3、条件查询
查看>>
8、子查询
查看>>
cordova打包apk更改图标
查看>>
开启与配置SMTP服务器
查看>>
APP卡片式设计
查看>>
GitHub上传时,项目在已有文档时直接push出现错误解决方案
查看>>
云数据库
查看>>
大数据在不同领域的应用
查看>>
页面置换算法
查看>>
文件系统的层次结构
查看>>
减少磁盘延迟时间的方法
查看>>