HBase架构原理

一、HBase原理

1.1 什么是NoSQL

NoSQL:not only SQL,非关系型数据库
NoSQL是一个通用术语

  1. 指不遵循传统RDBMS模型的数据库
  2. 数据是非关系的,且不使用SQL作为主要查询语言
  3. 解决数据库的可伸缩性和可用性问题
  4. 不针对原子性或一致性问题

1.2 NoSQL和关系型数据库对比

主要有以下区别:
在这里插入图片描述

二、HBase概述

HBase是一个领先的NoSQL数据库
是一个面向列存储的NoSQL数据库
是一个分布式Hash Map,底层数据是Key-Value格式
使用HDFS作为存储并利用其可靠性

2.1 特点

  1. 数据访问速度快,响应时间约2-20毫秒
  2. 支持随机读写,每个节点20k~100k+ ops/s
  3. 可扩展性,可扩展到20,000+节点
  4. 高并发

三、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上存储。

  1. Client:客户端,用来操作HBase的
  2. HMaster
    ①、主节点,一个集群中一般只有一个活跃的HMaster,多个HRegionServer
    ②、负责处理ResgionServer的故障转移,它会把这台RegionServer的数据转移给另外一台RegionServer,数据是存储在HDFS上,RegionServer其实是存储的地址,这些地址在HMaster上是有存储的,而HMaster只需要把这些存储的地址放到另外一台上就行。
    ③、负责region分裂后的分配,达到负载均衡,防止某一台RegionServer上的数据过多,别的节点数据很少。
    ④、维护了一部分的元数据,处理元数据的变更,类似于NameNode。
  3. RegionServer
    ①、负责处理客户端对数据的读写请求(实际干活的节点,响应客户端的读写),负责跟HDFS交互
    ②、处理HMaster分配给它的region,管理维护Region,负责存储,维护HLog
    ③、一个RegionServer包含一个WAL、一个BlockCache(读缓存)和多个Region
  4. HRegion
    ①、HRegion是HBase集群分布数据的最小单位,比如:一张表很大,可以分成很多,一个分片放在一个Region上,类似于HDFS中的Block
    ②、一个HRegion只能分配给一个RegionServer,不能跨多个 HRegionServer,可以类比于一个Block块只能放在一个DataNode上
    ③、一个Region中划分多个Store,这个Store可以理解为对应多个列族
    ④、MemStore:,可以理解为内存。写数据时,会先写到MemStore(128M)中,然后根据对应的列族找到相应的Store,超过128M会溢写到磁盘,形成一个一个StoreFile,底层是一个一个HFile。一个StoreFile在HDFS上对应一个HFile和一个列族
  5. Zookeeper
    ①、负责HRegionServer的监控的状态,看它有没有荡机或者变动。
    ②、客户端通过zookeeper获取存储在HBase上的元数据地址,看元数据在哪个HRegionServer上。
    ③、个人理解:如果有一个RegionServer荡机了,它只能监控,不能处理,所以它需要和HMaster保持通信,交由HMaster处理。
    6、Store:
    每一个Region内部,又分为多个Store,一个 Store 对应表中的一个列族。
    也就是说一个 Store 存储了对应表该列族下的部分数据。
    7、MemStore:
    顾名思义,就是内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在 WAL 中之后,HRegsionServer 会在内存中存储键值对。
    8、HFile
    这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。StoreFile是以 HFile 的形式存储在 HDFS 的。文件内容是二进制。
    在这里插入图片描述

三、HBase元数据管理

  1. 系统目录表:hbase:meta -> 存储元数据
    zookeeper也会存储一部分元数据信息,存储hbase:meta表的位置信息
  2. HBASE实际数据存储在HDFS上

在这里插入图片描述
图中有多个region,一个region中有多个列族,元数据信息都存储在系统目录表hbase.meta中,HBASE表存储在RegionServer上
**打开HBASE网页
**打开网页上的HBASE:xxxx.60010
在这里插入图片描述
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、读数据流程:
在这里插入图片描述

  1. 客户端向zookeeper发送请求,获取元数据所在的RegionServer。
  2. 返回客户端meta所在RegionServer位置信息
  3. 请求rowkey所在region,这个region在哪个RegionServer上(因为一张表分成了多个region,多个region可能在多个RegionServer上)
  4. 返回给客户端所在rowkey在哪个RegionServer上
  5. 客户端发送读请求给对应的RegionServer
    读数据中的一些细节:
    首先在Memstore中找数据,如果Memstore中没有找到,就去bloockcache中找数据,如果blockcache中还没有数据,说明就是落盘了,去StoreFile中读取数据。读到数据后,不会立即返回给客户端,加载到blockcache缓存中,再返回给客户端,下次直接从缓存中访问。

在这里插入图片描述


不建议使用scan
原因:scan是把整张表往缓存中加,但是缓存是有限的,新数据加载到缓存中,原有数据可能因为内存原因被替换掉一部分

2、写数据流程:
在这里插入图片描述

  1. Client 访问 ZooKeeper,获取 元数据位置信息(hbase:meta)
  2. 返回客户端元数据位置信息
  3. 访问 Meta 表,然后读取 Meta 表中的数据。
  4. 根据 namespace(类似与关系型数据库中的数据库)表名和 RowKey 在 Meta 表中找到该 RowKey 应该写入到哪个Region。
  5. 找到这个 Region 对应的 RegionServer,并发送写数据请求
  6. HRegionServer 将数据先写到 HLog(Write Ahead Log)。为了数据的持 久化和恢复;HLog是先写到内存,logsync(同步进程)是每一秒把内存中的内存写到磁盘。
  7. HRegionServer 将数据写到内存(MemStore);
  8. 反馈 Client 写成功。
  9. 写数据这一块也可以看出,HBase 将数据写入到内存中后,就返回给客户端写入成功,响应非常快。这也是为什么 HBase
    写数据速度快的原因。
    (整个的读写流程和HMaster无关,比如:kill掉HMaster进程,读写数据都是可以的)

六、数据Flush过程

  1. HBase写数据写入到MemStore内存就会返回客户端,没有直接落盘,因此磁盘IO小插入数据速度快
  2. 但当MenStore数据达到阀值(128M)时,HRS将数据刷到HDFS上生成HFile,然后将内存中的数据删除,同时删除HLog中的历史数据。
  3. 该操作由HRS自己完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值