HBase
一、HBase原理
1.1 什么是NoSQL
NoSQL:not only SQL,非关系型数据库
NoSQL是一个通用术语
- 指不遵循传统RDBMS模型的数据库
- 数据是非关系的,且不使用SQL作为主要查询语言
- 解决数据库的可伸缩性和可用性问题
- 不针对原子性或一致性问题
1.2 NoSQL和关系型数据库对比
主要有以下区别:
二、HBase概述
HBase是一个领先的NoSQL数据库
是一个面向列存储的NoSQL数据库
是一个分布式Hash Map,底层数据是Key-Value格式
使用HDFS作为存储
并利用其可靠性
2.1 特点
数据访问速度快
,响应时间约2-20毫秒支持随机读写
,每个节点20k~100k+ ops/s可扩展性
,可扩展到20,000+节点高并发
三、HBase架构原理
3.1 HBase架构
HBase也是Master/slave
架构,HBase安装成功后,是有一个HMaster,多个HResgionServer进程。 Master/slave架构的有:HDFS、YARN、Zookeeper、HBase,HBase架构如下所示:
从图中可以看出,HBase是由Client、Zookeeper、HMaster(主节点)、HRegionServer(从节点)、HDFS等几个组件组成。可以看出HBase底层是在HDFS上存储。
Client
:客户端,用来操作HBase的HMaster
:
①、主节点,一个集群中一般只有一个活跃的HMaster,多个HRegionServer
。
②、负责处理ResgionServer的故障转移
,它会把这台RegionServer的数据转移给另外一台RegionServer,数据是存储在HDFS上,RegionServer其实是存储的地址,这些地址在HMaster上是有存储的,而HMaster只需要把这些存储的地址放到另外一台上就行。
③、负责region分裂后的分配
,达到负载均衡,防止某一台RegionServer上的数据过多,别的节点数据很少。
④、维护了一部分的元数据,处理元数据的变更,类似于NameNode。RegionServer
:
①、负责处理客户端对数据的读写请求(实际干活的节点,响应客户端的读写),负责跟HDFS交互
②、处理HMaster分配给它的region,管理维护Region,负责存储,维护HLog
③、一个RegionServer包含一个WAL、一个BlockCache(读缓存)和多个RegionHRegion
:
①、HRegion是HBase集群分布数据的最小单位
,比如:一张表很大,可以分成很多,一个分片放在一个Region上,类似于HDFS中的Block
②、一个HRegion只能分配给一个RegionServer,不能跨多个 HRegionServer
,可以类比于一个Block块只能放在一个DataNode上
③、一个Region中划分多个Store
,这个Store可以理解为对应多个列族
④、MemStore:,可以理解为内存
。写数据时,会先写到MemStore(128M)中,然后根据对应的列族找到相应的Store,超过128M会溢写到磁盘,形成一个一个StoreFile,底层是一个一个HFile。一个StoreFile在HDFS上对应一个HFile和一个列族Zookeeper
:
①、负责HRegionServer的监控的状态
,看它有没有荡机或者变动。
②、客户端通过zookeeper获取存储在HBase上的元数据地址
,看元数据在哪个HRegionServer上。
③、个人理解:如果有一个RegionServer荡机了,它只能监控,不能处理,所以它需要和HMaster保持通信,交由HMaster处理。
6、Store
:
每一个Region内部,又分为多个Store,一个 Store 对应表中的一个列族。
也就是说一个 Store 存储了对应表该列族下的部分数据。
7、MemStore
:
顾名思义,就是内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在 WAL 中之后,HRegsionServer 会在内存中存储键值对。
8、HFile
:
这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。StoreFile是以 HFile 的形式存储在 HDFS 的。文件内容是二进制。
三、HBase元数据管理
- 系统目录表:hbase:meta -> 存储元数据
zookeeper也会存储一部分元数据信息,存储hbase:meta表的位置信息 - HBASE实际数据存储在HDFS上
图中有多个region,一个region中有多个列族,元数据信息都存储在系统目录表hbase.meta中,HBASE表存储在RegionServer上
**打开HBASE网页
hbase:meta表是存储元数据信息的
hbase:namespace是存储命名空间的
HBASE在HDFS上的目录结构
从图中可以看出,元数据表是存储在RegionServer上的
四、HBase常用命令
##在hbase中输入错误删除是Ctrl+退格键
命名空间类似hive中的数据库
1、hbase shell:进入hbase
hbase shell
2、help:查看系统命令
help
3、version:查看版本
version
1.2.0-cdh5.14.2, rUnknown, Tue Mar 27 13:31:54 PDT 2018
4、whoiam
whoami
root (auth:SIMPLE)
groups: root
5、status:查看进行的状态
status
=> 1 active master, 0 backup masters, 1 servers, 0 dead, 6.0000 average load
6、list:查看库和表
list
7、create_namespace 库名
create_namespace 'test'
8、create ‘库名:表名’,‘列族1’,‘列族2’
create 'test:student','stu_info','basicinfo'
9、PUT ‘NAMESPACE:TABLE’,‘ROW_KEY_UNIQUE’,‘FAMILY:COLUMN’,‘VALUE’:导入数据
put 'test:student','1','stu_info:name','lisi'
10、get ‘NAMESPACE:TABLE’,‘FAMILY:COLUMN’:查看数据
get 'test:student','1','stu_info:name'
问题:为什么hdfs下的hbase中这个列族下没有数据呢?
原因:因为一开始数据写到MemStore中,没有达到一定的阈值,不会往磁盘里写,只写到内存,达到一定大小后会往磁盘里写。
或者我们可以自动往磁盘里刷写,用flush
10、flush ‘NAMESPACE:TABLE’ :手动往磁盘里写数据
flush 'test:student'
这个时候,stu_info下就有数据了
11、hbase hfile -v -p -f hdfs下的路径到文件夹:如何去查看列族下这个文件
hbase hfile -v -p -f /hbase/data/test/student/024f7320b31ce4b4ab49605d13cbffda/stu_info/41a2dae93aa74d098118f1beb47788ac
12、desc ‘NAMESPACE:TABLE’:查看表的信息
desc 'test:student'
12、scan ‘NAMESPACE:TABLE’:扫描表数据
put 'test:student','2','stu_info:name','lisi'
scan 'test:student'
13、alter ‘库名:表名’,{列族,修改项}
alter 'test:student',{stu_info=>'name',VERSION=>5}
14、drop_namespace 命名空间
drop namespace 'test'
enabled说明这张表正在使用,要删除首先要disabled
15、count ‘命名空间:表’ :统计表数据行数
count 'test:student'
16、delete ‘命名空间:表’:删除数据
deleteall 'test:student','1' // 指定的rowkey
只剩一条数据了
16、truncate 命名空间:表
truncate 'test:student'
先禁用,再清空
17、is_disabled:查看表是否处于禁用状态
is_disabled 'test:student'
说明清空完数据后它又把表enable打开了
18、drop ‘namespace:table’
需要手动disabled
drop 'test:student'
五、数据读写流程
1、读数据流程:
- 客户端向zookeeper发送请求,获取元数据所在的RegionServer。
- 返回客户端meta所在RegionServer位置信息
- 请求rowkey所在region,这个region在哪个RegionServer上(因为一张表分成了多个region,多个region可能在多个RegionServer上)
- 返回给客户端所在rowkey在哪个RegionServer上
- 客户端发送读请求给对应的RegionServer
读数据中的一些细节:
首先在Memstore中找数据,如果Memstore中没有找到,就去bloockcache中找数据,如果blockcache中还没有数据,说明就是落盘了,去StoreFile中读取数据。读到数据后,不会立即返回给客户端,加载到blockcache缓存中,再返回给客户端,下次直接从缓存中访问。
不建议使用scan
原因:scan是把整张表往缓存中加,但是缓存是有限的,新数据加载到缓存中,原有数据可能因为内存原因被替换掉一部分
2、写数据流程:
- Client 访问 ZooKeeper,获取 元数据位置信息(hbase:meta)
- 返回客户端元数据位置信息
- 访问 Meta 表,然后读取 Meta 表中的数据。
- 根据 namespace(类似与关系型数据库中的数据库)表名和 RowKey 在 Meta 表中找到该 RowKey 应该写入到哪个Region。
- 找到这个 Region 对应的 RegionServer,并发送写数据请求
- HRegionServer 将数据先写到 HLog(Write Ahead Log)。为了数据的持 久化和恢复;HLog是先写到内存,logsync(同步进程)是每一秒把内存中的内存写到磁盘。
- HRegionServer 将数据写到内存(MemStore);
- 反馈 Client 写成功。
- 写数据这一块也可以看出,HBase 将数据写入到内存中后,就返回给客户端写入成功,响应非常快。这也是为什么 HBase
写数据速度快的原因。
(整个的读写流程和HMaster无关,比如:kill掉HMaster进程,读写数据都是可以的)
六、数据Flush过程
- HBase写数据写入到MemStore内存就会返回客户端,没有直接落盘,因此磁盘IO小插入数据速度快
- 但当MenStore数据达到阀值(128M)时,HRS将数据刷到HDFS上生成HFile,然后将内存中的数据删除,同时删除HLog中的历史数据。
- 该操作由HRS自己完成。