HBase原理、基本概念、基本架构

HBase是Apache Hadoop的数据库,能够对大型数据提供随机、实时的读写访问。HBase的目标是存储并处理大型的数据。HBase是一个开源的,分布式的,多版本的,面向列的存储模型。它存储的是松散型数据。

HBase特性:

1 高可靠性

2 高效性

3 面向列

4 可伸缩

5 可在廉价PC Server搭建大规模结构化存储集群

HBase是Google BigTable的开源实现,其相互对应如下:

          Google            HBase
文件存储系统      GFS              HDFS
海量数据处理      MapReduce Hadoop     MapReduce
协同服务管理    Chubby           Zookeeper

 

HBase关系图:

HBase位于结构化存储层,围绕HBase,各部件对HBase的支持情况:
Hadoop部件            作用
HDFS              高可靠的底层存储支持
MapReduce             高性能的计算能力
Zookeeper            稳定服务和failover机制
Pig&Hive             高层语言支持,便于数据统计
Sqoop              提供RDBMS数据导入,便于传统数据库向HBase迁移

访问HBase的接口

方式            特点              场合
Native Java API      最常规和高效            Hadoop MapReduce Job并行处理HBase表数据
HBase Shell         最简单接口             HBase管理使用
Thrift Gateway      利用Thrift序列化支持多种语言     异构系统在线访问HBase表数据
Rest Gateway       解除语言限制            Rest风格Http API访问
Pig            Pig Latin六十编程语言处理数据   数据统计
Hive            简单,SqlLike

HBase 数据模型

组成部件说明:

Row Key:     Table主键 行键 Table中记录按照Row Key排序
Timestamp:     每次对数据操作对应的时间戳,也即数据的version number
Column Family:  列簇,一个table在水平方向有一个或者多个列簇,列簇可由任意多个Column组成,列簇支持动态扩展,无须预定义数量及类型,二进制存储,用户需自行进行类型转换

Table&Region

1. Table随着记录增多不断变大,会自动分裂成多份Splits,成为Regions
2. 一个region由[startkey,endkey)表示
3. 不同region会被Master分配给相应的RegionServer进行管理

两张特殊表:-ROOT- & .META.

.META.   记录用户表的Region信息,同时,.META.也可以有多个region
-ROOT-    记录.META.表的Region信息,但是,-ROOT-只有一个region
Zookeeper中记录了-ROOT-表的location
客户端访问数据的流程:
Client -> Zookeeper -> -ROOT- -> .META. -> 用户数据表
多次网络操作,不过client端有cache缓存

HBase 系统架构图

组成部件说明
Client:
使用HBase RPC机制与HMaster和HRegionServer进行通信
Client与HMaster进行通信进行管理类操作
Client与HRegionServer进行数据读写类操作

Zookeeper:
Zookeeper Quorum存储-ROOT-表地址、HMaster地址
HRegionServer把自己以Ephedral方式注册到Zookeeper中,HMaster随时感知各个HRegionServer的健康状况
Zookeeper避免HMaster单点问题

HMaster:
HMaster没有单点问题,HBase中可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master在运行
主要负责Table和Region的管理工作:
1 管理用户对表的增删改查操作
2 管理HRegionServer的负载均衡,调整Region分布
3 Region Split后,负责新Region的分布
4 在HRegionServer停机后,负责失效HRegionServer上Region迁移

HRegionServer:
HBase中最核心的模块,主要负责响应用户I/O请求,向HDFS文件系统中读写数据


HRegionServer管理一些列HRegion对象;
每个HRegion对应Table中一个Region,HRegion由多个HStore组成;
每个HStore对应Table中一个Column Family的存储;
Column Family就是一个集中的存储单元,故将具有相同IO特性的Column放在一个Column Family会更高效

HStore:
HBase存储的核心。由MemStore和StoreFile组成。
MemStore是Sorted Memory Buffer。用户写入数据的流程:


Client写入 -> 存入MemStore,一直到MemStore满 -> Flush成一个StoreFile,直至增长到一定阈值 -> 出发Compact合并操作 -> 多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除 -> 当StoreFiles Compact后,逐步形成越来越大的StoreFile -> 单个StoreFile大小超过一定阈值后,触发Split操作,把当前Region Split成2个Region,Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer上,使得原先1个Region的压力得以分流到2个Region上
由此过程可知,HBase只是增加数据,有所得更新和删除操作,都是在Compact阶段做的,所以,用户写操作只需要进入到内存即可立即返回,从而保证I/O高性能。

HLog
引入HLog原因:
在分布式系统环境中,无法避免系统出错或者宕机,一旦HRegionServer以外退出,MemStore中的内存数据就会丢失,引入HLog就是防止这种情况
工作机制:
每个HRegionServer中都会有一个HLog对象,HLog是一个实现Write Ahead Log的类,每次用户操作写入Memstore的同时,也会写一份数据到HLog文件,HLog文件定期会滚动出新,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会通过Zookeeper感知,HMaster首先处理遗留的HLog文件,将不同region的log数据拆分,分别放到相应region目录下,然后再将失效的region重新分配,领取到这些region的HRegionServer在Load Region的过程中,会发现有历史HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复。

HBase存储格式
HBase中的所有数据文件都存储在Hadoop HDFS文件系统上,格式主要有两种:
1 HFile HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,实际上StoreFile就是对HFile做了轻量级包装,即StoreFile底层就是HFile
2 HLog File,HBase中WAL(Write Ahead Log) 的存储格式,物理上是Hadoop的Sequence File

HFile


图片解释:
HFile文件不定长,长度固定的块只有两个:Trailer和FileInfo
Trailer中指针指向其他数据块的起始点
File Info中记录了文件的一些Meta信息,例如:AVG_KEY_LEN, AVG_VALUE_LEN, LAST_KEY, COMPARATOR, MAX_SEQ_ID_KEY等
Data Index和Meta Index块记录了每个Data块和Meta块的起始点
Data Block是HBase I/O的基本单元,为了提高效率,HRegionServer中有基于LRU的Block Cache机制
每个Data块的大小可以在创建一个Table的时候通过参数指定,大号的Block有利于顺序Scan,小号Block利于随机查询
每个Data块除了开头的Magic以外就是一个个KeyValue对拼接而成, Magic内容就是一些随机数字,目的是防止数据损坏

HFile里面的每个KeyValue对就是一个简单的byte数组。这个byte数组里面包含了很多项,并且有固定的结构。


KeyLength和ValueLength:两个固定的长度,分别代表Key和Value的长度
Key部分:Row Length是固定长度的数值,表示RowKey的长度,Row 就是RowKey
Column Family Length是固定长度的数值,表示Family的长度
接着就是Column Family,再接着是Qualifier,然后是两个固定长度的数值,表示Time Stamp和Key Type(Put/Delete)
Value部分没有这么复杂的结构,就是纯粹的二进制数据

HLog File


HLog文件就是一个普通的Hadoop Sequence File,Sequence File 的Key是HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和region名字外,同时还包括 sequence number和timestamp,timestamp是“写入时间”,sequence number的起始值为0,或者是最近一次存入文件系统中sequence number。
HLog Sequece File的Value是HBase的KeyValue对象,即对应HFile中的KeyValue

数据模型

在HBase中,数据存储在具有行和列的表中,这是与关系数据库(RDBMS)类似的模型,但与之不同的是其具备结构松散、多维有序映射的特点,它的索引排序键由行+列+时间戳组成,HBase表可以被看做一个“稀疏的、分布式的、持久的、多维度有序Map”。

总览

总览

相关术语

  • 命名空间(Namespace):对表的逻辑分组,类似于关系型数据库中的Database概念。Namespace可以帮助用户在多租户场景下做到更好的资源和数据隔离。
  • 表(Table):HBase会将数据组织进一张张的表里面,一个HBase 表由多行组成。
  • 行(Row):HBase中的一行包含一个行键和一个或多个与其相关的值的列。在存储行时,行按字母顺序排序。出于这个原因,行键的设计非常重要。目标是以相关行相互靠近的方式存储数据。常用的行键模式是网站域。如果你的行键是域名,则你可能应该将它们存储在相反的位置(org.apache.www,org.apache.mail,org.apache.jira)。这样表中的所有Apache域都彼此靠近,而不是根据子域的第一个字母分布。
  • 列(Column) :HBase中的列由一个列族和一个列限定符组成,它们由冒号(:)字符分隔。
  • 列族(Column Family) :由于性能原因,列族在物理上共同存在一组列和它们的值。在HBase中每个列族都有一组存储属性,例如其值是否应缓存在内存中,数据如何压缩或其行编码是如何编码的等等。表中的每一行都有相同的列族,但给定的行可能不会在给定的列族中存储任何内容。列族一旦确定后,就不能轻易修改,因为它会影响到HBase真实的物理存储结构,但是列族中的列标识(Column Qualifier)以及其对应的值可以动态增删。
  • 列限定符(Column Qualifier) :列限定符被添加到列族中,以提供给定数据段的索引。鉴于列族的content,列限定符可能是content:html,而另一个可能是content:pdf。虽然列族在创建表时是固定的,但列限定符是可变的,并且在行之间可能差别很大。
  • 单元格(Cell) :单元格是行、列族和列限定符的组合,并且包含值和时间戳,它表示值的版本。
  • 时间戳(Timestamp) :时间戳与每个值一起编写,并且是给定版本的值的标识符。默认情况下,时间戳表示写入数据时RegionServer上的时间,但可以在将数据放入单元格时指定不同的时间戳值。

概念视图

本节示例是根据BigTable论文进行修改后的示例,在本节的示例中有一个名为表 webtable,其中包含两行(com.cnn.www 和 com.example.www)以及名为 contents、anchor 和 people 的三个列族。在本例中,对于第一行(com.cnn.www), anchor 包含两列(anchor:cssnsi.com,anchor:my.look.ca),并且 contents 包含一列(contents:html)。本示例包含具有行键 com.cnn.www 的行的5个版本,以及具有行键 com.example.www 的行的一个版本。contents:html 列限定符包含给定网站的整个 HTML。anchor列族的列限定符每个包含与该行所表示的站点链接的外部站点以及它在其链接的锚点中使用的文本。people 列族代表与该网站相关的人员。

列名称:按照约定,列名由其列族前缀和限定符组成。例如,列内容:html 由列族contents和html限定符组成。冒号(:)从列族限定符分隔列族。

webtable 表如下所示:

 
Row KeyTime StampColumnFamily contentsColumnFamily anchorColumnFamily people
“com.cnn.www” T9 (-) anchor:cnnsi.com =“CNN” (-)
“com.cnn.www” T8 (-) anchor:my.look.ca =“CNN.com” (-)
“com.cnn.www” T6 contents:html = “…​” (-) (-)
“com.cnn.www” T5 contents:html = “…​” (-) (-)
“com.cnn.www” T3 contents:html =“ ……” (-) (-)
“com.example.www” T5 contents:html =“ ……” (-) people:author =“John Doe”
 
说明 此表中显示为-的单元格在HBase中不占用空间或实际上存在,这正是使HBase“稀疏”的原因。表格视图并不是查看HBase数据的唯一可能的方法,甚至是最准确的,以下代表与多维Map相同的信息。这只是用于说明目的的模拟,可能并不严格准确。
 
{
  "com.cnn.www": {
    contents: {
      t6: contents:html: "<html>..."
      t5: contents:html: "<html>..."
      t3: contents:html: "<html>..."
    }
    anchor: {
      t9: anchor:cnnsi.com = "CNN"
      t8: anchor:my.look.ca = "CNN.com"
    }
    people: {}
  }
  "com.example.www": {
    contents: {
      t5: contents:html: "<html>..."
    }
    anchor: {}
    people: {
      t5: people:author: "John Doe"
    }
  }
}

物理视图

尽管在HBase概念视图中,表格被视为一组稀疏的行的集合,但它们是按列族进行物理存储的。可以随时将新的列限定符(column_family:column_qualifier)添加到现有的列族。

ColumnFamily anchor:

 
Row KeyTime StampColumnFamily anchor
“com.cnn.www” T9 anchor:cnnsi.com = “CNN”
“com.cnn.www” T8 anchor:my.look.ca = “CNN.com”

ColumnFamily contents:

 
Row KeyTime StampColumnFamily contents
“com.cnn.www” T6 contents:html = “…​”
“com.cnn.www” T5 contents:html = “…​”
“com.cnn.www” T3 contents:html = “…​”

HBase概念视图中显示的空单元根本不存储。因此,对时间戳为t8的contents:html列值的请求将不返回任何值。同样,在时间戳为t9中一个anchor:my.look.ca值的请求也不会返回任何值。但是,如果未提供时间戳,则会返回特定列的最新值。给定多个版本,最近的也是第一个找到的,因为时间戳按降序存储。因此,如果没有指定时间戳,则对行com.cnn.www中所有列的值的请求将是:时间戳t6中的contents:html,时间戳t9中anchor:cnnsi.com的值,时间戳t8中anchor:my.look.ca的值。

数据排序

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

列元数据

ColumnFamily的内部KeyValue实例之外不存储列元数据。因此,尽管HBase不仅可以支持每行大量的列数,而且还能对行之间的一组异构列进行维护,但您有责任跟踪列名。

获得ColumnFamily存在的一组完整列的唯一方法是处理所有行。

ACID

ACID,指数据库事务正确执行的四个基本要素的缩写,即:原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Durability)。

HBase支持单行操作下的ACID,即对同一行的Put操作保证完全的ACID。

 

posted @ 2021-12-21 21:19  hanease  阅读(333)  评论(0编辑  收藏  举报