面试题答案
一键面试1. 行键设计
- 设计:采用
设备ID + 时间戳
的组合方式。例如,设备ID为device001
,时间戳为20240101120000
,行键可表示为device001_20240101120000
。 - 理由:设备ID作为前缀,便于快速定位特定设备的数据。时间戳则能保证数据按时间顺序排列,对于实时传感器数据,按时间顺序存储利于数据的顺序读写,并且在查询历史数据时可以利用时间范围进行高效扫描。对于设备故障记录,时间戳能清晰记录故障发生时间,方便按时间查询故障历史。对于设备历史配置信息,虽变更少,但时间戳能记录配置修改的时间,便于追溯。
2. 列族划分
- 实时传感器数据列族:命名为
sensor_data
。在此列族下,不同的传感器数据类型作为列名,如温度temperature
、湿度humidity
等。- 理由:实时传感器数据写入频率高,将其放在一个单独列族,可针对该列族进行特定的存储优化,如设置合适的块缓存策略,以提高读写性能。同时,将同类型的高频写入数据归为一族,符合HBase列族设计原则,能减少数据的随机I/O。
- 设备历史配置信息列族:命名为
config_info
。列名可根据配置参数命名,如device_type
、network_settings
等。- 理由:设备历史配置信息较少变更,单独列为一个列族,在存储上可以采用不同的压缩策略,例如使用高压缩比的算法,因为其数据相对稳定,压缩不会影响频繁读写性能,且能有效节省存储空间。
- 设备故障记录列族:命名为
fault_record
。列名可以为fault_type
、fault_description
等。- 理由:设备故障记录不定期写入,将其单独作为一个列族,方便对故障数据进行独立管理和查询。而且不同的故障记录在数据结构和访问模式上与其他数据不同,单独列族有利于优化存储和查询性能。
3. 预分区策略
- 策略:采用基于设备ID哈希值的预分区策略。首先计算设备ID的哈希值,然后根据哈希值范围进行预分区。例如,假设哈希值范围是
0 - 2^32 - 1
,可以将这个范围划分为多个小区间,每个区间对应一个预分区。 - 理由:物联网场景中设备数量众多,如果不进行预分区,数据可能会集中在少数RegionServer上,导致负载不均衡。基于设备ID哈希值预分区能将不同设备的数据均匀分布到各个Region中,避免数据倾斜,提高系统的读写性能和扩展性。同时,在查询特定设备数据时,能快速定位到对应的Region,减少查询开销。