前言
HBase的RowKey的行由行键按字典顺序排序,这样的设计优化了扫描,允许存储相关的行或者那些将被一起读的邻近的行。然而,设计不好的行键是导致 hotspotting 的常见原因。当大量的客户端流量( traffic )被定向在集群上的一个或几个节点时,就会发生 hotspotting。这些流量可能代表着读、写或其他操作。流量超过了承载该地域的单个机器所能负荷的量,这就会导致性能下降并有可能造成地域的不可用。在同一 RegionServer 上的其他地域也可能会受到其不良影响,因为主机无法提供服务所请求的负载。设计使集群能被充分均匀地使用的数据访问模式是至关重要的。
为了防止在写操作时出现hotspotting,设计行键时应该使得数据尽量同时往多个RegionServer 上写,而避免只向一个RegionServer 写,除非那些行真的有必要写在一个RegionServer 里。HBase的排序问题按字典序rowkey排序,从小到大,如果任务为了获得最新的时间数据可用用时间戳反转,或者用long.maxvalue - timestamp
设计原则
按照 散列 唯一 长度 顺序
散列
散列和预分区可以放在一起 比如预先分10个region 减少热点问题
可以将id %10 做开头 但是如果id规律性强的话 可以用(id+年月日)%10
唯一
必须在设计上保证其唯一性,rowkey是按照字典顺序排序存储的,
因此,设计rowkey的时候,要充分利用这个排序的特点,可以将经常读取的数据存储到一块,将最近可能会被访问的数据放到一块。
可以用时间戳放在其中 hbase是按字典序排序 要考虑一直单分区写情况
长度
rowkey作为二进制码流最大为64kb 最好不要超过16个字节 设计过长会占memstore空间
顺序
HBase的rowkey安装字典序顺序排列 从小到大,所以需要最新数据时需要翻转时间戳或者自增id
可枚举属性值较少的属性放在rowkey前面
rowkey是由多个字段组合而成,这多个字段的先后次序和访问的效率有直接的关系。一个普遍的规则是:数量较少,可控的字段放在rowkey靠前位置(如eengine_type,provinc等);反之放在后面(如vin,t