赞
踩
用来标识表中唯一的一行数据,以字节数组形式存储,类似关系型数据库中表的主键。rowkey在HBase中是严格按照字典序排序的。
必须在设计上保证其唯一性。由于在HBase中数据存储是Key-Value形式,若HBase中同一表插入相同Rowkey,则原先的数据会被覆盖掉(如果表的version设置为1的话),所以务必保证Rowkey的唯一性。
例如:如果hbase表是存放以人为单位的数据时,在rowkey应该包含身份证信息,以确保他的唯一性。
HBase的Rowkey是按照ASCII有序设计的,我们在设计Rowkey时要充分利用这点。
例如:设计客户消费记录表时,可以把客户的id放在rowkey头部,这样通过客户id查询记录时,数据都存在同一个region中,查询效率就会提高。
我们设计的Rowkey应均匀的分布在各个HBase节点上。
拿常见的时间戳举例,假如Rowkey是按系统时间戳的方式递增,Rowkey的第一部分如果是时间戳信息的话将造成所有新数据都在一个RegionServer上堆积的热点现象。
也就是通常说的Region热点问题,热点发生在大量的client直接访问集中在个别RegionServer上(访问可能是读,写或者其他操作),导致单个RegionServer机器自身负载过高,引起性能下降甚至Region不可用。
常见的是发生jvm full gc或者显示region too busy异常情况,当然这也会影响同一个RegionServer上的其他Region。
例如:hbase表中放的是人的行为数据时,在rowkey的设计时,就不能把时间戳放到rowkey的前面部分,选择身份证号放在开头是不错的选择。
Rowkey是一个二进制,建议是越短越好。
原因:其一是HBase的持久化文件HFile是按照KeyValue存储的,如果Rowkey过长比如500个字节,1000万列数据光Rowkey就要占用500*1000万=50亿个字节,将近1G数据,这会极大影响HFile的存储效率其二是MemStore缓存部分数据到内存,如果Rowkey字段过长内存的有效利用率会降低,系统无法缓存更多的数据,这会降低检索效率。
例如:如果不涉及查询的字段就不要放到rowkey,如果只需要通过身份号查询,那就不用将名字、电话、地址其他信息放到rowkey中。
RowKey字段的选择,遵循的最基本原则是唯一性,RowKey必须能够唯一的识别一行数据。RowKey字段都应该参考最高频的查询场景。
数据库通常都是以如何高效的读取和消费数据为目的,而不是数据存储本身。
结合具体的负载特点,再对选取的RowKey字段值进行改造,组合字段场景下需要重点考虑字段的顺序。
RowKey字段的设计避免出现数据集中在同一region的情况,尽可能在写入数据时所有region都均匀的插入等量数据。
如果rowkey字段选择无法避免数据热点问题时,可以观察rowkey尾部若呈现良好的随机分布数,可以倒转rowkey来避免热点问题。又或rowkey头部添加固定位数的随机数也可以使数据均匀分布。但是这些方法同时也会让数据分布失去有序性。
总结:
喵呜面试助手: 一站式解决面试问题,你可以搜索微信小程序 [喵呜面试助手] 或关注 [喵呜刷题] -> 面试助手 免费刷题。如有好的面试知识或技巧期待您的共享!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。