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

常见的数据结构

B+树

根节点和枝节点非常easy,分别记录每一个叶子节点的最小值,并用一个指针指向叶子节点。 

叶子节点里每一个键值都指向真正的数据块。每一个叶子节点都有前指针和后指针,这是为了做范围查询时。叶子节点间能够直接跳转。从而避免再去回溯至枝和根节点。 

特点: 

1、有n棵子树的结点中含有n个keyword,每一个keyword不保存数据,仅仅用来索引,全部数据都保存在叶子节点。 

2、所有的叶子结点中包括了所有keyword的信息,及指向含这些keyword记录的指针。且叶子结点本身依keyword的大小自小而大顺序链接。 

3、全部的非终端结点能够看成是索引部分。结点中仅含其子树(根结点)中的最大(或最小)keyword。

缺点: 

通常数据量会非常大,磁盘中的数据採用这样的分页形式的话。就会比較多。非常有可能存储的数据在两个页表其中不连续。相隔非常远,这样的顺序查询的方式就会比較慢。 

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)) ,这一部分能够压缩存储。

在查询数据时,是以数据块为单位从硬盘load到内存。

查找数据时,是顺序的遍历该块中的keyValue对。

Meta Block 段 (可选的) 

–—保存用户自己定义的key-value对,能够被压缩。

比方booleam filter就是存在元数据块中的,该块仅仅保留value值,key值保存在元数据索引块中。每个元数据块由块头和value值组成。

能够高速推断key是否都在这个HFile中。

File Info 段 

–—-HFile的元信息,不被压缩。用户也能够在这一部分加入自己的元信息。

Data Block Index 段 

—-–Data Block的索引,每条索引的key是被索引的block的第一条记录的key(格式为:头信息。(数据块在文件里的偏移 + 数据块长 + 数据块的第一个key)。(数据块在文件里的偏移 + 数据块长 + 数据块的第一个key),……..)。

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,随之而来的开销当然是须要花费cpu进行压缩和解压缩。

目标Hfile的压缩支持两种方式:Gzip,Lzo。

StoreFile格式

 

每一个Strore又由一个memStore和0至多个StoreFile组成。

StoreFile以HFile格式保存在HDFS上。

KeyValue对象格式

The KeyValue格式:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">Keylength
valuelength
key
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

当中keylength和valuelength都是整型,表示长度。 

而key和value都是byte数据。key是有固定的数据。而value是raw data。Key的格式例如以下。

The Key format:

<code class="hljs erlang has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">rowlength
<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-title" style="box-sizing: border-box;">row</span> <span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(i.e., the rowkey)</span>
<span class="hljs-title" style="box-sizing: border-box;">columnfamilylength</span>
<span class="hljs-title" style="box-sizing: border-box;">columnfamily</span>
<span class="hljs-title" style="box-sizing: border-box;">columnqualifier</span>
<span class="hljs-title" style="box-sizing: border-box;">timestamp</span>
<span class="hljs-title" style="box-sizing: border-box;">keytype</span></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>

keytype有四种类型,各自是Put、Delete、 DeleteColumn和DeleteFamily。

HBase数据存储格式的更多相关文章

  1. BigData NoSQL —— ApsaraDB HBase数据存储与分析平台概览

    一.引言 时间到了2019年,数据库也发展到了一个新的拐点,有三个明显的趋势: 越来越多的数据库会做云原生(CloudNative),会不断利用新的硬件及云本身的优势打造CloudNative数据库, ...

  2. HBase 数据读写流程

    HBase 数据读写流程 2016-10-18 杜亦舒 读数据 HBase的表是按行拆分为一个个 region 块儿,这些块儿被放置在各个 regionserver 中 假设现在想在用户表中获取 ro ...

  3. Hive 实现HBase 数据批量插入

    HBase 数据的插入可以使用Java API 来写Java 程序逐条倒入,但是不是很方便.利用Hive自带的一个Jar包,可以建立Hive和HBase的映射关系 利用Hive 的insert可以将批 ...

  4. HBase数据导出到HDFS

    一.目的 把hbase中某张表的数据导出到hdfs上一份. 实现方式这里介绍两种:一种是自己写mr程序来完成,一种是使用hbase提供的类来完成. 二.自定义mr程序将hbase数据导出到hdfs上 ...

  5. HBase 学习之一 <<HBase使用客户端API动态创建Hbase数据表并在Hbase下导出执行>>

    HBase使用客户端API动态创建Hbase数据表并在Hbase下导出执行                       ----首先感谢网络能够给我提供一个开放的学习平台,如果没有网上的技术爱好者提供 ...

  6. 怎样将关系型数据表转换至hbase数据表

    首先须要把关系型数据库的数据表的数据添加由 "纵向延伸",转变为HBase数据表的"横向延伸" 一.Hbase的存储结构 a)      HBase以表(HTa ...

  7. HBase数据同步ElasticSearch该程序

    ElasticSearch的River机械 ElasticSearch本身就提供了River机械,对于同步数据. 在这里,现在能找到的官方推荐River: http://www.elasticsear ...

  8. HBase数据备份及恢复(导入导出)的常用方法

    一.说明 随着HBase在重要的商业系统中应用的大量增加,许多企业需要通过对它们的HBase集群建立健壮的备份和故障恢复机制来保证它们的企业(数据)资产.备份Hbase时的难点是其待备份的数据集可能非 ...

  9. 【原创】大叔经验分享(25)hive通过外部表读写hbase数据

    在hive中创建外部表: CREATE EXTERNAL TABLE hive_hbase_table(key string, name string,desc string) STORED BY ' ...

随机推荐

  1. javaku快捷键

    Eclipse 的编辑功能非常强大,掌握了 Eclipse 快捷键功能,能够大大提高开发效率.Eclipse 中有如下一些和编辑相关的快捷键. 1. [ALT+/] 此快捷键为用户编辑的好帮手,能为用 ...

  2. 【转】理解RESTful架构

    [转]理解RESTful架构 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时( ...

  3. Struts+Tomcat搭建

    Struts+Tomcat搭建 tomcat使用(服务器端开发): 如果要安装Tomcat需要进行的配置:tomcat安装在c: \Tomcat CATALINA_HOME变量值设为: H:\Prog ...

  4. [转]如何从MySQL官方Yum仓库安装MySQL5.6

    参考博文: 如何从MySQL官方Yum仓库安装MySQL5.6 Centos 升级Mysql版本或者Yum安装Mysql5.6 2013年10月,MySQL开发团队正式宣布支持Yum仓库,这就意味着我 ...

  5. django中tag的用法

    在app里建一个子的python包,包含__init__.py,包名为templatetags,里面新建一个tags.py(这个名字可以随意) from django import templater ...

  6. CSS基础3——使用CSS格式化元素内容的字体

    1.CSS属性单位: (1)长度单位:包含绝对长度单位和相对长度单位 绝对长度单位包含:cm.mm.in.pt.pc等. 绝对长度单位最好用于打印输出设备.在仅作为频幕显示时.绝对长度值并没有什么意义 ...

  7. CSipSimple最新版本号(二)--加入视频功能

    前面我们编译好了最新版本号的CSipSimple,并且測试已经能够打电话了.如今要把视频功能加上去. 不知道怎么编译的,能够看我的上一篇博文:CSipSimple最新版本号 我们先来看一下之前的项目是 ...

  8. 【转载】openCV轮廓操作

    声明:非原创,转载自互联网,有问题联系博主 1.轮廓的提取 从图片中将目标提取出来,常常用到的是提取目标的轮廓. OpenCV里提取目标轮廓的函数是findContours(), 它的输入图像是一幅二 ...

  9. 分析一个socket通信: server/client

    分析一个socket通信: server/client1 server 1. 创建一个server_socket文件,并绑定端口,然后监听端口 (socket, bind, listen) 2. 查询 ...

  10. Arduino 入门程序示例之直流电机(2015-06-15)

    概述 演示直流电机的控制. 示例程序 PWM控制直流电机 略过控制电机转停的示例啦,有需要就把这里的 PWM 换成数字口输出 HIGH 或 LOW 就行了. // ------------------ ...