面试题答案
一键面试基本原则
- 散列性:行键应设计为能将数据均匀分布在不同的RegionServer上,避免数据热点。如果行键是连续的数字或字母顺序,可能会导致大量数据集中在一个RegionServer上。
- 长度适宜:行键不宜过长,过长会增加存储开销。一般建议行键长度控制在10 - 100字节之间。同时也不能过短,过短可能难以满足业务需求的唯一性和区分度。
- 唯一性:行键需保证在整个表中是唯一的,否则新数据可能会覆盖旧数据。
常用方法
- 加盐:在行键前面添加随机字符串(盐值),这样可以将原本可能集中的行键分散到不同的Region中。例如,对于用户ID为
12345
的行键,可加盐变为abc_12345
,其中abc
为随机生成的盐值。 - 反转:对于有递增趋势的字段,如时间戳,将其反转后作为行键。例如,时间戳
20231001120000
反转后变为00002101003202
,这样原本按时间顺序写入的数据会分散开,避免热点。 - 组合字段:将多个相关字段组合成一个行键,以增加行键的唯一性和区分度,同时也有助于数据的检索和聚合。例如,将用户ID和时间戳组合成
user123_20231001120000
作为行键。
举例
假设我们有一个网站访问记录的Hbase表,记录每个用户在不同时间对不同页面的访问情况。如果单纯以用户ID作为行键,可能会因为某些热门用户的频繁访问导致数据热点。
- 使用加盐方法:生成随机盐值如
xyz
,行键变为xyz_user123_20231001_page1
,abc_user456_20231002_page2
等,将数据分散到不同Region。 - 使用反转方法:若以时间戳作为行键的一部分,将时间戳反转,行键变为
user123_00002101003202_page1
,user456_00003101003202_page3
,避免按时间顺序写入产生的热点。 - 使用组合字段:行键设计为
user123_20231001_page1
,user456_20231002_page2
,方便按用户或时间范围进行数据检索和分析。