HBase-1-概述

Hbase 特点

1)海量存储
Hbase 适合存储 PB 级别的海量数据,在 PB 级别的数据以及采用廉价 PC 存储的情况下
能在几十到百毫秒内返回数据。这与Hbase 的极易扩展性息息相关。正式因为Hbase 良好的扩展性,才为海量数据的存储提供了便利。
2)列式存储
这里的列式存储其实说的是列族存储,Hbase 是根据列族来存储数据的。列族下面可以
有非常多的列,列族在创建表的时候就必须指定。
3)极易扩展
Hbase 的扩展性主要体现在两个方面,一个是基于上层处理能力(RegionServer)的扩
展,一个是基于存储的扩展(HDFS)。通过横向添加RegionSever 的机器,进行水平扩展,提升Hbase 上层的处理能力,提升Hbsae服务更多Region 的能力。
备注:RegionServer 的作用是管理 region、承接业务的访问,这个后面会详细的介绍通过横向添加Datanode 的机器,进行存储层扩容,提升Hbase 的数据存储能力和提升后端存储的读写能力。
4)高并发
由于目前大部分使用 Hbase 的架构,都是采用的廉价 PC,因此单个 IO 的延迟其实并不
小,一般在几十到上百 ms 之间。这里说的高并发,主要是在并发的情况下,Hbase 的单个IO 延迟下降并不多。能获得高并发、低延迟的服务。
5)稀疏
稀疏主要是针对Hbase 列的灵活性,在列族中,你可以指定任意多的列,在列数据为空
的情况下,是不会占用存储空间的。

HBase 架构

HBase-1-概述
从图中可以看出 Hbase 是由 Client、Zookeeper、Master、HRegionServer、HDFS 等几个组件组成,下面来介绍一下几个组件的相关功能

1) Client
Client 包含了访问Hbase 的接口,另外Client 还维护了对应的cache 来加速Hbase 的访问,比如cache 的.META.元数据的信息。
2)Zookeeper
HBase 通过Zookeeper 来做master 的高可用、RegionServer的监控、元数据的入口以及
集群配置的维护等工作。具体工作如下:
通过Zoopkeeper 来保证集群中只有1 个master 在运行,如果master 异常,会通过竞争机制产生新的master 提供服务
通过Zoopkeeper 来监控RegionServer 的状态,当RegionSevrer 有异常的时候,通过回调的形式通知Master RegionServer 上下线的信息
通过Zoopkeeper 存储region统一入口地址
存储HBase的schema和table元数据
3) Hmaster
master 节点的主要职责如下:
为 RegionServer 分 配 Region
维护整个集群的负载均衡 维护集群的元数据信息
发现失效的 Region,并将失效的 Region 分配到正常的 RegionServer上
当RegionSever 失效的时候,协调对应Hlog 的拆分
管理用户对table的增删改操作
4)HregionServer
HregionServer 直接对接用户的读写请求,是真正的“干活”的节点。它的功能概括如下:
管理master 为其分配的Region处理来自客户端的读写请求负责和底层HDFS 的交互,存储数据到HDFS,处理IO请求
负责 Region变大以后的拆分
负责 Storefile的合并工作
5)HDFS
HDFS 为 Hbase 提供最终的底层数据存储服务,同时为 HBase 提供高可用(Hlog 存储在HDFS)的支持,具体功能概括如下:
提供元数据和表数据的底层分布式存储服务
数据多副本,保证的高可靠和高可用性
6)Region
HBase自动把表水平划分成多个区域(region),每个region会保存一个表中某段连续数据。
每个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阈值,region就会被切分。
当table中的行不断增多,就会有越来越多的region,这样一张完整的表会保存在多个RegionServer上。
7)MemStore和storefile
一个region由多个store组成,一个store对应一个CF(列族)。
store包括位于内存中的memstore和位于磁盘的storefile写操作先写入memstore,当memstore中的数据达到阈值,HRegionserver会启动flushcache进程写入storefile,每次写入形成一个单独的storefile。
当storefile文件的数量增长到一定的阈值后,系统会进行合并(minor,major compaction),在合并过程中会进行版本合并和删除工作(major),形成更大的storefile。
当一个region所有storefile的大小和数量超过一定的阈值,会把当前的region分割为两个,并由HMaster分配到相应的regionserver服务器,实现负载均衡。
客户端检索数据先在memstore找,找不到再找storefile(即memstore主要是写缓存,但同时也担任读缓存)

  • HRegion是HBASE中分布式存储和负载均衡的最小单元。最小单元就表示不同的HRegion可以分布在不同的HRegionServer上。
  • HRegion由一个或多个store组成,每个store保存一个columns family
  • 每个store又由一个memStore和多个StoreFile组成,StoreFile以HFile的形式保存在HDFS上。

HBase 中的角色

1HMaster
功能
1.监控 RegionServer
2.处理 RegionServer 故障转移
3.处理元数据的变更
4.处理 region 的分配或转移
5.在空闲时间进行数据的负载均衡 6.通过 Zookeeper 发布自己的位置给客户端
2 RegionServer
功能
1.负责存储 HBase 的实际数据
2.处理分配给它的 Region
3.刷新缓存到 HDFS
4.维护 Hlog
5.执行压缩
6.负责处理 Region 分片
3 其他组件
1.Write-Ahead logs
HBase 的修改记录,当对
HBase 读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)。但把数据保存在内存中可能有更高的概率引起数据丢失,为了解决这个问题,数据会先写在一个叫做 Write-Aheadlogfile 的文件中,然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。
2.Region
Hbase 表的分片,HBase 表会根据RowKey 值被切分成不同的 region 存储RegionServer中,在一个RegionServer 中可以有多个不同的region。
3.Store
HFile 存储在Store 中,一个Store 对应HBase 表中的一个列族。
4.MemStore
顾名思义,就是内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在WAL 中之后,RegsionServer会在内存中存储键值对。
5.HFile
这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。StoreFile是以Hfile的形式存储在HDFS 的。

HBase数据模型

HBase-1-概述

  • RowKey
    与nosql 数据库们一样,RowKey是用来检索记录的主键(决定一行数据)。访问HBASE table 中的行,只有三种方式:
    1.通过单个RowKey访问
    2.通过 RowKey 的 range(正则)
    3.全表扫描
    RowKey 行键(RowKey)可以是任意字符串(最大长度是 64KB,实际应用中长度一般为10-100bytes),在 HBASE 内部,RowKey 保存为字节数组。存储时,数据按照 RowKey 的字典序(byte order)排序存储。设计 RowKey 时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性)
    使用HBASE难点就在如何设计rowKey,它直接决定了查询效率。

  • Column Family(列族)&qualifier(列)
    列族是我们能进行操作的最小单位。HBASE表中的每个列都归属于某个列族,列族必须作为表模式(schema)定义的一部分预先给出(而列不是)。必须在使用表之前定义。
    列名都以列族作为前缀。例如 courses:history,courses:math 都属于 courses 这个列族。新的列族成员(列)可随后按需动态加入。
    权限控制,存储及调优都是在列族层面进行的。
    Hbase把统一列族里的数据存储在同一目录下,由几个文件保存、

  • TimeStamp

    • HBASE每个cell存储单元对同一份数据有多个版本,根据唯一的时间戳来区分每个版本间的差异,不同的版本数据按照时间倒序排序,最新的数据版本排在最前面。
    • 时间戳的类型是64位整型
    • 时间戳可以由HBASE(在写入数据时自动)赋值,此时时间戳是精确到毫秒的当前系统时间
    • 时间戳也可以由客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳
    • 为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担,HBASE 提供 了两种数据版本回收方式。一是保存数据的最后 n 个版本,二是保存最近一段 时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。
  • cell单元格

    • 由行和列的坐标交叉决定
    • 单元格是有版本的
    • 单元格内容是未解析的字节数组
      • 由{rowKey,column(=+),version}唯一确定的单元
      • cell中的数据是没有类型的,全是字节码形式存储
  • HLog(WAL log)

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