Hbase的初步认识

823 阅读8分钟

整篇文章是在学习了多篇其他作者的文章的一个结合,若有冒犯侵权,还请及时告知,但也是我对于Hbase的心得体会,如果有理解错误的地方也还请大家指点,那么下面我们就步入正文

Hbase

BigTable是什么

在正式了解Hbase之前,我们先简单的了解一下BigTable

百度百科给出的答案是:BigTable是Google设计的分布式数据存储系统,用来处理海量的数据的一种非关系型的数据库。BigTable是非关系型数据库,是一个稀疏的、分布式的、持久化存储的多维度排序Map。Bigtable的设计目的是快速且可靠地处理PB级别的数据,并且能够部署到上千台机器上。

BigTable数据模型

BigTable不是关系型数据库,但是却沿用了很多关系型数据库的术语,像table(表)、row(行)、column(列)等。这容易让读者误入歧途,将其与关系型数据库的概念对应起来,从而难以理解。

本质上说,BigTable是一个键值(key-value)映射。按作者的说法,Bigtable是一个稀疏的,分布式的,持久化的,多维的排序映射。

BigTable的键有三维,分别是 行键(row key)、列键(column key)和时间戳(timestamp)

简单理解, BigTable存储的结构类似key-value (但并不是key-value),key称为RowKey,value可以分多列(Column)存储多个Value,相关的Column(一般数据类型相同)被聚为列簇(ColumnFamily),Value可以存储多个版本,每个版本有Timestamp标识

可以总结为如下关系:

(RowKey, ColumnFamily:Column, Timestamp) → Value

类似如下表格:

BigTable的特点

1、适合大规模海量数据,PB级数据;

2、分布式、并发数据处理,效率极高;

3、易于扩展,支持动态伸缩;

4、适用于廉价设备;

5、适合于读操作,不适合写操作。

6、不适用于传统关系型数据库;

Hbase是什么

HBase:是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。HBase 是一个稀疏的、分布式、持久、多维、排序的映射,它以行键(row key),列键(column key)和时间戳(timestamp)为索引。

Hbase数据模型

Hbase是NoSQL数据库的一种,但尽管如此,它也使用着一些关系型数据库的术语

Table:Hbase的表由多个行组成

RowKey:代表着一行,这一行可以有一个或多个的列。通过row key来定位数据。是最重要的数据模型,当插入数据的时候,数据会按照row key进行排序,插入到合适的位置。

Column Family:先说一下列簇,方便后面说列。它在使用表前就必须被定义好,多个列可以有相同的列簇,例如:language:chinese和language:english都属于language这个列簇

Column:代表着具体的哪一列,可以不用提前定义

Column Qualifier:列的唯一标识

Cell:Cell是由row,column family,column qualifier包含时间戳与值组成的,一般表达某个值的版本。cell中 的数据是没有类型的,全部是字节码形式存贮。

Timestamp:Hbase中通过rowkey和columns确定的为一个存贮单元称为cell。每个 cell都保存 着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64位整型。时间戳可以由HBASE(在数据写入时自动 )赋值。默认的时间戳是你写入数据的那一刻,但是你也可以在写入数据的时候指定不同的时间戳

总结一下:

假设表中每一行代表着某个用户和所有他所关注的其它用户,那么用户ID就是Row Key,而每一个列标识(Column Qualifier)就是这个用户所关注的其他用户在列族里的序号,单元数据(Cell)就是这个用户所关注的其他用户的用户ID,然后有相同关系的其他关注者就可以放在同一列簇(Column Family),如:列簇分为男生和女生(当然这个例子可能不太好)

补充几点:

1.Hbase在存储数据的时候,有两个SortedMap,首先按照rowkey进行字典排序,然后再对Column进行字典排序。

2.Hbase和RDBMS不一样,没有那么多的数据类型,只有一个字符串

3.看过官方文档的话就会发现,Hbase支持四种操作:Get、Put、Scan、Delete

4.HBase的所有数据模型操作均按排序顺序返回数据。首先是按行,然后是ColumnFamily,然后是列限定符,最后是时间戳(按相反顺序排序,因此首先返回最新记录)

5.Hbase并不能像RDBMS一样支持join,但不代表Hbase不能做到,具体策略官方文档有提及

Hbase架构体系

Hbase内部的基本组成

Hbase的整体主要由zookeeper,Hmaster,HRegionServer,Hdfs文件系统组成。由这四部分共同完成数据的读取与写入。

Hbase的数据存储方式

hbase有个很重要的特性,就是可以存取海量数据,而且是通过分布式集群的方式, 当数据量越来越多的时候通过增加集群主机的数量就可以将数据分散到不同的主机上,这是传统的数据库很难实现的

如上图,不同的范围的数据划分到不同的Region,而不同的HRegion会被放在不同的主机上,当查询数据的时候,只要根据RowKey先找到数据在那个范围的HRegion中,就可以直接去那个HRegion中找到数据,所以查询效率会比传统的数据库快很多。 当然随着数据不断增多,Region也会不断的增多(对表的划分增多),而RegionServer也是多个,不同的Region由多个不同的RegionServer管理着。

Hbase的读写数据的基本流程

写数据

客户端发送请求,找到请求需要的Region的RegionServer,RegionServer会先将请求写入到Hlog,防止数据丢失,很多系统都是这样操作的,写入完成后才会将请求写入到对应的Region中

我们再说一下,是如何从Region写入到hdfs中的,Region中有多个Store(每个Store代表着一个Table中的Column Family),而数据在哪个Column Family 就传入那个Store,其流程:RegionServer会先写入到Region的MemStore中(此时就会返回写入成功,但Hfile文件还并未创建),当MemStore的数据达到一定大小时,就会Flush,然后被写入到StoreFile中,StoreFile又会被序列化成Hfile,最后通过hdfs的api传入到hdfs

读数据

读数据和写数据我们都要知道是如何查找到我们要的数据存储的Region是在哪个RegionServer上,首先我们通过Zookeeper查找到-root-的位置(-root-只有一个,本质也是一个Region,存放的是不同范围的RowKey去哪个RegionServer的.Meta.中找),之后再去请求.Meta.得到Table和RowKey,然后在去请求在哪个Region上,最后拿到想要的数据,一共是请求了四次(不过某版本之后去掉了-root-)

HMaster

最后来说一下一直没有提到的HMaster,当一个Region中的数据达到一定程度,HMaster就会对其进行合并数据,清理其中的冗余数据,清理后的数据大小小于256M,还有一个呢,就是HRegion Split,最开始的时候,一个Table只有一个HRegion,随着数据写入的增加使HRegion到达一定的大小,就需要Split成两个HRegion,这个大小由hbase.hregion.max.filesize指定,其过程就是由HMaster完成的。 当split时,两个新的HRegion会在同一个HRegionServer中创建,它们各自包含父HRegion一半的数据,当Split完成后,父HRegion会下线,而新的两个子HRegion会向HMaster注册上线,处于负载均衡的考虑,这两个新的HRegion可能会被HMaster分配到其他的HRegionServer中。 当HRegionServer宕机之后,HMaster可以读取Hlog,将数据在发送给其他RegionServer进行数据恢复。并修改.Meta.

总结一下:

Hmaster: 在Region Split后,负责新Region的分配; 新机器加入时,管理HRegion Server的负载均衡,调整Region分布 在HRegion Server宕机后,负责失效HRegion Server 上的Regions迁移。

Region Server: Region Server维护Master分配给它的region,处理对这些Region的IO请求 HRegion Server管理了很多Table的分区,也就是Region。

Zookeeper: ZooKeeper为HBase集群提供协调服务,它管理着HMaster和HRegionServer的状态(available/alive等),并且会在它们宕机时通知给HMaster Zookeeper中管理着hbase的元数据,例如-root-的位置所在。

hdfs: 数据文件的存放处。由于其本身的分布式存储机制,所以数据文件很安全。 hadoop的datanode最好和region在同一主机上,方便读取数据。尽量避免网络数据传输。