一、什么是 Hbase
Hbase 是一个构建在 Hadoop 之上的高可用、高性能、多版本的分布式 NOSQL 数据库。
二、Hbase 的特点
2.1、与 hdfs 对比
Hbase 是构建在 Hadoop 之上的,Hadoop 不支持随即写,但 Hbase 支持。
2.2 、与传统数据库的比较:
1、传统数据库无法存储很大量的数据,但 Hbase 可以通过增加节点的方式来存储海量数据。
2、传统数据库没有很好的备份机制,但 Hbase 把的文件存储是基于 hdfs 的,又健全的备份机制。
3、传统数据库当数据量达到一定规模时速度就会很慢,而 Hbase 通过 Zookeeper 协调查找数据,访问速度快。
三、Hbase 存储数据的结构
3.1 逻辑结构
从逻辑视图来看,Hbase 的数据是以表的形式组织的,而且和关系型数据库中的一样,Hbase 的表由行和列构成。
解释图中的元素:
1、RowKey
rowkey 是用来检索记录的主键。访问 hbase table 中的数据,只有三种方式:通过单个 rowkey 访问;通过 rowkey 的范围;全表扫描。
rowkey 可以是任意字符串,存储时,数据按照 row key 的字典排序。因此在设计 key 时,要充分利用排序存储这一特性,将经常一起读取的行存储放到一起。
2、列簇(column family)
hbase 表中的每个列,都归属于某个列簇,列簇时 scheme 的一部分(而列不是),列命都以列簇为前缀。
3、单元(cell)
hbase 中通过 row 和 columns 确定的唯一一个存储单元称为 cell。
cell 是没有数据类型的,全都是以字节码的形式存储。
4、时间戳(timestamp)
每个 cell 都保持着同一数据的多个版本,版本通过时间戳来索引。
3.2 物理结构
把每一个列簇单独地存储成一列,可以极大地节省空间。
三、Hbase 架构
解释图中元素:
1、Client
客户端访问 hbase 数据之前,首先通过源数据表定位目标数据所在的 RegionServer,之后才会发送请求到 RegionServer,同时这些元数据会被缓存到本地,方便以后的请求访问。如果 RegionServer 因为发生宕机或者执行了负载均衡等导致数据分片发生迁移,客户端需要重新请求最新的元数据并缓存到本地。
2、Zookeeper
Zookeeper 是一个分布式的协调服务。
在 hbase 中,Zookeeper 负责管理 Hbase 的核心元数据,如 Master 和 RegionServer 的状态、元数据表所在的 RS 地址等。
3、Master
1)Master 负责处理用户的管理请求,例如:用户的增删改查操作。
2)协调 RegionServer:为 RS 分配 Region;发现失效的 RS 并重新分配位于其上的 Region;通过 ZK 监控集群上所有 RS 的运行状态。
3)清理过期的 HLog 和 HFile
4、RegionServer
1)响应用户的 I/O 请求,向 HDFS 中读写数据。
2)内部管理了一系列 HRegion 对象,每个 HRegion 对应 table 中的一个 Region,HRegion 由多个 Htore 组成,每个 Store 对应 table 中的一个 列簇。
5、HLog
1)实现数据的高可靠性:hbase 数据写入并不是直接写入 HFile,而是先写入缓存,再异步刷新罗盘。为防止数据丢失,数据写入缓存之前先写入 HLog,这样,即使缓存数据丢失,仍然可以通过 HLog 恢复。
2)用于 hbase 集群间数据同步:通过回放主机群推送过来的 HLog 来实现主从集群间的数据同步。
6、BlockCache
客户端从磁盘读取数据之后通常会将数据缓存到系统内存中,后续访问同一行数据可直接从内存中获取,对于大量热点读的业务请求来说,带来了极大的性能提升。
7、Region
hbase 用 rowkey 把表 “水平切割” 成多个 Region,Region 代表的是数据表的一个分片,通常一个表的 Region 会分布在整个集群的多个 RS 上,一个 RS 上会存放来自不同表的多个 Region。
四、Hbase 读写数据流程
4.1 写数据流程
1、客户端处理阶段
1)客户端提交 put 请求后,会将数据添加到本地缓冲区中,符合一定条件时就异步批量提交。
2)客户端到 hbase:meta 中根据 rowkey 找到它们归属的 RegionServer。批量请求时会把这些 rowkey 按照不同的 RegionServer 分组。
3)客户端发送 RPC 请求给对应的 RegionServer。
2、Region 写入阶段
1)RS 收到请求后,首先反序列化 put 对象,执行各种检查(region是否只读,Memstore是否超过指定大小等)
2).建立行锁(Acquire locks)->2.更新写入时间->3.创建WAL edit对象->4.WAL edit写入Hlog->5.数据写入MemStore->6.释放行锁->7.刷写Hlog到HDFS->8.结束事务
3、MemStore Flusn 阶段
当Region中的MemStore容量超过一定阈值,系统会异步执行flush操作,将内存中的数据写入文件,形成HFile
4.2 读数据流程
1、第一次读数据
1)从 Zookeeper 中获取 hbase:meta 的位置,缓存该位置信息
2)从 hbase:meta 中查询用户 table 对应请求的 rowkey 所在的 RegionServer,缓存该位置信息。
3)从查询到的 HRegionServer 中读取 Row。
2、第一次以后读数据
先查询缓存里能不能找到 Row 对应的 RegionServer,找到就直接做上面的第三步,找不到就依据情况从第一或者第二步开始。