HBase内部,单元格Cell的实现为KeyValue,它是HBase某行数据的某个单元格在内存中的组织形式,由Key Length、Value Length、Key、Value四大部分组成。其中,Key又由Row Length、Row、Column Family Length、Column Family、Column Qualifier、Time Stamp、Key Type七部分组成。在HBase1.0.2版本中,它的结构如图:
从左到右,依次为:
1、Key Length:存储Key的长度,占4B;
2、Value Length:存储Value的长度,占4B;
3、Key:由Row Length、Row、Column Family Length、Column Family
3.1、Row Length:存储Row的长度,即rowkey的长度,占2B;
3.2、Row:存储Row实际内容,即Rowkey,其大小为Row Length;
3.3、Column Family Length:存储列簇Column Family的长度,占1B;
3.4、Column Family:存储Column Family实际内容,大小为Column Family Length;
3.5、Column Qualifier:存储Column Qualifier对应的数据,既然key中其他所有字段的大小都知道了,整个key的大小也知道了,那么这个Column Qualifier大小也是明确的了,无需再存储其length;
3.6、Time Stamp:存储时间戳Time Stamp,占8B;
3.7、Key Type:存储Key类型Key Type,占1B,Type分为Put、Delete、DeleteColumn、DeleteFamilyVersion、DeleteFamily等类型,标记这个KeyValue的类型;
4、Value:存储单元格Cell对应的实际的值Value。
下面,我们看下HBase中KeyValue是如何实现的。在KeyValue中,有三个十分重要的变量,如下:
// KeyValue core instance fields.
// KeyValyeh核心实例存储域
// KeyValue相关的不变byte[]数组,存储KeyValue实际内容
protected byte [] bytes = null; // an immutable byte array that contains the KV
// KeyValue在数组bytes的起始位置
protected int offset = 0; // offset into bytes buffer KV starts at
// KeyValue在数组bytes自起始位置offset后的长度
protected int length = 0; // length of the KV starting from offset.
KeyValue内容是存储在byte[]数组bytes中的,它是一个不变的byte[]数组,而存储的起始位置与长度,则分别由offset和length标识。
下面,我们看下KeyValue中获取Key Length、Value Length、Row Length、Column Family、Value等等相关字段的方法,来验证下我们上面罗列出的KeyValue结构。
1、Key Length
/**
* @return Length of key portion.
*/
public int getKeyLength() {
// 从KeyValue底层byte[]数组bytes中位置offset开始,获取一个int,也就是4B
return Bytes.toInt(this.bytes, this.offset);
}
getKeyLength()方法用于获取KeyValue中Key长度Key Length,它从KeyValue底层byte[]数组bytes中位置offset开始,获取一个int,也就是4B,这也就验证了我们上面说的,KeyValue中第一个是Key Length,大小为4B。