介绍
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中每一行记录都有一个全局唯一rowkey,列族中数据可随意存储,可以有一个属性也可以有多个属性。
架构组成
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结构树
**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中进行恢复。
客户端读写过程
从图中可以看出(上边也提到过),客户端读写集群是不需要经过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使用。
水平一般,能力有限,大数据小学生一枚。文章主要用于个人学习和总结,如果能给他人带来帮助,纯属意外。