MST
星途 面试题库

面试题:Hbase高表与宽表在行键设计高级考量分析

假设我们有一个物联网场景,设备持续产生海量数据,数据按时间序列存储,同时需要支持按设备ID快速查询近期数据。请阐述如何针对这种场景设计Hbase的行键,区分高表和宽表设计时的不同策略及理由。
13.7万 热度难度
数据库Hbase

知识考点

AI 面试

面试题答案

一键面试

行键设计

  1. 通用思路:考虑到按设备ID快速查询近期数据以及数据按时间序列存储,行键可以由设备ID和时间戳组合构成。这样在查询时,能利用HBase基于行键的快速定位能力。例如,可以将设备ID作为前缀,时间戳作为后缀,中间可以用分隔符隔开。
  2. 具体设计
    • 设备ID在前:将设备ID放在行键的开头部分,因为HBase的排序是字典序,这样可以将同一设备的所有数据集中存储在一起,便于按设备ID进行范围查询。
    • 时间戳在后:采用倒序时间戳(如将时间戳取反或使用从大到小的排序),这样近期的数据会排列在前面,在查询近期数据时,能快速定位到所需数据。例如行键格式为 设备ID_倒序时间戳

高表和宽表设计策略及理由

  1. 高表设计策略
    • 策略:高表是指列数少但行数多的表。在这种物联网场景下,对于每个设备产生的数据,将不同时间的数据存储为不同的行。例如,每一行代表一个设备在某个具体时间点产生的数据。
    • 理由
      • 查询效率:按设备ID查询近期数据时,由于近期数据在前面,通过行键范围查询可以快速定位到相关数据行。
      • 扩展性:当新的数据类型(列)添加时,对表结构影响较小,只需在现有行上添加新列即可。
      • 负载均衡:数据在HBase集群中分布相对均匀,避免单个RegionServer负载过高。
  2. 宽表设计策略
    • 策略:宽表是指列数多但行数少的表。在物联网场景中,可以将一个设备的一段时间内(如一天)的数据存储在一行中,不同时间的数据作为不同的列。
    • 理由
      • 减少I/O开销:对于需要获取一个设备一段时间内整体数据的场景,只需读取一行数据,减少了行读取的I/O开销。
      • 数据完整性:一个设备的相关数据集中在一行,便于维护数据的完整性和一致性。但缺点是列数过多可能导致单个RegionServer负载不均衡,且在添加新数据类型(列)时,可能需要对已有行进行较大的结构调整。