IT技术互动交流平台

HBase数据存储格式

来源:IT165收集  发布日期:2015-07-05 21:55:30

好的数据结构,对于检索数据,插入数据的效率就会非常高。

常见的数据结构

B+树

根节点和枝节点很简单,分别记录每个叶子节点的最小值,并用一个指针指向叶子节点。
叶子节点里每个键值都指向真正的数据块,每个叶子节点都有前指针和后指针,这是为了做范围查询时,叶子节点间可以直接跳转,从而避免再去回溯至枝和根节点。

特点:
1、有n棵子树的结点中含有n个关键字,每个关键字不保存数据,只用来索引,所有数据都保存在叶子节点
2、所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
3、所有的非终端结点可以看成是索引部分,结点中仅含其子树(根结点)中的最大(或最小)关键字。

缺点:
通常数据量会很大,磁盘中的数据采用这种分页形式的话,就会比较多。很有可能存储的数据在两个页表当中不连续,相隔很远,这种顺序查询的方式就会比较慢。
B+树最大的性能问题是会产生大量的随机IO。随着新数据的插入,叶子节点会慢慢分裂,逻辑上连续的叶子节点在物理上往往不连续,甚至分离的很远但做范围查询时,会产生大量读随机IO。
对于大量的随机写也一样,举一个插入key跨度很大的例子,如7->1000->3->2000 … 新插入的数据存储在磁盘上相隔很远,会产生大量的随机写IO。从上面可以看出,低下的磁盘寻道速度严重影响性能。

LSM树


为了更好的说明LSM树的原理,下面举个比较极端的例子:
现在假设有1000个节点的随机key,对于磁盘来说,肯定是把这1000个节点顺序写入磁盘最快,但是这样一来,读就悲剧了,因为key在磁盘中完全无序,每次读取都要全扫描;

那么,为了让读性能尽量高,数据在磁盘中必须得有序,这就是B+树的原理,但是写就悲剧了,因为会产生大量的随机IO,磁盘寻道速度跟不上。
LSM树本质上就是在读写之间取得平衡,和B+树相比,它牺牲了部分读性能,用来大幅提高写性能。

它的原理是把一颗大树拆分成N棵小树, 它首先写入到内存中(内存没有寻道速度的问题,随机写的性能得到大幅提升),在内存中构建一颗有序小树,随着小树越来越大,内存的小树会flush到磁盘上。当读时,由于不知道数据在哪棵小树上,因此必须遍历所有的小树,但在每颗小树内部数据是有序的

HBase数据存储格式

HBase引入了LSM树的概念,即Log-Structured Merge-Trees。

HFile格式



HFile分为六个部分:
Data Block 段
—–保存表中的数据,这部分可以被压缩。每一个数据块由块头和一些KeyValue组成,key的值是严格按照顺序存储的。块大小默认为64K(由建表时创建cf时指定或者HColumnDescriptor.setBlockSize(size)) ,这一部分可以压缩存储。
在查询数据时,是以数据块通ky"http://www.it165.net/qq/" target="_blank" class="keylink">qq1pc67tNPTssXMbG9hZLW9xNq05qGjsunV0sr9vt3KsaOsysfLs9DytcSx6cD6uMO/6dbQtcRrZXlWYWx1ZbbUoaM8L3A+CjxwPjxzdHJvbmc+TWV0YSBCbG9jayC2ziAov8nRobXEKTwvc3Ryb25nPjxiciAvPgombmRhc2g7Jm1kYXNoO7GjtObTw7un19S2qNLltcRrZXktdmFsdWW21KOsv8nS1LG70bnL9aGjILHIyOdib29sZWFtIGZpbHRlcr7Nyse05tTa1KrK/b7dv+nW0LXEo6y4w7/p1ruxo8H0dmFsdWXWtaOsPHN0cm9uZz5rZXnWtbGjtObU2tSqyv2+3cv30v2/6dbQPC9zdHJvbmc+oaM8c3Ryb25nPsO/0ru49tSqyv2+3b/p08m/6c23us12YWx1Zda11+mzyTwvc3Ryb25nPqGjv8nS1L/sy9nF0LbPa2V5yse38ba81NrV4rj2SEZpbGXW0KGjPC9wPgo8cD48c3Ryb25nPkZpbGUgSW5mbyC2zjwvc3Ryb25nPjxiciAvPgombmRhc2g7Jm1kYXNoOy1IRmlsZbXE1KrQxc+io6yyu7G70bnL9aOs08O7p9Kyv8nS1NTa1eLSu7K/t9bM7bzT19S8urXE1KrQxc+ioaM8L3A+CjxwPjxzdHJvbmc+RGF0YSBCbG9jayBJbmRleCC2zjwvc3Ryb25nPjxiciAvPgombWRhc2g7LSZuZGFzaDtEYXRhIEJsb2NrtcTL99L9o6w8c3Ryb25nPsO/zPXL99L9tcRrZXnKx7G7y/fS/bXEYmxvY2u1xLXa0rvM9bzHwry1xGtleTwvc3Ryb25nPqOouPHKvc6qo7rNt9DFz6KjrKOoyv2+3b/p1NrOxLz+1tC1xMar0sYgKyDK/b7dv+mzpCArIMr9vt2/6bXEtdrSu7j2a2V5o6mjrKOoyv2+3b/p1NrOxLz+1tC1xMar0sYgKyDK/b7dv+mzpCArIMr9vt2/6bXEtdrSu7j2a2V5o6mjrCZoZWxsaXA7JmhlbGxpcDsuLqOpoaM8YnIgLz4KPGltZyBhbHQ9"" src="http://www.it165.net/uploadfile/files/2015/0705/20150705150407775.png" title="" />

Meta Block Index段 (可选的)
–Meta Block的索引。 该块组成格式同数据块索引,只是某部分的意义不一样。

Trailer
–—这一段是定长的。保存了每一段的偏移量,读取一个HFile时,会首先读取Trailer,Trailer**保存了每个段的起始位置**(段的Magic Number用来做安全check),然后,DataBlock Index会被读取到内存中,这样,当检索某个key时,不需要扫描整个HFile,而只需从内存中找到key所在的block,通过一次磁盘io将整个 block读取到内存中,再找到需要的key。DataBlock Index采用LRU机制淘汰。

说明如下:

1、 FileInfo Offset – FileInfo信息在HFile中的偏移。long(8字节)。
2、 DataIndex Offset – 数据块索引在HFile中的偏移。long(8字节)。
3、 DataIndex Count – 数据块索引的个数。int(4字节)。
4、 MetaIndex Offset – 元数据索引块在HFile中的偏移。long(8字节)。
5、 MetaIndex Count – 元数据索引块的个数。int(4字节)。
6、 TotalUncompressedBytes – 未压缩的数据块部分的总大小。long(8字节)。
7、 Entry Count – 数据块中所有cell(key-value)的个数。int(4字节)
8、 Compression Codec – 压缩算法为enum类型,该值表示压缩算法代码。(LZO-0,GZ-1,NONE-2),int(4字节)
9、 Version – 版本信息。当前该版本值为1. int(4字节)。

HFile的Data Block,Meta Block通常采用压缩方式存储,压缩之后可以大大减少网络IO和磁盘IO,随之而来的开销当然是需穴ky"http://www.it165.net/qq/" target="_blank" class="keylink">qq7qLfRY3B1vfjQ0NG5y/W6zb3i0bnL9aGjxL+x6khmaWxltcTRucv11qez1sG91ta3vcq9o7pHemlwo6xMem+hozwvcD4KPGg0IGlkPQ=="storefile格式">StoreFile格式


每个Strore又由一个memStore和0至多个StoreFile组成。
StoreFile以HFile格式保存在HDFS上。

KeyValue对象格式

The KeyValue格式:

Keylength
valuelength
key
value

其中keylength和valuelength都是整型,表示长度。
而key和value都是byte数据,key是有固定的数据,而value是raw data。Key的格式如下。

The Key format:

rowlength
row (i.e., the rowkey)
columnfamilylength
columnfamily
columnqualifier
timestamp
keytype

keytype有四种类型,分别是Put、Delete、 DeleteColumn和DeleteFamily。

 

Tag标签: 格式   数据  
  • 专题推荐

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规