HBase的学习之路(一)

半腔热情 提交于 2019-11-26 00:00:47

阅读声明:以下内容是结合网上材料及工作所写的个人理解,如有不当,欢迎大家指正~~~谢谢啦

一、HBase的介绍

HBase的定义与作用

  HBase是一个分布式的、面向列非关系型(也就是基于key-value存储)的数据库

  HBase的作用:为HDFS提供低延迟的数据查询能力。

  注意:HBase不是计算型的框架,就是用于存储数据,提供低延迟的数据存储,所以MR(Hive)的计算功能是HBase替代不了的。

低延迟

  客户端读取的延迟时间要控制在秒级甚至是毫秒级给出响应;通过MapReduce或Hive也可以从HDFS中读取数据,但是MR或Hive的查询延迟一般在分钟级别。

    分析MR或者Hive其原理得知中间过程如下:

  ①手写复杂Hql--->②解析成MRJob--->③MRJob的任务分配---->④执行查询---->⑤返回结果

  时间大多数都消耗在①②③过程中(底层涉及大量磁盘IO

HBase的低延迟

  HBase之所以能做到低延迟的数据查询,是因为底层(后续会分析底层设计)充分利用了缓存机制,以及复杂的数据结构和精妙的算法来实现的。

二、HBase的特点

①分布式架构

    HBase是通过集群来存储数据,最终的数据还是会存储到HDFS中。

②面向列存储

  

  由上图我们可以分析:

    1)如果是基于行存储,数据在磁盘上存储是连续的。

    2)如果是基于列存储,数据在磁盘,存储是不连续。

    

    3)性能对比:

      ①写入性能:就衡量数据的写入次数,写入的次数越少,性能越高,因为磁盘的每一次写入,都要发生磁头调度,产生寻道时间。

             所以综上,行存储在数据写入上有优势,因为列存储会发生多次的磁盘随机写。

     ②读取性能:

        如果从数据的读取性能来比,比如读取整表还是行存储的性能高,因为会产生较少的磁盘I/O就可以读取整表数据,而列存储还是要产生较多的磁盘随机写。

        如果从数据的读取性能来比,比如读取特定列,列存储有明显的优势,因为不存在冗余列(数据)问题,而如果是行存储,就会存在冗余列(数据),消除冗余列的过程是有的(在内存里发生的);列存储这种优势,尤其是在海量数据查询时,会被成倍的放大,并且在生产环境下,查询的特点都是基于某些列来查询。

    4)基于列存储的优势

      ①因为每一列数据都是同质(同类型)的,可以避免类型间的频繁切换。

      ②因为每一列的数据同类型,可以采用更高效的压缩算法来压缩数据。

 三、HBase列族

  HBase是面向列存储的,列族的机制的目的是:减少数据写入次数,提高写入性能。

  注意:在创建HBase表,列族的数量不宜过多,应该将具有相近的I/O特性的列放到同一个列族下,避免跨列族的访问,比如:name和age列经常被一起查询或插入,就应该将这两列放到同一个列族。

    

    HBase表的列族是建表时指定的,而列在建表后插入数据时增加,不用担心列过多引起的存储代价提高的问题。因为针对一行数据,某一列没有数据,并不会占用磁盘的额外空间。因此一张HBase往往是稀疏的。

四、HBase的行键

   向HBase插入数据时,必须为每一行数据指定行键,具备唯一性。HBase本质就是基于Key-Value的存储系统,其中key:就是行键(rowKey),value:列族数据的集合。

   HBase会按RowKey做字典升序排序。

  

五、版本历史数据 

  HBase会存储历史版本数据,可以通过:scan   'tabname',{ROW=>true,VERSIONS=>3}来开启查询。

  其中VERSIONS=>3,表示来查看3个版本的数据(包含当前版本+历史版本=3)

  默认情况下,HBase最多能存储的版本数=3

  历史数据不宜过多,会浪费很大的存储空间。

  

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!