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 是由 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数据模型
-
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
HBASE读写流程:
- 读流程:
1)Client 先访问 zookeeper,从 meta 表读取region 的位置,然后读取 meta 表中的数据。meta 中又存储了用户表的 region 信息;
2)根据namespace、表名和rowkey 在meta 表中找到对应的region 信息;
3)找到这个region 对应的regionserver;
4)查找对应的region;
5)先从MemStore 找数据,如果没有,再到BlockCache 里面读
6)BlockCache还没有,再到StoreFile 上读(为了读取的效率);
7)如果是从 StoreFile 里面读取的数据,不是直接返回给客户端,而是先写入BlockCache, 再返回给客户端。
- 写流程:
1)当 MemStore数据达到阈值(默认是128M,老版本是64M),将数据刷到硬盘,将内存中的数据删除,同时删除HLog 中的历史数据;
2)并将数据存储到HDFS 中;
3)在HLog 中做标记点。
- 数据合并过程
1)当数据块达到4 块,Hmaster触发合并操作,Region 将数据块加载到本地,进行合并;
2)当合并的数据超过256M,进行拆分,将拆分后的Region 分配给不同的HregionServer管理;
3)当HregionServer 宕机后,将HregionServer 上的hlog 拆分,然后分配给不同HregionServer加载,修改.META.;
4)注意:HLog 会同步到 HDFS。