HBase简介

HBase介绍:

1、HBase是一个开源的非关系型分布式数据库(NoSQL),参考了Google的Bigtable建模
2、分布式存储,具有高可靠性、高性能、面向列、可伸缩的特点
3、HBase利用HDFS作为其文件存储系统
4、HBase适合具有如下需求的应用:
(1)海量数据(TB、PB)
(2)需要在海量数据中高效的随机读取
(3)能同时处理结构化和非结构化数据
(4)不需要完全拥有RDBMS的ACID特性

HBase简介

1、HBase是BigTable的开源java版本。是建立在HDFS之上,提供高可靠性、高性能、列存储、可伸缩、实时读写NoSQL的数据库系统
2、HBase仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务
3、主要用来存储结构化和半结构化的松散数据
4、Hbase查询数据功能很简单,不支持join等复杂操作,不支持复杂的事务(行级的事务),从技术上来说,HBase更像是一个「数据存储」而不是「数据库」,因为HBase缺少RDBMS中的许多特性,例如带类型的列、二级索引以及高级查询语言等
5、Hbase中支持的数据类型:byte[]
6、与Hadoop一样,Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加存储和处理能力,例如,把集群从10个节点扩展到20个节点,存储能力和处理能力都会加倍
7、HBase中的表一般有这样的特点
(7.1)、大:一个表可以有上十亿行,上百万列
(7.2)、面向列:面向列(族)的存储和权限控制,列(族)独立检索
(7.3)、稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏

HBase结构

1、以表形式存在
2、支持HDFS文件系统
3、使用行键(row key)
4、原生支持分布式存储、计算引擎
5、使用行、列、列蔟和单元格

HBase功能

1、支持向外扩展
2、使用API和MapReduce、Spark、Flink来访问HBase表数据
3、面向列蔟,即每一个列蔟都是一个连续的单元
4、数据总量不依赖具体某台机器,而取决于机器数量
5、HBase不支持ACID(Atomicity、Consistency、Isolation、Durability)
6、适合结构化数据和非结构化数据
7、一般都是分布式的
8、HBase不支持事务,支持的是单行数据的事务操作
9、不支持Join

HBase数据模型:

1、Table(表格):一个HBase表格由多行组成。
2、Row(行):HBase中的行里面包含一个key和一个或者多个包含值的列。行按照行的key字母顺序存储在表格中。
因为这个原因,行的key的设计就显得非常重要。数据的存储目标是相近的数据存储到一起。
一个常用的行的key的格式是网站域名。如果你的行的key是域名,你应该将域名进行反转(org.apache.www, org.apache.mail, org.apache.jira)再存储。
这样的话,所有Apache域名将会存储在一起,好过基于子域名的首字母分散在各处。
3、Column(列):HBase中的列包含用:分隔开的列族和列的限定符。
4、Column Family(列族):因为性能的原因,列族物理上包含一组列和它们的值。每一个列族拥有一系列的存储属性,
例如值是否缓存在内存中,数据是否要压缩或者他的行key是否要加密等等。
表格中的每一行拥有相同的列族,尽管一个给定的行可能没有存储任何数据在一个给定的列族中。
5、Column Qualifier(列的限定符):列的限定符是列族中数据的索引。例如给定了一个列族content,那么限定符可能是content:html,也可以是content:pdf。
列族在创建表格时是确定的了,但是列的限定符是动态地并且行与行之间的差别也可能是非常大的。
6、Cell(单元):单元是由行、列族、列限定符、值和代表值版本的时间戳组成的。
7、Timestamp(时间戳):时间戳是写在值旁边的一个用于区分值的版本的数据。
默认情况下,时间戳表示的是当数据写入时RegionSever的时间点,但你也可以在写入数据时指定一个不同的时间戳。
HBase数据模型:
概念视图
存取HBase表时看到的视图。以如下为例,有一个名为webtable的表,包含两个列族:contents和anchor
在这个例子里面,anchor有两个列 (anchor:cssnsi.com, anchor:my.look.ca),contents仅有一列(contents:html)

物理视图

在物理上,表是分列族存储的,如下图。新的columns可以不经过声明直接加入一个列族。
值得注意的是在上面的概念视图中空白cell在物理上是不存储的,因为根本没有必要存储。
因此若一个请求为要获取t8时间的contents:html,他的结果就是空。相似的,若请求为获取t9时间的anchor:my.look.ca,结果也是空。
但是,如果不指明时间,将会返回最新时间的行。

数据模型操作

四个主要的数据模型操作是Get、Put、Scan和Delete。通过HTable实例进行操作。

版本

行和列使用字节来表达,而版本是通过长整型来指定的。典型来说,这个长时间实例就像
java.util.Date.getTime() 或者 System.currentTimeMillis()返回的一样,以毫秒为单位,返回当前时间和January 1, 1970 UTC的时间差。
HBase的版本维度以递减顺序存储,以致读取一个存储的文件时,返回的是最新版本的数据。
关于单元的版本有许多的困扰,尤其是:
如果多个数据写到一个具有相同版本的单元里,只能获取到最后写入的那个;
以非递增的版本顺序写入也是可以的。

HBase核心概念:

HBase中的一些组成部件以及它们起到的作用:
1、Client:包含访问HBase的接口,并维护cache来加快对HBase的访问。
2、Zookeeper:HBase依赖Zookeeper,默认情况下HBase管理Zookeeper实例(启动或关闭Zookeeper),
Master与RegionServers启动时会向Zookeeper注册。Zookeeper的作用如下:
(1)保证任何时候,集群中只有一个HMaster
(2)存储所有Region的寻址入口
(3)实时监控Region server的上线和下线信息,通知HMaster
(4)存储HBase的schema和table元数据
3、HMaster:监控HRegionServer的活性,管理所有的元数据
4、HRegionServer:用来维护HMaster分配给他的region,处理对这些region的io请求;负责切分正在运行过程中变的过大的region。
5、HRegion:HBase表在行的方向上分隔为多个Region。Region是HBase中分布式存储和负载均衡的最小单元,
即不同的region可以分别在不同的Region Server上,但同一个region是不会拆分到多个server上。
Region按大小分隔,每个表一般是只有一个region,当region的某个列族达到一个阈值(默认256M)时就会分裂(split)成两个新的region。
6、Store:每个Region由一个或多个Store组成,HBase会把一起访问的数据放在一个Store里面,
即为每个ColumnFamily建一个Store,如果有几个ColumnFamily,也就有几个Store。
一个Store由一个memStore和0或者多个StoreFile组成。Store的大小被HBase用来判断是否需要切分Region。
7、StoreFile:memStore内存中的数据写到文件后就是StoreFile,StoreFile底层是以HFile的格式保存。
8、HFile:记录数据的所有变更,可以用来恢复文件,一旦region server 宕机,就可以从HFile中进行恢复。

HBase更细节的实现机制:

1、HFile中存储的是经过排序的键值对结构。文件内部由连续的块组成,块的索引信息存储在文件的尾部。
当把HFile打开并加载到内存中时,索引信息会优先加载。每个块的默认大小是64KB,
这个值可以按需配置。StoreFile提供了一个设定起始和终止行键范围的API用于加快访问。
2、HFile的块索引的作用是,使得通过一次磁盘查找就可以实现查询。首先,在内存的块索引中进行二分查找,确定可能包含给定键的块,
然后读取磁盘块找到实际要查的行键。StoreFile通常保存在HDFS中,HDFS为HBase提供了一个可扩展的、持久的、多副本的存储层。
StoreFile通过将更改写入到多个物理服务器中,以保证不丢失数据。
3、每次更新数据时,都会先将数据记录在提交日志(commit log)中,在HBase中这又称预写日志(write-ahead log, WAL),
然后才会将这些数据写入内存中的memstore中。一旦内存中保存的数据累计大小超过了一个给定的最大值,
系统就会将这些数据移出内存以HFile形式刷写到磁盘中。
数据移出内存之后,系统会丢弃对应的提交日志,只保留未持久化到磁盘中的提交日志。
在数据移出memstore写入磁盘的过程中,不会阻塞HBase的读写,通过滚动内存中的memstore就能达到这个目的,
即用空的新memstore获取新数据,将满的旧memstore转换成HFile。
注意,memstore中的数据已经按照行键排序,持久化到磁盘中的HFile也是按照这个顺序排序的,
所以不必执行排序或其他特殊处理。因为StoreFile是不可修改的,
所以无法通过删除某个键值对来简单地删除值。实际做法时,写个删除标记(delete marker,也称墓碑),
表明给定行已被删除。在检索过程中,有这种标记的行不会被客户端读到。
4、读回的数据是两部分数据合并的结果,一部分是memstore中还没有写入磁盘的数据,另一部分是磁盘上的StoreFile。
注意读数据时用不到WAL,只有服务器内存中的数据在服务器崩溃前没有写入到磁盘,才会使用WAL进行恢复。
5、随着memstore中的数据不断刷写到磁盘中,会产生越来越多的HFile文件,HBase内部有一种解决该问题的机制,
即用合并将多个文件合并成一个较大的文件。有两种类型的合并:次合并(minor compaction)和主合并(major compaction)。
minor compaction将多个小文件重写为数量较少的大文件,减少HFile的数量,这个过程实际上是个多路归并的过程。
因为HFile的每个文件都是顺序的,所以合并速度很快,只受到磁盘I/O性能的影响。
6、major compaction将一个region中一个列族的若干HFile重写为一个新的HFile,与minor compaction相比,
不同之处是:它扫描所有的键值对,顺序重写全部的数据,重写数据的过程中会略过打了删除标记的数据。
断言删除也在此时生效,如对于那些超过版本号限制的数据以及生存时间到期的数据,在重写数据时就不再写入磁盘了。

Hadoop的局限

1、Hadoop主要是实现批量数据的处理,并且通过顺序方式访问数据。
2、要查找数据必须搜索整个数据集, 如果要进行随机读取数据,效率较低。
 
posted @ 2021-09-10 19:58  屠魔的少年  阅读(13)  评论(0)    收藏  举报