面试题答案
一键面试设计思路
- 前缀设计:考虑到电商业务有多种商品分类,将商品分类ID作为行键前缀。这样在查询特定商品分类的数据时,可以利用HBase按行键顺序存储的特性,快速定位到相关数据区域。例如,假设商品分类ID为数字编码,以“001”表示电子产品,“002”表示服装等。
- 时间戳因素:多维度用户行为数据与时间紧密相关。添加时间戳(如毫秒级时间戳)作为行键的一部分,并且按照时间倒序排列。这样最新的用户行为数据会排在前面,便于优先获取近期活跃数据,符合电商业务关注近期用户行为的需求。
- 唯一标识:为了确保行键的唯一性,添加用户ID或其他唯一标识(如UUID)。但为了避免行键过长影响性能,若用户ID本身较短且唯一,可直接使用;若较长,可考虑使用哈希值代替。
综合起来,行键格式可设计为:商品分类ID + 时间戳(倒序) + 用户ID(或哈希值)。
考虑因素
- 查询需求:满足分页查询,特别是针对特定商品分类和时间范围的分页查询。通过上述行键设计,在查询时可以利用HBase的Scan操作,通过设置起始行键和结束行键来实现分页。例如,查询电子产品在某个时间段内的用户行为数据分页,可根据商品分类ID和时间戳确定起始和结束行键范围。
- 数据分布:合理设计行键,避免数据集中在某些特定区域,导致热点问题。通过将商品分类ID作为前缀,使不同分类的数据分布在不同区域;时间戳倒序可分散不同时间的数据。
应对数据倾斜问题
- 预分区:根据商品分类ID的范围进行预分区。例如,预先对0 - 99的商品分类ID创建10个分区,每个分区对应10个分类ID范围。这样不同商品分类的数据会均匀分布在不同分区中,避免某个分区负载过高。
- 加盐处理:在某些极端情况下,若某个商品分类的数据量特别大,可对该分类下的行键进行加盐处理。即在商品分类ID前添加一个随机字符(如A - Z中的一个),然后根据这个加盐后的行键进行分区。这样原本集中在一个分区的数据会分散到多个分区,但查询时需要遍历所有加盐后的分区范围。
- 动态调整:定期监控HBase集群的负载情况,根据不同商品分类的数据增长趋势,动态调整分区策略。例如,若发现某个商品分类数据增长迅速,可对该分类所在区域进行再分区,以平衡负载。