编辑
👨🏻🎓博主介绍:大家好,我是芝士味的椒盐,一名在校大学生,热爱分享知识,很高兴在这里认识大家🌟
🌈擅长领域:Java、大数据、运维、电子
🙏🏻如果本文章各位小伙伴们有帮助的话,🍭关注+👍🏻点赞+🗣评论+📦收藏,相应的有空了我也会回访,互助!!!
🤝另本人水平有限,旨在创作简单易懂的文章,在文章描述时如有错,恳请各位大佬指正,在此感谢!!!
目录
概念
- HBase是一个基于HDFS口的非关系型面向列的分布式数据库。这是一个
NoSQL
开源数据库,其中的数据存储在行和列中。单元格是行和列的交集。 - 每个单元格值都包含一个"版本”属性,该属性仅是唯一标识该 单元格的时间戳。映射中的每个值都是不间断的字节数组
特点
- 海量存储
- Hbase适合存储PB级别的海量数据,在PB级别的数据以及采用廉价PC存储的情况下,能在几十到百毫秒内返回数据。这与Hbase的极易扩展性息息相关。正式因为Hbase良好的扩展性,才为海量数据的存储提供了便利
- 列存储
- 这里的列式存储其实说的是列族(ColumnFamily)存储,Hbase是根据列族来存储数据的。列族下面可以有非常多的列,列族在创建表的时候就必须指定
- 极易扩展
- Hbase的扩展性主要体现在两个方面,一个是基于上层处理能力(RegionServer)的扩展,一个是基于存储的扩展(HDFS)。 通过横向添加RegionSever的机器,进行水平扩展,提升Hbase上层的处理能力,提升Hbsae服务更多Region的能力。
- 备注:RegionServer的作用是管理region、承接业务的访问,这个后面会详细的介绍通过横向添加Datanode的机器,进行存储层扩容,提升Hbase的数据存储能力和提升后端存储的读写能力。
- 高并发
- 由于目前大部分使用Hbase的架构,都是采用的廉价PC,因此单个IO的延迟其实并不小,一般在几十到上百ms之间。这里说的高并发,主要是在并发的情况下,Hbase的单个IO延迟下降并不多。能获得高并发、低延迟的服务。
- 稀疏
- 稀疏主要是针对Hbase列的灵活性,在列族中,你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的。
分布式
- 分布式用户编辑
- 为了解决分布式用户下集群上session类的用户数据进行更好的进程之间通信,减少程序进程之间的通信消耗演变而来的——Spring
- 分布式系统编辑
- 客户负载均衡编辑
- 并发:指的是线程的并发,抢占资源
- s并行:指的是进程的并行,多核cpu,同时进行
- 去中心化,无需负载均衡的引导,都会知道数据的流向,这就是Redies无需负载均衡器中心,结点互相保留了信息
- hbase原理
编辑
hbase架构
编辑
- Region:分区
- HLog:预写日志
- Stor:列族
- ZK:zookeeper高可用,检测节点心跳
- HMaster:Hbase的集群master
- Men Store:Cache缓存
Hbase Shell操作
基本操作
1.进入HBase客户端命令行
hbase shell
- 查看帮助命令
hbase(main):001:0> help
- 查看当前数据库中有哪些表
hbase(main):002:0> list
表的操作
1.创建表
hbase(main):002:0> create 'student','info'
2.插入数据到表
hbase(main):003:0> put 'student','1001','info:sex','male' hbase(main):004:0> put 'student','1001','info:age','18' hbase(main):005:0> put 'student','1002','info:name','Janna' hbase(main):006:0> put 'student','1002','info:sex','female' hbase(main):007:0> put 'student','1002','info:age','20'
3.扫描查看表数据
hbase(main):008:0> scan 'student' hbase(main):009:0> scan 'student',{STARTROW => '1001', STOPROW => '1001'} hbase(main):010:0> scan 'student',{STARTROW => '1001'}
{STARTROW => '1001', STOPROW => '1001'}
:查看的是startrow(开始行)从1001(包含边界值),到stoprow(不包含边界值),比较的方式一类似ASCII码的逐位比较大小,若没有一位大于stoprow值则视为比其小。
4.查看表结构
hbase(main):011:0> describe 'student'
5.更新指定字段的数据
hbase(main):012:0> put 'student','1001','info:name','Nick' hbase(main):013:0> put 'student','1001','info:age','100'
- 覆盖原有的达到更新
6.查看“指定行”或“指定列族:列”的数据
hbase(main):014:0> get 'student','1001' hbase(main):015:0> get 'student','1001','info:name'
7.统计表数据行数
hbase(main):021:0> count 'student'
8.删除数据
删除某rowkey的全部数据:
hbase(main):016:0> deleteall 'student','1001'
删除某rowkey的某一列数据:
hbase(main):017:0> delete 'student','1002','info:sex'
9.清空表数据
hbase(main):018:0> truncate 'student'
- 提示:清空表的操作顺序为先disable,然后再truncate。
10.删除表
首先需要先让该表为disable状态:
hbase(main):019:0> disable 'student'
然后才能drop这个表:
hbase(main):020:0> drop 'student'
- 提示:如果直接drop表,会报错:ERROR: Table student is enabled. Disable it first.
11.变更表信息
将info列族中的数据存放3个版本:
hbase(main):022:0> alter 'student',{NAME=>'info',VERSIONS=>3} hbase(main):022:0> get 'student','1001',{COLUMN=>'info:name',VERSIONS=>3}
- VERSIONS:可以指定保存版本数量,put真正表示的新增,只不过展示数据的只展示最新的那条,想看之前的数据可以通过保存版本数据量之内的数据,结合TimeStamp时间戳进行判断。
scan 't1',{RAW ⇒true,VERSION ⇒ 10}
可以查看已经删除,但还没有被被真正的删除的隐藏起来找时机删除的信息
12.查看命名空间列表
hbase(main):007:0> list_namespace
13.创建命名空间
hbase(main):008:0> create_namespace 'infomation'
14.删除命名空间
hbase(main):009:0> drop_namespace 'infomation'
15.往创建的命名空间里添加表
hbase(main):010:0> create 'infomation:emp','info'
hbase数据结构
- RowKeyRowKey用于检索记录的主键,访问HBase table中的行有三种方式:
- 通过单个RowKey访问(get)
- 通过RowKey的range(正则)(like)
- 全表扫描(scan)
- RowKey行键可以是任意字符串(最大长度64KB,实际长度为10~100byte)RowKey保存为字节数组(字节压缩的能力更大,更好利用空间),存储时按照RowKey(byte order)的字典顺序存储。设计Rowkey时,要充分利用排序存储这个特性,将经常一起读取的行存储到一起(位置相关性)。
- Column Family
列族:HBase表中的每个列,都属于某个列族。列族是schema的一部分(列不是),必须在使用表定义之前定义。列名都以列族作为前缀,例如:course:history,course:math属于course这个列族。 - Cell
由{rowkey,column Family:column,version}唯一确定的单元。cell中的数据时没有类型的,全是字节码形式存储。(无类型、字节码) - Time Stamp
HBase中通过Rowkey和Columns确定的为一个存储单元称为cell。每个cell都保管着同一份数据的多个版本。 - Name Space(命名空间)编辑
1) Table:表,所有的表都是命名空间的成员,即表必属于某个命名空间,如果没有指定,则在default默认的命名空间中。
**2) RegionServer group:**一个命名空间包含了默认的RegionServer Group。
**3) Permission:**权限,命名空间能够让我们来定义访问控制列表ACL(Access Control List)。例如,创建表,读取表,删除,更新等等操作。
**4) Quota:**限额,可以强制一个命名空间可包含的region的数量。
HBase原理
- 读流程编辑
1)Client先访问zookeeper,从meta表读取region的位置,然后读取meta表中的数据。meta中又存储了用户表的region信息;
2)根据namespace、表名和rowkey在meta表中找到对应的region信息;
3)找到这个region对应的regionserver;
4)查找对应的region;
5)先从MemStore找数据,如果没有,再到BlockCache里面读;
6)BlockCache还没有,再到StoreFile(HFile)上读(为了读取的效率);
7)如果是从StoreFile(HFile)里面读取的数据,不是直接返回给客户端,而是先写入BlockCache,再返回给客户端。 - 写流程数据flush过程编辑
1)Client向HregionServer发送写请求;
2)HregionServer将数据写到HLog(write ahead log)。为了数据的持久化和恢复;
3)HregionServer将数据写到内存(MemStore);
4)反馈Client写成功。
数据flush过程
1)当MemStore数据达到阈值(默认是128M,老版本是64M),将数据刷到硬盘,将内存中的数据删除,同时删除HLog(预写日志)中的历史数据;
2)并将数据存储到HDFS中;
3)在HLog(预写日志)中做标记点。
数据合并过程
1)当数据块达到3块,Hmaster触发合并操作,Region将数据块加载到本地,进行合并;
2)当合并的数据超过256M,进行拆分,将拆分后的Region分配给不同的HregionServer管理;
3)当HregionServer宕机后,将HregionServer上的hlog(预写日志)拆分,然后分配给不同的HregionServer加载,修改.META.;
4)注意:HLog(预写日志)会同步到HDFS。