介绍

Hbase是一个分布式、可伸缩的、面向列的高性能NoSql存储系统,由于其依赖于Hadoop系统,所以可运行在低成本的机器集群上。不同于传统关系型数据库,它是面向列的存储,能提供海量数据的高性能写入和读取,因此广泛应用于大数据领域非结构化数据的存储和查询系统。

Table组成和数据存储

和传统数据库一样,Hbase也有表格(Table)概念。传统数据库是数据是水平结构、行式存储,每一行数据结构都是一样的;而Hbase是以列式存储,每一行数据结构都有可能不同,因此Hbase中Table结构异于传统数据库的表。
Table结构
Hbase中Table包含一到多个列族(Column Family),官方建议列族不要超过3个
传统数据库表:

create table test(id int,name varchar(20),age int);

Hbase的表:
test为表名,f1为列族名称,多个列族“,”分隔

create ‘test’, ‘f1’

从上边可以看出,传统数据库中Table结构包含表名和列名,表中每一条数据结构都已经固定;而Hbase的Table只包含表名和列族名,每一条数据结构都有可能不同。
Table中数据存储视图
传统数据库数据是按照表结构的column存储的,表中所有数据结构都一样。而Hbase表中每一条数据由一个唯一rowkey和一个列族值组成,列族值是以列族名:字段名构成,每一行Hbase都会添加一个时间戳timestamp和一个版本号version。
传统数据存储视图:

id

name

age

1

tom

12

2

jerry

15




Hbase中数据存储视图:

Hbase中的表主要逻辑结构 简述hbase的表结构组成_数据结构


Hbase中每一行记录都有一个全局唯一rowkey,列族中数据可随意存储,可以有一个属性也可以有多个属性。

架构组成

Hbase中的表主要逻辑结构 简述hbase的表结构组成_表名_02


Hbase运行组件主要包括HMaster、HRegionServer、HRegion、Store、MemStore、StoreFile、HFile、HLog。

**HMaster:**通常和Hadoop的NamaNode运行在同一节点,负责监控和管理所有的HRegionServer,例如Region分配、负载均衡等。管理所有表和Region元数据信息,例如表结构的存储和修改。Master有HA机制,由zookeeper管理切换。

注意:客户端对Hbase集群的读写均不经过Master,而是通过zookeeper找到RegionServer,直接访问对应的Region。

**HRegionServer:**通常和NameNode运行在同一节点,负责Region的管理。例如Region的读写请求、Region分裂和合并等。
**HRegion:**是表在分布式存储中最小单元,每个表都有一到多个Region,这些Region分布在不同的节点中,一个Region是不可拆分到多个节点的。一个Region由一系列的Store组成,每个列族对应一个Store。

Region结构树

Hbase中的表主要逻辑结构 简述hbase的表结构组成_表名_03

**Store:**一个列族(Colomn Family)对应一个Store,每个Region都包含一个Store。
**MemStore:**存在于内存中用于缓存数据,当达到一定阈值后,统一将缓存中的数据flush到StoreFile中。
StoreFile: MemStore数据flush到文件后就是StoreFile。
HFile: 等同于StoreFile,StoreFile在HDFS上就是HFile
**HLog:**即WAL log,WAL意为Write Ahead Log,用来做灾难恢复使用,HLog记录数据的所有变更,一旦region server 宕机,就可以从log中进行恢复。

客户端读写过程

Hbase中的表主要逻辑结构 简述hbase的表结构组成_Hbase中的表主要逻辑结构_04


从图中可以看出(上边也提到过),客户端读写集群是不需要经过Master的,而是直接连接RegionServer进行读写请求。

写入数据:

1、clinet连接zookeeper,通过表名和写入的数据从meta表获取region信息和RegionServer节点信息
2、直接向对应的RegionServer发起写入请求,一般数据都是批量写入(BulkLoad)
3、如果开启了WAL,数据会先写入日志中,防止数据丢失。为了减少IO操作,数据不是直接写入Table的存储文件中,而是先写入缓存MemStore中,达到阈值后批量将数据写入文件
注意:当StoreFile数量达到阈值后,会触发compact动作,多个小文件合并为一个大文件。当一个Region中StoreFiles文件大小超过Region设定值后会触发spilt动作,由一个Region分裂为两个Region。

读取数据:

1、clinet连接zookeeper,通过表名和写入的数据从meta表获取region信息和RegionServer节点信息
2、直接向对应的RegionServer发起读取请求
3、RegionServer处理客户端读取请求,找到对应的Region
4、先从MemStore里读取数据,如果没有再从StoreFile文件中读取数据返回给client

Shell命令

进入bin目录运行以下命令

hbase shell
 输入help可查看帮助信息
 创建表,必须表名和列族名,多个列族用“,”隔开
 create ‘test’, ‘cf’
 查看表
 list ‘test’
 查看表结构
 desc ‘test’
 插入数据
 put ‘test’, ‘row1’, ‘cf:a’, ‘value1’
 扫描表全部数据
 scan ‘test’
 获取某条数据
 get ‘test’, ‘row1’
 禁用/启用表
 disable ‘test’
 enable ‘test’
 删除表,先禁用再删除
 disable ‘test’
 drop ‘test’
 退出shell
 exit

hbase shell包含很多功能,可参考help使用。

水平一般,能力有限,大数据小学生一枚。文章主要用于个人学习和总结,如果能给他人带来帮助,纯属意外。