面试题答案
一键面试行键设计
- 通用思路:考虑到按设备ID快速查询近期数据以及数据按时间序列存储,行键可以由设备ID和时间戳组合构成。这样在查询时,能利用HBase基于行键的快速定位能力。例如,可以将设备ID作为前缀,时间戳作为后缀,中间可以用分隔符隔开。
- 具体设计:
- 设备ID在前:将设备ID放在行键的开头部分,因为HBase的排序是字典序,这样可以将同一设备的所有数据集中存储在一起,便于按设备ID进行范围查询。
- 时间戳在后:采用倒序时间戳(如将时间戳取反或使用从大到小的排序),这样近期的数据会排列在前面,在查询近期数据时,能快速定位到所需数据。例如行键格式为
设备ID_倒序时间戳
。
高表和宽表设计策略及理由
- 高表设计策略:
- 策略:高表是指列数少但行数多的表。在这种物联网场景下,对于每个设备产生的数据,将不同时间的数据存储为不同的行。例如,每一行代表一个设备在某个具体时间点产生的数据。
- 理由:
- 查询效率:按设备ID查询近期数据时,由于近期数据在前面,通过行键范围查询可以快速定位到相关数据行。
- 扩展性:当新的数据类型(列)添加时,对表结构影响较小,只需在现有行上添加新列即可。
- 负载均衡:数据在HBase集群中分布相对均匀,避免单个RegionServer负载过高。
- 宽表设计策略:
- 策略:宽表是指列数多但行数少的表。在物联网场景中,可以将一个设备的一段时间内(如一天)的数据存储在一行中,不同时间的数据作为不同的列。
- 理由:
- 减少I/O开销:对于需要获取一个设备一段时间内整体数据的场景,只需读取一行数据,减少了行读取的I/O开销。
- 数据完整性:一个设备的相关数据集中在一行,便于维护数据的完整性和一致性。但缺点是列数过多可能导致单个RegionServer负载不均衡,且在添加新数据类型(列)时,可能需要对已有行进行较大的结构调整。