HBase是一个分布式的、可扩展的、高容错性的,可以用于存储海量数据的数据库,对于存储半结构化、非结构化数据优势明显。

相比于传统的数据库,HBase有以下几点优势:

1.传统的数据库比如mysql,是以行存储的,数据一行一行的存储,如果要读出数据中的某一列,就必须读出一整行的数据,如果每一行的数据非常的大那么则会读出很多不必要的数据。HBase是基于列存储的数据库,每一列的数据是存储在一起的,HBase的列族数量是固定的,但是HBase的列的数量是可以随意增长的,这就意味着如果在存储某行数据的时候需要添加一个新的列,直接指定某列加入到某个列族,然后存入数据就行了,这是因为在HBase里面查找一条指定的数据是通过键值对应来查找的,键为<rowkey,column family,column ,timestamp>,值为数据.

2.传统的数据库中,如果某一行的值没有指定一般会指定默认值或者设置为空值,这样会造成存储空间的浪费,而在HBase中,没有值的列就不存储任何值,节省了很多空间。

3.HBase是可以动态扩展的,如果存储空间不够了,只需要在集群里面添加新的服务器即可,而传统的数据库还需要做很多的额外工作。HBase在某个表行的数量过多的时候会自动拆分成多个Region,而在传统数据库中这些操作只能认为的指定。

4.HBase更新值并不会立即删除之前的值,所以可以保存多个版本的历史值。

但是HBase也有一些缺点:

1.       HBase 写入的时候使用会先将数据写入缓存当中,这样做的效果就是写入一条数据非常的快,但是造成的损失就是读性能降低,因为读数据的时候会在内存和文件系统中同时查找要查询的数据是否存在,然后对查询的结果进行合并,最后的结果将返回给用户。当然HBase提供了一个小的解决方案就是,在RegionServer上设置block cache来缓存用户读取的数据,block cache缓存使用的换入换出算法是LRU,这样能够保证经常读取的数据能保存在内存中比较久。

2.       HBase需要使用很大的内存,所以对gc来说很麻烦。

HBase的架构如下:

Zookeeper 的主要作用是:

1.       进行选举保证集群中只有一个Mater。

2.       将Region Server的上下线信息通知Master

3.       存储-ROOT-表的寻址入口

4.       存储HBase的schema,包括有哪些表和每个表有哪些列族

Master的主要作用是:

1.       负责给Regoin Server分配Region

2.       负责Region Server的负载均衡

3.       Region Server故障之后对Region Server的Region分配到其它Region Server

4.       HDFS上的垃圾回收

5.       处理schema更新请求

Region Server的主要作用:

1.       负责Region相关的IO操作

2.       对过大的Region进行split

HFile的compaction过程

Region的split过程

HBase的一次查询操作:

首先客户端会给出相应的<rowkey,columnfamily ,column>,请求发送到HBas集群之后,会在zookeeper里面查询-ROOT-表的位置,然后去某个Region Server找到-ROOT-表,-ROOT-表的rowkey为<.META.,<用户表名,Region的起始rowkey,ts>,ts>,根据客户端请求的rowkey,通过比较-ROOT-表中最大的那个小于等于<用户表名,rowkey>的rowkey,那么这就是我们要找的那个Region,同理在.META.表里面也是这样的一个过程。经过三次寻址之后就能找到数据,然后把经过归并排序之后的结果返回给客户端。查询之后的数据会放在block cache之中方便下次读取加快速度。

HBase的一次写入操作:

客户端一般会将数据先缓存在客户端的Write Buffer中(一般Write Buffer大小为2M左右),这样写入的数据会达到一定大小再与服务器通信,减少了通信造成的开销,Write Buffer有三种情况会提交给Region Server

(1)    Write Buffer 满

(2)    手动调用HTable.flushCommits()方法

(3)    客户端关闭

客户端的数据发送到服务器之后,首先根据表名和rowkey进行寻址,查找到可以写入的那个RegionServer,首先把数据变动写入到HLog之中,这样可以防止服务器异常终止之后memstore中的数据丢失造成不良后果。然后将数据写入到指定的Region的memstore,因为是直接写入内存而不是写入文件,所以速度非常的快。于是数据存储在memstore之中,memstore如果达到了一定的大小(hbase.hRegion.memstore.flush.size),memstore的内容就会刷新写入(flush)到Hfile中去,这时候会创建一个新的memstore来接收客户端的读请求,然后原先的memstore将内容flush到HFile中去,之后将旧memstore释放。

这就是我对HBase的初步认识,下一步计划是HBase中实际的存储读取数据,阅读源代码,深入对HBase的理解。

对HBase整个框架的理解相关推荐

  1. Java面试之五大框架的理解

    五大框架(springMVC,struts2,spring,mybatis,hibernate) 说说你对springMVC框架的理解? 简要口述(如果感觉说的少可以在完整答案里面挑几条说) Spri ...

  2. CodeIgniter框架深入理解

    . CodeIgniter框架深入理解 1.CodeIgniter是一个小巧但功能强大的 PHP 框架,作为一个简单而"优雅"的工具包,它可以为 PHP 程序员建立功能完善的 We ...

  3. 【面试常问】谈谈你对集合框架的理解?

    谈谈你对集合框架的理解? 在面试中被问到这个问题该咋么回答呢?这个问题是我认为最难回答的一个问题,原因就他问的范围太大了不知道该咋么回答:就我而言遇到这种问题首先给他说个总的,从最大的开始说起,在说一 ...

  4. 关于对FLASH开发,starling、starling feathers、starling MVC框架的理解

    说在前头:楼主之前没有不论什么flash开发经验,仅仅是从一次尝试中总结自己的理解和经验而已.假设有写的不正确的地方,欢迎大家指正. 前一段时间尝试想用flash(as3)又一次制作一下之前做的一个游 ...

  5. vue事件总线_[面试] 聊聊你对 Vue.js 框架的理解

    作者:yacan8 https://github.com/yacan8/blog/issues/26 本文为一次前端技术分享的演讲稿,所以尽力不贴 Vue.js 的源码,因为贴代码在实际分享中,比较枯 ...

  6. Linux总线设备驱动框架的理解(非常棒的文章!)

    以下内容源于微信公众号:嵌入式企鹅圈.有格式内容上的修改,如有侵权,请告知删除. Linux的设备驱动框架,即某类设备对应的驱动的框架. 这里是"Linux总线设备驱动框架",应该 ...

  7. java中对于框架的理解_接触Java项目一周后对一些基本框架的理解 | 学步园

    最近一周接触了一个Java EE的B/S项目,里面用到了SSH,部分持久层用的是ibatis,接触完后觉得有收获,于是把认识到的记录下来.同时欢迎高手拍砖. 现在终于知道所谓的三层框架(视图层,业务逻 ...

  8. PureMVC游戏框架解析 理解其中包含的设计模式

    作者:吴秦 出处:http://www.cnblogs.com/skynet/ 本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名吴秦(包含链接). 参考 ...

  9. 关于Vue渐进式框架的理解

    前言 当你打开vue的官网介绍,第一句就是"vue是一套用于构建用户界面的渐进式框架".是否有点顾名思义?什么是渐进式框架,什么是自底向上逐层应用呢?于是便有了这篇文章. Vue框 ...

最新文章

  1. 写得太好了!树莓派安装docker
  2. newlisp 接受jenkins带空格的参数
  3. MNN通用端侧深度学习预测框架介绍
  4. Android开发二 什么是Android
  5. Java中的守护线程和非守护线程(转载)
  6. python调用mysql数据库sql语句过长有问题吗_python操作mysql数据库,一次性执行多条语句不执行...
  7. mysql中ibdata1过大的问题
  8. 学习,才是最好的投资~
  9. ValidationKey
  10. swustoj水王C语言,swust西南科技大学OJ数据结构80题答案
  11. 解析数论引论 第2章 数论函数和狄利克雷乘积
  12. docker安装时报服务失败,因为控制进程退出并带有错误代码
  13. 百度搜索关键词自动提交
  14. maven 为html赋版本号,maven-replacer-plugin 静态资源版本号解决方案(css/js等)
  15. 华为云服务部署Rstudio Server
  16. java中定义数组的3种方式
  17. 麒麟合盛(APUS)李涛:APUS云重新定义“云联邦”
  18. pyepics Device:PVs的集合
  19. 鼠标移动到的地方一直往右移动的解决办法
  20. 数据库-jdbc、spring-jdbc、spring-boot-starter-jdbc

热门文章

  1. 知情人士:比特大陆创始人吴忌寒离开核心纯属谣言
  2. 观复嘟嘟:职场是个技术活-马未都
  3. hdl语言哪种语言类似c,Verilog HDL笔记
  4. 硬盘 U盘 的SN 号码 javascript 读取 PID,VID,SN信息
  5. 芸芸众生中的一个过客
  6. WinForm 显示图片PictureBox控件
  7. 【美多商城项目01】了解主要需求和架构设计,创建配置工程
  8. 冬季12种食物减肥巧妙止饿
  9. angularJS学习小结——filter
  10. 设备更新,工作室搬迁