面试题答案
一键面试- 列族规划思路
- 按时间维度规划:
- 可以考虑创建一个“时间相关”的列族。由于HBase中数据按行键排序存储,我们可以将时间信息融入行键设计。例如,行键格式可以设计为
user_id + timestamp
(timestamp
以倒序存储,如Long.MAX_VALUE - actual_timestamp
)。对于列族,如果行为日志数据量较大且需要按时间范围快速检索,可以将不同时间粒度的数据放在不同列族中。比如,创建一个“近期日志”列族和一个“历史日志”列族。近期日志列族存储近一个月内的日志,历史日志列族存储一个月以前的日志。这样在查询近期数据时,可以只扫描“近期日志”列族,提高查询效率,同时也能使数据在Region间根据时间范围有一定的分布,避免热点。
- 可以考虑创建一个“时间相关”的列族。由于HBase中数据按行键排序存储,我们可以将时间信息融入行键设计。例如,行键格式可以设计为
- 按行为类型规划:
- 创建按行为类型划分的列族。例如,如果行为类型有登录、浏览、购买等,可以分别为不同行为类型创建列族,如“login_cf”“browse_cf”“purchase_cf”等。这样不同行为类型的数据在物理存储上分离,当对某一类行为进行分析时,只需要操作对应的列族,减少不必要的数据扫描。同时,不同行为类型的数据分布在不同的物理存储区域,有助于在Region间分散负载,避免因某一类行为数据量过大导致热点。
- 综合规划:
- 结合时间和行为类型来规划列族。比如,对于近期的登录行为,可以放在“recent_login_cf”列族,近期的浏览行为放在“recent_browse_cf”列族;历史登录行为放在“historical_login_cf”列族,历史浏览行为放在“historical_browse_cf”列族。这样既考虑了数据的时间特性,又结合了行为类型,能更细致地规划数据存储,在Region间实现更合理的数据分布,有效避免热点问题。同时,在设计行键时,要保证行键的随机性,避免大量请求集中在某几个Region上。例如,可以在
user_id + timestamp
基础上,加入一些随机字符或数字,使得数据更均匀地分布在各个Region。
- 结合时间和行为类型来规划列族。比如,对于近期的登录行为,可以放在“recent_login_cf”列族,近期的浏览行为放在“recent_browse_cf”列族;历史登录行为放在“historical_login_cf”列族,历史浏览行为放在“historical_browse_cf”列族。这样既考虑了数据的时间特性,又结合了行为类型,能更细致地规划数据存储,在Region间实现更合理的数据分布,有效避免热点问题。同时,在设计行键时,要保证行键的随机性,避免大量请求集中在某几个Region上。例如,可以在
- 按时间维度规划: