HBase存储原理详解

HBaseHadoop一个分布式,可扩展的大数据存储的数据库。特点是可以对大数据进行随机,实时的读/写访问。

其实HBase的来源可以追溯到一篇论文"Bigtable: A Distributed Storage System for Structured Data"有兴趣同学可以去看看这篇文章

HBaseNoSQL,整个HBase可以简单看作一个‘Bigtable’。说到分布式存储,就可以说它是将大表拆分来存储。如下图1一张表,拆分为6部分来存储。但是HBase可不是随意拆分的,是按照列簇行键(row key)来切分表的。

图1

先介绍一些概念,然后我们再回头来细说上图1。

(1)Name Space

命名空间,类似关系型数据库的database的概念。命名空间下可以有很多张表,HBase有两个自带的命名空间,分别为hbasedefault,hbase存放的是HBase内置的表,default表示用户默认使用的命名空间。

   hbase(main):001:0 > list_namespace
(2)Region

类似关系型数据库的表的概念,不同点是,HBase定义表的时候只需要声明列簇就好,不需要声明具体的。所以往HBase写入数据,字段可以按需,动态指定。

 #create '表名', '列簇1', '列簇2'...
 hbase(main):001:1 > create 'person','personal_info', 'office_info'
 # 插入数据 put '表名','rowkey','列簇名:列名','值'
 hbase(main):001:2 > put 'person','0001','personal_info:name', '张三'
(3)Row

HBase表的每一行由RowKey和多个数据组成,数据按照RowKey的字典顺序存储的,并且查询数据时只能根据RowKey检索,RowKey的设计很重要。

(4)Column

HBase表的每一列都由列簇列限定符进行限定,例如:personal_info:name,office_info:tel。建表的时候只需声明列簇就好,而列限定符无需预先定义。

(5)Time Stamp

时间戳,用于标识数据的不同版本,每一条数据写入时,若不指明具体时间戳,系统会自动为其加上这个字段,其值为写入HBase时当前系统的时间。

(6)Cell

{rowkey,column Family : column Qualifier,time Stamp}({行建,列簇:列限定符,时间戳})唯一确定的单元。cell中数据没有类型,全以字节码形式存储。


回头看图1,从图中可以看得出

  • 列簇:personal_info,office_info
  • RowKey:row_key1,row_key11,row_key2....,row_key7,每个row_key所在行就是一条行(row)数据。
  • Region:虽然这个表分6块存储,但是region是包含完整的行数据的。如图中row_key3,row_key4,row_key5的数据。
  • Store:表示实际存储在集群的数据,列簇和列限定符是元数据信息,一般存储在内存。

HBase的逻辑存储就是图1所示的存储方式,接下来看看HBase的物理存储,即针对某一条数据怎么存储的。

图2

就拿personal_info这个列簇来说,row_key1的数据在HBase是如上图中下方表格所示,其中每个行就是一个cell。因为是row_key1的数据,所以他们的RowKey都是row_key1column Family是列簇,都是属于personal_info这个列簇;column Qualifier是列限定符,分别是列簇中的列名;Time Stamp是时间戳,就是对其操作的时间;type是代表操作的方式:put(包括添加,修改)delete(删除)value是操作后的值。上图可以看到有两条对列"phone"的操作,但value不一样,这时候就根据TimeStamp的先后来判定它的值,它的值为最近时间操作的那个值。

(文中插图1和图2为某个视频的截图,个人认为这两个图很有代表性就拿过来用了,若存在侵权,请告知作者,谢谢!)
作者最近在学习大数据相关的技术知识,所以就分享一些自己的学习笔记,希望和大家一起讨论,一起进步!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。