什么是Hbase?
HBase是一个高可靠性,高性能,面向列,可伸缩式的分布式存储系统
HBase的目标是存储并处理大型的数据(具体说是仅需使用普通的硬件配置,就能够处理由成千上万的行和列所组成的大型数据)
Hbase特点
海量存储、
列式存储、
极易扩展(
基于上层处理能力的扩展(RegionServer)
基于存储的扩展(HDFS)
通过横向添加RegionServer机器,进行水平扩展,进行Hbase上层处理能力,即提升Hbase服务更多Region的能力)、
高并发(指并发情况下,单个io的延迟下降并不多)、
稀疏(列数据为空不会占用存储空间)
HBase架构
Hbase物理架构
Hbase采用Master/Slave架构
HMaster、RegionServer、Zookeeper、Hbase Client、Region
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KvaSxBSV-1595333610647)(…/…/…/…/Pictures/Typora/image-20200720094831309.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PL9otZys-1595333610649)(…/…/…/…/Pictures/Typora/image-20200720102146869.png)]
HMaster
Hmaster是Hbase集群的主节点,可配置多个,实现HA(高可用)
用于管理和分配Region
负责RegionServer的负载均衡
发现失效的RegionServer并重新分配其上的Region
RegionServer
负责管理维护Region
一个RegionServer包含一个WAL(写日志用Hlog)、一个BlockCache(读缓存)、多个Region
一个Region包含多个存储区(store),每个存储区对应一个列簇
一个存储区由多个StoreFile和MemStore组成
HFile和WAL作为序列文件保存在HDFS上
Client与RegionServer交互
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g6GFuRMY-1595333610651)(…/…/…/…/Pictures/Typora/image-20200720095230125.png)]
Region 和Table
单个Table(表)被分区成大小大致相同的Region
Region是Hbase集群分布数据的最小单位
Region被分配给集群中的RegionServer
一个Region只能分配给一个RegionServer
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-De8aeIph-1595333610653)(…/…/…/…/Pictures/Typora/image-20200720095315309.png)]
Hbase逻辑架构
Row
Rowkey(行键)是唯一的并已排序
Schema可以定义合适插入记录
每个Row都可以定义自己的列,及时其他Row不使用(相关列定义为列族)
使用唯一时间戳维护多个Row版本(Hbase表具有多版本)
Hbase数据全部以字节存储
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L6foS9r4-1595333610654)(…/…/…/…/Pictures/Typora/image-20200720101248534.png)]
Hbase元数据管理
系统管理目录
系统目录表hbase:meta:存储元数据等
ZooKeeper存储hbase:meta表的位置信息
Hbase实际数据存储在HDFS上
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LN3L4kLy-1595333610656)(…/…/…/…/Pictures/Typora/image-20200720172932651.png)]
HBase数据结构
row-key
column family
cell
timestamp
命名空间
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jkqOnxHC-1595333610657)(…/…/…/…/Pictures/Typora/clip_image001.png)]
Table:表,所有的表都是命名空间的成员,即表必属于某个命名空间,如果没有指定,则在default默认的命名空间中。
RegionServer group:一个命名空间包含了默认的RegionServer Group。
Permission:权限,命名空间能够让我们来定义访问控制列表ACL(Access Control List)。例如,创建表,读取表,删除,更新等等操作。
Quota:限额,可以强制一个命名空间可包含的region的数量。
HBase原理
读流程
- client 访问zookeeper,从meta表中读取region的位置,然后读取meta表中的数据,meta表中存储了用户表的meta信息
- 根据namespace、表名和rowkey在meta表中获取对应的region信息
- 找到这个region对应的regionserver
- 查找对应的region
- 先从memstore找数据,如果没有,再到BlockCache里面读
- 如果BlockCache也没有,再到storeFile上读(为了读取效率)
- 从storefilel里读的数据,不是直接返回客户端,而是先写入blockcache,再返回客户端
写流程
- client 发送请求给 zk集群 ,获取meta表所在的RS(RegionServer)
- zk集群 返回meta表所在的rs 给client
- client 向HRegionServer发送请求获取meta表
- HRegionServer 返回meta表数据给 client
- client 向HRegionServer发送写数据请求
- 写入Hlog(WAL)
- 将数据写入memstore
- 反馈给client写入成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SEseUEMv-1595333610658)(…/…/…/…/Pictures/Typora/clip_image002-1595237990123.png)]
数据Flush过程
-
当memstore数据达到阀值(默认128M,老版本64M),将数据刷到硬盘,将内存中的数据删除,同时删除hlog中的历史数据
-
将数据存储到hdfs中
-
在hlog中做标记点
数据合并过程
-
当数据块达到4块,Hmaster触发合并操作,Region将数据块加载到本地,进行合并;
-
当合并的数据超过256M,进行拆分,将拆分后的Region分配给不同的HregionServer管理;
-
当HregionServer宕机后,将HregionServer上的hlog拆分,然后分配给不同的HregionServer加载,修改.META.(宕机后,hlog拆分后划分给其他rs)
注意:HLog会同步到HDFS。
HBase API操作
环境准备
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-common</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>1.2.0</version>
</dependency>
HBase API
获取Configuration对象
//1.创建配置
Configuration conf = HBaseConfiguration.create();
//配置zookeeper的集群和端口
conf.set("hbase.zookeeper.quorum","hadoop1");
conf.set("hbase.zookeeper.property.clientPort", "2181");
<