Hbase知识点
(1)概念
base 是分布式、面向列的开源数据库(其实准确的说是面向列族)。HDFS 为 Hbase 提供可靠的底层数据存储服务,MapReduce 为 Hbase 提供高性能的计算能力,Zookeeper 为 Hbase 提供稳定服务和 Failover 机制,因此我们说 Hbase 是一个通过大量廉价的机器解决海量数据的高速存储和读取的分布式数据库解决方案。
(2)列式存储
列方式所带来的重要好处之一:由于查询中的选择规则是通过列来定义的,因此整个数据库是自动索引化的。
这里的列式存储其实说的是列族存储,Hbase 是根据列族来存储数据的。列族下面可以有非常多 的列,列族在创建表的时候就必须指定。为了加深对 Hbase 列族的理解,下面是一个简单的关系 型数据库的表和Hbase数据库的表:
(3)Hbase 核心概念
- Column Family列族
Column Family 又叫列族,Hbase 通过列族划分数据的存储,列族下面可以包含任意多的列,实 现灵活的数据存取。Hbase 表的创建的时候就必须指定列族。就像关系型数据库创建的时候必须 指定具体的列是一样的。Hbase的列族不是越多越好,官方推荐的是列族最好小于或者等于3。我 们使用的场景一般是1个列族。
- Rowkey(Rowkey查询,Rowkey范围扫描,全表扫描)
Rowkey 的概念和 mysql 中的主键是完全一样的,Hbase 使用 Rowkey 来唯一的区分某一行的数 据。Hbase 只支持 3 中查询方式:基于 Rowkey 的单行查询,基于 Rowkey 的范围扫描,全表扫描。
- Region分区
Region:Region 的概念和关系型数据库的分区或者分片差不多。Hbase 会将一个大表的数 据基于Rowkey的不同范围分配到不通的Region中,每个Region负责一定范围的数据访问 和存储。这样即使是一张巨大的表,由于被切割到不通的region,访问起来的时延也很低。
- TimeStamp多版本
TimeStamp是实现Hbase多版本的关键。在Hbase中使用不同的timestame来标识相同 rowkey行对应的不通版本的数据。在写入数据的时候,如果用户没有指定对应的 timestamp,Hbase会自动添加一个timestamp,timestamp和服务器时间保持一致。在 Hbase中,相同rowkey的数据按照timestamp倒序排列。默认查询的是最新的版本,用户 可同指定timestamp的值来读取旧版本的数据。
(4)Hbase 核心架构
Hbase是由Client、Master、HRegionServer、Zookeeper、HDFS等几个组建组成。
- Client:
Client包含了访问Hbase的接口,另外Client还维护了对应的cache来加速Hbase的访问,比如cache的.META.元数据的信息。
- Zookeeper:
Hbase通过Zookeeper来做master的高可用、RegionServer的监控、元数据的入口 以及集群配置的维护等工作。具体工作如下:
1. 通过Zoopkeeper来保证集群中只有1个master在运行,如果master异常,会通过竞争机制产生新的master提供服务。
2. 通过Zoopkeeper来监控RegionServer的状态,当RegionSevrer有异常的 时候,通过回调的形式通知Master RegionServer上下限的信息。
3. 通过Zoopkeeper存储元数据的统一入口地址。
- Hmaster
master节点的主要职责如下:
1. 为RegionServer分配Region
2. 维护整个集群的负载均衡
3. 维护集群的元数据信息发现失效的Region,并将失效的Region分配到正常 RegionServer上当RegionSever失效的时候,协调对应Hlog的拆分。
- HregionServer
HregionServer直接对接用户的读写请求,是真正的“干活”的节点。它的功能概括如下:
1. 管理master为其分配的Region。
2. 处理来自客户端的读写请求。
3. 负责和底层HDFS的交互,存储数据到HDFS。
4. 负责Region变大以后的拆分。
5. 负责Storefile的合并工作。
- Region寻址方式(通过zookeeper.META)
第1步:Client请求ZK获取.META.所在的RegionServer的地址。
第2步:Client请求.META.所在的RegionServer获取访问数据所在的RegionServer地址,client会将.META.的相关信息cache下来,以便下一次快速访问。
第3步:Client请求数据所在的RegionServer,获取所需要的数据。
- HDFS
HDFS为Hbase提供最终的底层数据存储服务,同时为Hbase提供高可用(Hlog存储在 HDFS)的支持。
(5)Hbase 的写逻辑
1、写入流程
获取 RegionServer
第1步:Client获取数据写入的Region所在的RegionServer
请求写 Hlog 。
第2步:请求写Hlog, Hlog存储在HDFS,当RegionServer出现异常,需要使用Hlog来恢复数据。
请求写 MemStore。
第3步:请求写MemStore,只有当写Hlog和写MemStore都成功了才算请求写入完成。 MemStore后续会逐渐刷到HDFS中。
2、 MemStore刷盘
为了提高Hbase的写入性能,当写请求写入MemStore后,不会立即刷盘。而是会等到一 定的时候进行刷盘的操作。具体是哪些场景会触发刷盘的操作呢?总结成下面的几个场景:
全局内存控制
这个全局的参数是控制内存整体的使用情况,当所有memstore占整个heap的最大比 例的时候,会触发刷盘的操作。这个参数是 hbase.regionserver.global.memstore.upperLimit,默认为整个heap内存的40%。 但这并不意味着全局内存触发的刷盘操作会将所有的MemStore都进行输盘,而是通过 另外一个参数hbase.regionserver.global.memstore.lowerLimit 来控制,默认是整个 heap内存的35%。当flush到所有memstore占整个heap内存的比率为35%的时 候,就停止刷盘。这么做主要是为了减少刷盘对业务带来的影响,实现平滑系统负载的 目的。
MemStore达到上限
当MemStore的大小达到hbase.hregion.memstore.flush.size大小的时候会触发刷 盘,默认128M大小。
RegionServer的 Hlog 数量达到上限
Hlog为了保证Hbase数据的一致性,那么如果Hlog太多的话,会导致故障 恢复的时间太长,因此Hbase会对Hlog的最大个数做限制。当达到Hlog的最大个数 的时候,会强制刷盘。这个参数是hase.regionserver.max.logs,默认是32个。
手工触发
可以通过hbase shell或者java api手工触发flush的操作。
关闭 RegionServer触发
在正常关闭RegionServer会触发刷盘的操作,全部数据刷盘后就不需要再使用Hlog恢复数据。
Region使用 HLOG恢复完数据后触发
当RegionServer出现故障的时候,其上面的Region会迁移到其他正常的 RegionServer上,在恢复完Region的数据后,会触发刷盘,当刷盘完成后才会提供给 业务访问。
(6)HBase vs Cassandra