参考链接 : 官方指导文档


文章目录

  • 一、HBase定义
  • 二、HBase的逻辑和物理结构
  • 三、HBase中各名词及作用
  • 四、HBase架构角色


一、HBase定义

HBase是Hadoop的数据库
特点:分布式,可伸缩的, 面向列存储,基于HDFS
支持:十亿行键,百万列的数据存储
基于:Google’s Bigtable论文

hbase的表是基于 hbase表结构设计_hbase的表是基于


在回过头来,看看Hive,是data warehouse(数据仓库),现在知道数据仓库和数据库的区别了吧。

hbase的表是基于 hbase表结构设计_hbase_02

二、HBase的逻辑和物理结构

1、逻辑结构

hbase的表是基于 hbase表结构设计_HDFS_03


2、物理结构

是以<key,value>形式存储

hbase的表是基于 hbase表结构设计_hbase_04

三、HBase中各名词及作用

NameSpace:命名空间 是表的逻辑分组

类似于关系型数据库中的数据库

有两个namespace:HBase(内部用)和 default(用户用)

【可以去HDFS上看一下】

hbase的表是基于 hbase表结构设计_数据_05


进入default,就可以看到我们创建的表了

hbase的表是基于 hbase表结构设计_HDFS_06


Region:

类似于关系型数据库中的表,不同的是HBase中定义表的时候要定义列族,不需要声明具体的列Row:行键

HBase中没个数据都由一个RowKey和多个列组成,数据按照RowKey的字典顺,查询时只能根据RowKey

进行检索,所以RowKey的设计十分重要,尽量短一些不要超过16个位(设计不好,会发生热点问题——一方有难,八方围观,官方推荐采用加盐、散列、翻转key等方式)

hbase的表是基于 hbase表结构设计_数据_07

ColumnFamily:列簇/族

相当于列的集合,但不适宜过多创建

实际上,所有列族成员都一起存储在文件系统上。由于调整和存储规范是在列族级别上完成的,

因此建议所有列族成员具有相同的常规访问模式和大小特征。

建议设计列簇名的时候就是一个字符,官方推荐:

hbase的表是基于 hbase表结构设计_hbase_08


Column:列

HBase中每一个列都由Column Family和Column Qulifier(列限定符 :)进行限定

TimeStamp:时间戳
用于标注数据不同版本(version),每条数据写入时,如果不指定时间戳,系统会自动写入,系统采用反向时间戳的方式,使得我们读取的数据永远是最新的,除非加入versions.

Cell:
一个由[行键,列,版本]组成的元组,没有类型,全部是字节码形式存储

四、HBase架构角色

hbase的表是基于 hbase表结构设计_HDFS_09

1、RegionServer

RegionServer是Server的管理者,其实现类为HRegionServer,主要功能如下:

  • 对于数据的操作:get、put、delete
  • 对于Region的操作:splitRegion、compactRegion

2、Master
Master是所有RegionServer的管理者,其实现类为HMaster,主要功能如下:

  • 对于表的操作:create、insert、alter
  • 对于RegionServer的操作:分配Region到每个RegionServer上,监控每个RegionServer的状态,负载均衡和故障转移

3、Zookeeper
HBase通过Zookeeper来做master的高可用,RegionServer的监控,元数据的入口以及集群配置的维护等工作

hbase的表是基于 hbase表结构设计_hbase的表是基于_10


【分析过程】

首先, HBase依赖于Hadoop,和Zookeeper

其次,HBase中最重要的两个组件:HMaster 和 HRegionServer。一般由HMaster 开启 并管理HRegionServer

然后,HLog:相当于HDFS中的editlog,(写入日志),一个HRegionServer对应一个HLog,为什么不是一个HRegion对应一个HLog,是为了减少存储压力

接着,一个HRegionServer中可以有多个HRegion,HRegion相当于MySQL中的表,但是当数据过多时,也会被切分成多个表

继续,一个HRegion中可以包含一个或多个Store(列簇)—>对应HDFS上的一个列簇一个文件夹

最后,Store中存储Mem Store(内存)和StoreFile(磁盘),我们进行写入操作时,为了提高写入效率,HBase会先写到Mem Store中,当Mem Store过大时,会自动进行flush,每flush一次,就会生成一个StoreFile文件(包含HFile:以<k,v>形式存储,HFile是真正存储数据的地方,大小非常小,所以HFile会经常合并,合并成大文件之后又会被切分)

【注意:Mem Store进行 flush之后,会向HDFS客户端发送写请求,然后由DataNode进行文件的写入,所以说StoreFile 在DataNode上】