和哈希表类比,HBase中的行键类似于哈希表中的键.要构造一个良好的HBase模式,关键之一就是选择一个合适的行键.

行键是HBase中检索记录所使用的键.HBase记录含有的列在数量上没有限制,但是只能有一个行键.这一点同关系型数据库有所不同,后者的主键可以有多个列组合.既然要为一个记录创建唯一的行键,那么单一的行键就需要包含多种信息.例如,如果一行标识一个订单,那么customer_id,order_id,timestamp可以作为该行的行键.在关系型数据库中,customer_id,order_id,timestamp是三个分开的列,而HBase中三者需要组合形成一个独特的标识符.

在选择行键时需要记住的另外一个点是,但已记录中的get操作是HBase中最快的操作.因此,在设计HBase模式时,用get操作解决大多数常见的数据使用问题,这样会提高处理性能.这可能意味着将大量数据放到单一记录中,比关系型数据库中存放的数据多.这样的设计被称作反向规范化,不同于关系型数据库中常见的规范化设计.比如,关系型数据库可能会将消费者存在一个表中,将其联系方式存在另外一张表中,又将订单存在第三个表中,而订单详情则在另外一个表中.HBase则会设计非常宽的表,即每一个订单记录都包含该订单的所有信息,也包含消费者及其联系方式.单一的get操作就可以检索所有的数据.

对于一个给定的表,记录在HBase集群多个Region中的分布方式是由行键决定的.HBase中所有的行键都进行了排序,经过排序的行键按照范围存储在不同的Region中.每个Tegion都固定在一个Region服务器(即集群中的一个节点)上.

行键有一个著名的反模式设计 ,那就是时间戳的使用.在行键中使用时间戳可以将大多数的put和get请求几种在单一的Region上,进而集中在单一的Region服务器上.于是,在某种程度上,HBase不再是一个分布式系统.一般来说,选择行键的最合理标准是让集群的负载分布均匀

数据块缓存是一种最近最少使用的(Lease Recently Used, LRU)缓存,能将数据块缓存到内存中.默认情况下,按照64KB的块大小从磁盘中读取记录,每一个这样的数据块都是一个HBase数据块(HBase Block). 从磁盘中读取的时候,HBase数据块会防止在数据块缓存中.但是,你也可以不讲HBase数据块放到数据块缓存中.之所以要进行缓存,是因为最近访问的数据(以及与这些数据同在一个HBase数据块中的数据)很有可能在不久之后再次被请求访问.但是由于数据块缓存的大小有限制,所以应当谨慎明智的使用它

选择合适的行键能够使相关的记录位于同一个Region.这有助于进行范围扫描,因为HBase只需扫描一定数目的Region就可以获取结果.另外,如果行键选择不合适,范围扫描在获取数据时可能需要扫描多个Region服务器,随后还要过滤掉不相关的记录.这样一来,同样的请求就增加了额外的I/O.另外,要记得HBase的扫描速度大约是HDFS的八分之一,减低I/O要求能显著提高性能.与HDFS上的数据存储相比.HBase在这一点上更为明显

行键的大小将决定工作负载的性能,通常来说.行键越短越好,因为这样可以降低存储消耗,提高读写性能.但是,行键较长时,get和scan的性能更好.因此 在选择时,需要权衡行键的长短.行键越长,压缩编解码在存储行键时需要处理的I/O就越多.同理,列名称越长,需要处理的I/O也越多.所以一般来说,保持列的名称短一些比较好

Tips:可以使用Snappy配置HBase,压缩行键.因为行键按照排序进行存储,所以行键之间的排列比较紧密时.压缩效果较好,这就是不宜将某个属性的哈希作为行键的另一个原因,因为行键的排序是任意的

从开始就接触可读性比较好的行键,如果你不习惯HBase,哪就更应该去这样做.这能让你更为轻松发现和调试问题,也更容易使用HBase操作台.

因为行键等同于哈希表类比中的键,所以确保行键的唯一性非常重要.如果你选择了一个基于非独特属性的行键,那么应用应该处理这种情况,而且只能通过唯一的行键把数据存入HBase中.

05-11 19:52