这篇文章主要讲解了“HBase概念有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“HBase概念有哪些”吧!
HBase概述
HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库。
1)数据量越大,HBase的查询优势越明显。数据量小的话,HBase不划算,因为启动的东西过多,整体内存消耗大,正常过程中要不断的切分和合并,一直都在放生。但是当数据量非常大的时候,上几条数据的秒级查询是可以做到的。
2)HDFS不支持随机写操作,Hbase是基于HDFS的,HBase是数据库所以必然需要增删改查的随机读写操作。言下之意是,HBase支持在HDFS上的随机写操作。
HBase数据模型
逻辑上,HBase的数据模型同关系型数据库很类似,数据存储在一张表中,有行和列,但从底层物理存储结构(K-V)来看,HBase更像是一个multi-dimensional map。
HBase逻辑模型
HBase底层存储是K-V的形式,这个K就是Row key,是系统自带的,不是我们想创建或者不想创建所能够左右的。
如果要插入数据,必须指定Row key。
在一张表里面,Row key必须是唯一的。(这一点有点类似于关系型数据库的主键。)如果不唯一,你插入等同于覆盖。
每一个列隶属于不同的列簇(也有人翻译成列族),不同的列簇存储在不同的文件夹里面。也就是说一个表会分成很多个文件夹,这个文件夹怎么分的,就看列簇是什么样的。
一个列簇可以只有一个列。
列可以动态增加。
Row key是有序的,但这个顺序是“字典序”(按位比字符)。比如上图的row_key11在row_key2之前。
在上图中既有垂直切割,也有水平切割。垂直切分是按照列簇,水平切分是展昭region。region是一张表的切片,而且是水平切片。region的划分方式是按照数据量来的。一旦切分了region,不同的region也存储在不同的文件夹了。
HBase的实现查询之前会记录row?到row??是存储在region0、1、2等等里面。真正要查询的时候,不需要扫描所有的row。这也就是关系型数据库里面高表宽表存储策略的问题的策略。
实际的数据都是存储在hdfs上,而这些用于查询的元信息可以存在内存中。
在数据中,没必要每一行数据都存储一个列名。
随后,将列簇和region切片分过后的每一块实际存储的块,如上图黄色框出的区域叫做一个一个store。
*网上一种说法,在实际使用中,实际存储的时候一个列簇会生成storefile。
HBase的物理结构
我们将上图中的黄色的那一个区域region,单独拿出来看看HBase的物理存储结构,每一个row的每一个列数据,在实际存储时都存成下面那一行的形式。
这个“行”包含:Row key行键,Column Family列簇, Column Qualifier列名, 时间戳TimeStamp, Type操作类型,Value值。
这里一个非常重要的一项是时间戳。它是后面要说的很多东西,比如HBase优化,都要依赖的东西。在实际生产中,记得要将不同机器的系统时间同步,否则会遇到各种诡异的问题,比如put之后不成功,都是时间戳惹的祸。
上图中,可以看到,phone这个字段的只有两份,这时候取数据,要取时间戳最大的那一个。不同的版本version的数据根据timestamp进行区分。
那么删除数据呢?那么Type那一项就是DELETE。
所以,HBase上的增删改等修改操作,都不是当时就做的修改;而是像上面那样把每一个操作记录下来,再根据时间戳先后得到应该的结果。
数据模型概念
1)Namespace
明明空间,类似于惯性行数据库的database的概念,每个明明空间下有多个表。HBase有两个自带的明明空间,分别是habse和default,HBase存放的是HBase内置的表,存放hbase元数据;default表是用户默认使用的命名空间。
对于一个表,如果它是某个命名空间ns1下的表table1,那么写作ns1.table1;如果table1是存在default命名空间下的,就写作table1。
2)Region(切片)
类似于关系型数据库的概念。不同的是,HBase定义表时只需要声明列簇即可不需要生命具体的列。这意味着,向HBase写入数据时,字段可以动态按需指定。因此,和关系型数据库相比,HBase能够轻松应对字段变更的场景。
刚开始的时候,数据只有一点点,没必要切;后面需要切,而且可以手动切。
3)Row
HBase表中的航航数据都是由一个RowKey和多个Column列组成,数据按照RowKey的字典顺序存储的,并且查询数据时只能根据RowKey进行检索,所以RowKey的设计十分重要。
因为RowKey是字典有序的,所以HBase既可以做全表扫描,又可以做范围扫描。(?<row_key<??)
4)Column列
HBase中的每个列都是由Column Family列簇和Column Qualifier列限定符进行限定的,例如info:name,info:age。建表时,只需要指明列簇,而列限定符不需要预先定义。
也就是说,建表的时候只要声明到列簇就可以了,没必要声明列。
这里虽然叫“列”,但是更像是HBase“表”里面的数据。定义表的时候,列不指定;存取数据的时候,用的列和值 name:HappyBKs
5) Time Stamp
用于标识数据的不同版本(version),每条数据写入时,如果不指定时间戳,系统会自动为其加上该字段,其值为写入HBase的时间。(timestamp不同,但是rowkey,列簇,列名都要一样)
6)Cell
由(rowkey,column Family:column Qualifier, time stamp)唯一确定的单元。
cell中的数据是没有类型的,全部字节码形式存储。
感谢各位的阅读,以上就是“HBase概念有哪些”的内容了,经过本文的学习后,相信大家对HBase概念有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。