HBase1.2.3版本存储结构分析

一、Hbase能做什么

   1、海量数据存储(几百亿的行+上百亿列)

   2、检索数据(get,scan,scan range)------>准实时(毫秒,秒级别)

 特点:

   1、伸缩性强:数据量在无法预估的情况下增大,比如使用MySQL,大到一定程度,添加机器,使用mysql集群做读写分离,然后分库分表,复杂度增大很多,而hbase只需要简单的添加一台机器就可实现负载均衡。

   2、成本低:一般的pc-server即可,只要内存大一点价钱2-3w,像mysql/oracle这样的内存稍微大点估计几十上百W

   3、高可靠:hdfs副本机制

二、应用场景

    1、账单数据(话费账单,银行交易账单)

    2、游戏数据

    3、电商交易数据

    4、。。。。。。

三、数据模型

  Table

     Column family

       Column01,Column02,............

    每条数据有唯一的标识符 Rowkey  主键

    面向列的数据库

     Rowkey + Columnfamily+Column+timestamp ==  value

   多版本:默认3个版本,查询可指定只查一个版本

   行健(Row Key):表的主键,表中的记录默认按照行健升序排序 。

   时间戳(Timestamp):每次数据操作对应的时间戳,可以看作是数据的版本号。

   列族(Column Family):表在水平方向有一个或者多个列族组成,一个列族中可以由任意多个列组成,列族支持动态扩展,无需预先定义列的数量以及类型,所有列均以二进制格式存储,用户需要自行进行类型转换。所有的列族成员的前缀是相同的,例如“abc:a1”和“abc:a2”两个列都属于abc这个列族。

    表和区域(Table&Region):当表随着记录数不断增加而变大后,会逐渐分裂成多份,成为区域,一个区域是对表的水平划分,不同的区域会被Master分配给相应的RegionServer进行管理

   单元格(Cell):表存储数据的单元。由{行健,列(列族:标签),时间戳}唯一确定,其中的数据是没有类型的,以二进制的形式存储。

四、和RDMS对比 

   1、存储方式:mysql(以mysql为例)是行式存储,hbase是列式存储。

   2、关系型数据库在建表时,已经规定了字段的类型,长度,在查询的时候,假设有100个字段,你只需要其中的5个,它也是将这100个字段读取后加载到内存然后过滤返回这5个字段的数据。而Hbase里面可以将查询频繁的条件放到一个列簇里面,其他条件放到另一个列族里面,底层在存的时候,不同的列族实际是在Region的不同的文件当中,这样查询的时候只需要打开包含有这几个查询条件的列族文件即可,减少了IO。

   3、关系型数据库再插入字段时,如果字段为null也会占用空间,因为要预留空间给后续数据的插入,而Hbase不会,如果某个列没有值,就不会存储不会占空间。

五、Hbase的优缺点

    技术的优缺点都是仁者见仁智者见智,主要谈谈我的理解。

优点:

    1、 列的可以动态增加,并且列为空就不存储数据,节省存储空间.

    2 、Hbase自动切分数据,使得数据存储自动具有水平可扩展.

    3 、Hbase提供高并发读写操作的支持。

 缺点:

  1、 不能支持条件查询,只支持按照Row key来查询,目前只能get、scan或者scan range。

  2、 不支持跨行事物,只支持单行事物

   3、 没有二级索引,当然可以自己建二级索引(自己建一张索引表,或者利用solr等外部技术实现)

六、存储结构:

     Hbase在水平方向上,随着数据的越来越多,会切分为多个HRegion,而在列方向上,是按照列族在分,不同的列族存储在不同的HFile文件里面

      一个Hmaster对应多个HRegionServer,多个HRegionServer之间的负载均衡由Hmaster来保障,各个HRegionServer的上线下线都通过监听zk实现

   

 

    一个HRegionServer对应多个HRegion,HRegion由HMaster分配到相应的HRegionServer中,然后由HRegionServer负责HRegion的启动和管理,和Client的通信,负责数据的IO



 

    一个HRegion下有多个Store,分别存储表的不同列簇,而每个Store由一个memStore写缓存和多个StoreFile文件组成,StoreFile底层是以HFile的格式存储

 

 

七、系统架构

        因为网上有很多介绍hbase架构相关的,这里我就不详细介绍了,下面的架构图来源于百度图片。

 
  7.1 HRegionServer

      HRegionServer是真正处理hbase-io操作的节点,通常一个hbase集群有多个HregionServer,而每个HRegionServer有多个HRegion,一般情况下,HRegionServer由以下几部分组成:HRegion,WAL,BlockCache

    7.1.1 WAL

       WAL叫预写日志,每次写请求过来,首先会写WAL文件,然后在写memstore,只有都写成功了才会返回给客户端,WAL可以保障当HRegionServer宕机的情况下数据的完整性,宕机之后,从该WAL获取日志开始进行数据恢复,当前版本的hbase已经支持WAL并行写,也就是说一个HRegionServer上有多个WAL,WAL如果过大,会触发flush操作已减少WAL的大小。可以配置是一个HRegionServer只有一个WAL还是每个HRegion自己维护一个。如果是所有HRegion共享一个WAL,数据写入会很方便,只需要往这个WAL append即可, 而多个HRegion对应多个WAL的化,如果并发大了,多个WAL同时写,会增加文件的寻址时间。当HRegionServer宕机的时候,WAL用来恢复数据,如果只有一个WAL那么就需要进行拆分操作,保证WAL里面的数据是按照HRegion为单位拆分的,而如果多个HRegion自己维护自己的WAL,那么在故障恢复的过程中,就没有了拆分过程。所以二者选择需要自己抉择,个人建议一个HRegionServer有一个WAL就行了。

    7.1.2 BlockCache

       BlockCache是读缓存,HBase中提供两种BlockCache的实现:默认on-heap LruBlockCache和BucketCache(通常是off-heap)。通常BucketCache的性能要差于LruBlockCache,然而由于GC的影响,LruBlockCache的延迟会变的不稳定(LruBlockCache由jvm管理),而BucketCache由于是自己管理BlockCache,而不需要GC,因而它的延迟通常比较稳定,这也是有些时候需要选用BucketCache的原因。

   7.1.3 HRegion

      HRegion是在HRegionServer上进行启动和管理,一个HRegionServer可以有多个HRegion,在上面我们提到,每个HRegion是一个table按照rowkey行方向分割后而成,一张表在新建时,没有数据,这个时候只有一个HRegion,这个HRegion就是这张表的第一个region,第一个region没有startRowkey,随着数据越来越多,达到这个HRegion的阀值,就会进行Region拆分,不同的HRegion会分布在不同的HRegionServer上,但是一个HRegion是不会拆分到多个server上的。

     一个HRegion由多个HStore组成,每个HStore分布对应存储每个table的column family,也就是说如果一个table有2个column family,假设它在同一个Hregion上,那么就会分配2个Hstore来存储这2个column family。

     一个HStore又由1个memstore和N个Hfile组成,HFile保存在HDFS上。

   7.1.4 Hfile

      Hfile是底层的存储文件,这块东西必须多,涉及数据存储,索引等,关于这块的内容请关注后续的文章。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值