最近作项目接触到了HDFS、mapreduce以及Hbase,有了实战机会,今天打算将这些知识好好总结下,以备不时之需。首先从Hbase开始吧。redis
Hbase是创建在HDFS上的分布式数据库,下图是Hbase表的模型:mongodb
Hbase这个数据库其实和传统关系数据库仍是有不少相似之处,而不是像mongodb,memcached以及redis彻底脱离了表的概念,只不过hbase是以列为中心的数据库,而传统关系数据库则是以行为中心的数据库。不过hbase这个列并不是咱们传统意义的列,而是列族。列族是hbase最小的存储单位,换句话说hbase底层数据都是以列族来进行组织的。数据库
学习hbase我最大的收获我我的以为是对数据库的一种新的认识,数据库做用仍是快速的检索出咱们想要数据,也就是数据库的主要做用仍是为了实时查询,若是一个存储数据的系统检索数据的速度很慢,那么这个系统应该称之为数据仓库,hbase是一种数据库,是一种用来弥补传统关系数据库在海量数据中快速检索数据的能力不足。不过受制于持久存储系统的检索数据的速度以及海量数据存储是分散到各个服务器上,所以解决海量数据实时检索的方式只有根据实际的业务场景从新组织数据存储的模型,而且加上合理的索引来解决的。那么hbase是如何解决这个问题的呢?服务器
Hbase首先打破关系数据库里的避免数据冗余的机制,将常常须要一块儿查询的记录汇集在一块儿存储,例如商户的订单信息,这里咱们用order表明订单信息,orderId为订单号,spId为商品订单号,spNm为商品名字,num为数量其余字段就略去,在hbase里咱们能够把order定义为一个列族,orderId这些字段就是列的名字,在底层存储系统里咱们将order这个列族下全部的列数据汇集在一块儿存储,那么当咱们查询订单信息就能够直接找到这些汇集在一块儿的存储订单信息,那么就能够快速查询出订单信息。这一点相比关系数据库,关系数据库很难将一些常常查询出来的信息汇集在一块儿存储,这也就是hbase对于关系数据库的一大优点。这也就是为何hbase是围绕列族的数据库,由于列族就是将一些常常会被一块儿查询出来的数据的逻辑抽象,因此底层物理存储机制都是围绕列族进行,这也就是hbase里的hfile了,hfile是hbase物理存储的最小单位,而hfile都是按照列族汇集在一块儿的。负载均衡
前面我说道想要在海量数据下作到实时查询数据,一个要解决的问题就是如何将常常查询的数据汇集在一块儿存储,另外一个就是创建索引了,下面我就要讲讲hbase的索引是如何设计。Hbase的索引是靠rowkey完成,也就是行主键,仍是以商户订单为例,咱们经过设计列族将这些数据汇集在一块儿存储,可是实际查询里咱们常常会根据不一样商户,或者不一样商品查询订单信息,那么咱们就得要有手段能快速从汇集的订单信息里查询出所须要查询的订单信息,那么这时候就靠rowkey的做用了,在hbase物理存储里最小存储单位是hfile,hfile之上则是region,每一个region里汇集不少hfile(固然实际hbase底层存储比这个复杂,还有memstore,这是根据LSM存储原理设计,不过本文就以hfile表明整个列族存储),而region则是根据rowkey来进行构建和拆分的,换个说法就是region的名字或者代号就是rowkey,如今咱们回到订单的例子,咱们能够在rowkey的设计时候加入商户号,当用户查询时候能够根据商户号快速定位到region,而后再在region里进一步查找具体的列族信息,这样就完成了一个快速检索数据的目的。分布式
最近学习hbase一直有个问题困惑我,那就是为什么hbase的rowkey要按照字典顺序设计,而不是按顺序设计,这个疑惑的源头是不少hbase资料里说hbase是一个有利于顺序查询的数据库,那么rowkey设计为顺序格式不是更好吗?memcached
对于这个问题我其实还没彻底理解清楚,不过字典顺序也是一种顺序,在字典顺序之上仍是能够很好设计出按照数字顺序的rowkey,不过hbase的rowkey是有别于关系数据库的主键,关系数据库下,一个行的主键只能查询出一条数据,而hbase一个rowkey能查询出许多数据,所以对于实时查询而言rowkey的数字顺序相比关系数据库的行意义小的多。这两个缘由有点不痛不痒了,下面缘由是个很重要的缘由了,hbase里的region是hbase对客户端提供相关操做的单位,而rowkey是按照数字顺序排序,那么region则会根据顺序进行拆分,若是这个rowkey包含了时间因素,那么当大量客户端只作最近时间查询,就会致使时间最近那个region负载压力很大,为了达到负载均衡能力,咱们最好将客户端的查询分布在各个不一样的region上,那么咱们最好让不一样的region存储的数据应对查询是分布均衡的,而这个就是要靠rowkey设计实现的。无论怎么说hbase的使用里hbase的做用很关键。学习
时间匆忙今天写道这里,但愿本身研究完后能好好系统写几篇关系hbase的文章了。设计