阅读声明:以下内容是结合网上材料及工作所写的个人理解,如有不当,欢迎大家指正~~~谢谢啦
一、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
历史数据不宜过多,会浪费很大的存储空间。