1.HBase介绍
1.1HBase简介
Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩、实时读写的分布式数据库。
利用Hadoop HDFS作为其文件存储系统,利用Zookeeper作为其分布式协同服务主要用来存储非结构化 和半结构化的松散数据(列存 NoSQL 数据库)。
1.2HBase优点
(1)容量大:Hbase单表可以有百亿列、百万列,数据矩阵横向和纵向两个维度所支持的数据量级都非常具有弹性。、
(2)面向列:面向列的存储和权限控制,并支持独立检索,可以动态增加列,即,可单独对列进行各方面的操作 列式存储,其数据在表中是按照某列存储的,这样在查询只需要少数几个字段的时候,能大大减少读取的数量。
(3)多版本:Hbase的每一个列的数据存储有多个Version,比如住址列,可能有多个变更,所以该列可以有多 个version
(4)高可靠性:WAL机制,保证数据写入的时候不会因为集群异常而导致写入数据丢失 Replication(复制)机制,保证了在集群出现严重的问题时候,数据不会发生丢失或者损坏 Hbase底层使用HDFS,本身也有备份。
(5)拓展性:底层依赖HDFS,当磁盘空间不足的时候,只需要动态增加datanode节点服务(机器)就可以了。
(6)高性能:底层的LSM数据结构和RowKey有序排列等架构上的独特设计,使得Hbase写入性能非常高。
2.HBase数据模型
HBase 是一个稀疏的、分布式、持久、多维、排序的映射,它以行键(row key),列簇(column Family),列名(Column Qualifier)和时间戳(timestamp)为索引。
2.1.NameSpace
命名空间是类似于关系数据库系统中的数据库的概念,它其实是表的逻辑分组。这种抽象为多租户相关功能奠定了基础。
命名空间是可以管理维护的,可以创建,删除或更改命名空间。
HBase有两个特殊预定义的命名空间:
- default-没有明确指定名称空间的表将自动落入此名称空间
- hbase-系统命名空间,用于包含HBase内部表
2.2.Table
Hbase的table由多个行组成。
2.3.RowKey
- RowKey 是用来检索记录的主键,是一行数据的唯一标识
- RowKey行键 (RowKey)可以是任意字符串(最大长度是64KB,实际应用中长度一般为 10- 100bytes),RowKey以字节数组保存。
- 存储时,数据按照RowKey的字典序(byte order)排序存储。设计RowKey时,要充分排序存储这个 特性,将经常一起读取的行存储放到一起。
2.4.Column Family
- 列族在物理上包含了许多的列与列的值,每个列族都有一些存储的属性可配置
- 将功能属性相近的列放在同一个列族,而且同一个列族中的列会存放在同一个Store中
- 列族一般需要在创建表的时候进行声明,而且一般一个表中的列族数不要超过3个(和后期的优化有关)
- 列隶属于列族,列族隶属于表
2.5. Column Qualifier
- 列族的限定词,理解为例的唯一标识,但是列标识是可以改变的,因此每一行可能有不同的列标识
- 使用的时候必须 列族:列
- 列可以根据需求动态添加或者删除,同一个表中不同行的数据列都可以不同
2.6. Timestamp
- 通过rowkey和column family,column qualifier确定的一个存贮单元通过时间戳来索引
- 每个cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面
- 为了避免数据存在过多版本中造成管理 (包括存贮和索引)负担,HBASE 提供了两种数据版本回收方式。(一是保存数据的最后n个版本,二是保存最近一段时间内的版本(比如最近七天))。
2.7. Cell
- Cell是由row,column family,column qualifier,version 组成的
- Cell中的数据是没有类型的,全部是字节码形式存贮(因为HDFS上的数据都是字节数组)
3.HBase访问方式
3.1. HBase shell
我们可以先用Hbase提供的命令行工具,位于hbase的/bin/目录下
(1)进入退出
hbase shell(访问HBase)
exit(退出)
(2)查看帮助信息
help
(3)查询服务器状态
status
(4)查看hive版本
version
3.1.1Shell实现DDL操作
1.创建一个表
语法:create '表命' , {NAME => , VERSIONS => }
例如:创建表t1,有两个family name:f1,f2,且版本数均为2例如:创建表t1,有两个family name:f1,f2,且版本数均为2
hbase(main)> create 't1',{NAME => 'f1', VERSIONS => 2},{NAME => 'f2', VERSIONS => 2}
还有一种非标准创建的语法,创建表member,列族是member_id,address,info,版本为1。如下:
hbase(main):011:0>create 'member','member_id','address','info'
2.获得表的描述
语法:describe
hbase(main):012:0>list
hbase(main):006:0>describe 'member'
3.删除一个列族,alter,disable,enable
假设之前建了3个列族,但是发现member_id这个列族是多余的,因为他就是主键,所以我们要将其删除
hbase(main):003:0>alter 'member',{NAME=>'member_id',METHOD=>'delete'}
将表enable
hbase(main):008:0> enable 'member'
4.列出所有的表
hbase(main):028:0>list
5.drop一个表
create 'temp_table','member_id','address','info'
hbase(main):029:0>disable 'temp_table'(删除表之前先将表禁用)
hbase(main):030:0>drop 'temp_table'
6.truncate此命令将删除并重新创建一个表
truncate '表名'
3.1.2. Shell实现DML操作
1.插入几条记录
put'member','guojing','info:age','24'
put'member','guojing','info:birthday','1987-06-17' put'member','guojing','info:company','alibaba'
注:现在表的数据都存在内存中,并没有落地到磁盘,如果这时想要落地到磁盘可以执行命令手动落地
命令:flush 'tablename'--(flush '表名')
2.更新一条记录 将scutshuxue的年龄改成99
hbase(main):004:0>put 'member','scutshuxue','info:age' ,'99'
3. 删除id为temp的值的‘info:age’字段
hbase(main):016:0>delete 'member','temp','info:age'
4.删除整行
hbase(main):001:0>deleteall 'member','xiaofeng'
5.查询表中有多少行
hbase(main):019:0>count 'member'
6.将整张表清空
hbase(main):035:0>truncate 'member'
3.1.3Shell实现DQL操作
1.获取一个Id的所有数据
hbase(main):001:0>get 'member','linghuchong'
2.获取一个id,一个列族的所有数据
hbase(main):002:0>get 'member','linghuchong','info'
3.获取一个id,一个列族中一个列的所有数据
hbase(main):002:0>get 'member','linghuchong','info:age'
4全表扫描
hbase(main):013:0>scan 'member'
4. HBase架构模型
HBase有三个主要组成部分:客户端库,主服务器和区域服务器。
4.1.Client
1.客户端负责发送请求到数据库,客户端连接的方式有很多种
- hbase shell
- 类JDBC
2.发送的请求主要包括
- DDL:数据库定义语言(表的建立,删除,添加删除列族,控制版本)
- DML:数据库操作语言(增删改)
- DQL:数据库查询语言(查询--全表扫描--基于主键--基于过滤器)
3.client维护着一些cache来加快对hbase的访问,比如regione的位置信息
4.2.HMaster
1.HBase集群的主节点,HMaster也可以实现高可用(active--standby),通过Zookeeper来维护主副节点的切换。
2.为Region server分配region并负责region server的负载均衡。
3.管理用户对table的结构DDL(创建,删除,修改)操作。
4.当HRegionServer下线的时候,HMaster会将当前HRegionServer上的Region转移到其他的 HRegionServer。
4.3.zookeeper
1.保证任何时候,集群中只有一个master
2.存贮所有Region的寻址入口,存储所有的的元数据信息。
3.实时监控Region Server的状态,将Region server的上线和下线信息实时通知给Master
4.存储Hbase的schema,包括有哪些table,每个table有哪些column famil
4.4. HRegionServer
1.Region server属于HBase具体数据的管理者
2.Region server维护Master分配给它的region,处理对这些region的IO请求
3.会实时的和HMaster保持心跳,汇报当前节点的信息
4.当接收到Hmaster命令创建表的时候,分配一个Region对应一张表
5.Region server负责切分在运行过程中变得过大的region
6.当客户端发送DML和DQL操作的时候,HRegionServer负责和客户端建立连接
7.当意外关闭的时候,当前节点的Region会被其他HRegionServer管理
4.5.HRegion
1.HRegion是HBase中分布式存储和负载均衡的最小单元。最小单元就表示不同的HRegion可以分布 在不同的 HRegion server上。
2.HBase自动把表水平划分成多个区域(region),每个region会保存一个表里面某段连续的数据。
3.每个表一开始只有一个region,一个Region只属于一张表,随着数据不断插入表,region不断增大。
4.Region达到阈值10G的时候会被平分(逻辑上平分,尽量保证数据的完整性)。切分后的其中一个Region转移到其他的HRegionServer上管理。
5.当table中的行不断增多,就会有越来越多的region。这样一张完整的表被保存在多个 Regionserver 上。
6.为了防止前期数据的处理都集中在一个HRegionServer,我们可以根据自己的业务进行预分区。
4.6.Store
1.HRegion是表获取和分布的基本元素,由一个或者多个Store组成,每个store保存一个columns family。
2.每个Store又由1个memStore和0或多个StoreFile组成。
MemStore:当数据最开始优先写入到MemStore,当Flush的时候才会被写入到磁盘,默认情况下一个MemStore的大小为128M,当客户端向数据库插入数据的时候,当内存使用到128的时候,直接重新申请128M的空间,数据直接写入到新内存中,原来已经满的数据写到HDFS,称为HFile。
StoreFile:数据存储文件的映射,对应HDFS上的HFile,一个Table对应多个Region,一个Region对应多个Store,一个Store对应一个MemStore和多个StoreFile,多个StoreFile内部有序,但是外部无序。集群会设置一些阈值,当达到阈值的时候开始将小文件合并成大文件。
4.7.Hlog
1.一个HRegionServer只有一个Log文档 。
2.WAL(Write After Log)做任何操作之前先写日志,日志也会存储到HDFS,以后MemStore丢失数据或者RegionServer异常都能通过日志进行恢复,一个RegionServer对应一个HLog.
5. HBase读写流程
5.1读取数据流程 ![](https://i-blog.csdnimg.cn/blog_migrate/3bb7c9b39c61c8211a6fa4e6f66b828b.png)
(1) Client访问zookeeper,获取hbase:meta所在RegionServer的节点信息。
(2) Client访问hbase:meta所在的RegionServer,获取hbase:meta记录的元数据后先加载到内存中,然后再从内存中根据需要查询的RowKey查询出RowKey所在的Region的相关信息(Region所 在RegionServer)
(3) Client访问RowKey所在的Region对应的RegionServer,发送数据读取请求
(4) RegionServer构建RegionScanner(需要查询的RowKey分布在多少个Region中就需要构建多少个RegionScanner),用于对该Region的数据检索
(5) RegionScanner构建StoreScanner(Region中有多少个Store就需要构建多少个StoreScanner, Store的数量取决于Table的ColumnFamily的数量),用于对该列族的数据检索
(6) 多个StoreScanner合并构建最小堆(已排序的完全二叉树)StoreHeap:PriorityQueue
(7) StoreScanner构建一个MemStoreScanner和一个或多个StoreFileScanner(数量取决于 StoreFile数量)
(8) 过滤掉某些能够确定所要查询的RowKey一定不在StoreFile内的对应的StoreFileScanner或MemStoreScanner
(9) 经过筛选后留下的Scanner开始做读取数据的准备,将对应的StoreFile定位到满足的RowKey的 起始位置
(10) 将所有的StoreFileScanner和MemStoreScanner合并构建最小堆KeyValueHeap:PriorityQueue,排序的规则按照KeyValue从小到大排序
(11) 从KeyValueHeap:PriorityQueue中经过一系列筛选后一行行的得到需要查询的KeyValue。
5.2写入数据流程
(1) 首先客户端和RegionServer建立连接
(2) 然后将DML要做的操作写入到日志wal-log
(3) 然后将数据的修改更新到memstore中,然后本次操作结束(一个region由多个store组成,一个store对应一个CF(列族),store包括位于内存中的memstore和位于磁盘的storefie,写操作先写入memstore)
(4) 当memstore数据写到阈值之后,创建一个新的memstore
(5) 旧的memstore写成一个独立的storefile,regionserver会启动flashcache进程写入storefile,每次写入形成单独的一个storefile,存放到hdfs。
(6) 当storefile文件的数量增长到一定阈值后,系统会进行合并
(7)在合并过程中会进行版本合并和删除工作,形成更大的storefile
(8) 当一个region所有storefile的大小和数量超过一定阈值后,会把当前的region分割为两个,并由 hmaster分配到相应的regionserver服务器,实现负载均衡
(9) Store负责管理当前列族的数据
(10) 当我们进行数据DML的时候,以插入数据为例
- 我们会将数据先存储到memstore中,当memstore达到阈值(128M)
- 首先创建一个新的memstore
- 然后会将memstore中的数据写成一个storefile,storefile会存储到hdfs上
(11) 随着时间的推移:
- HFile中会存放大量的失效数据(删除,修改)
- 会产生读个HFile
- 等达到阈值(时间、数量)会进行合并,多个HFile合并成一个大的HFile,合并会触发连锁反应,相邻的store也会进行合并
(12) 在Hbase中,表被分割成多个更小的块然后分散的存储在不同的服务器上,这些小块叫做 Regions,存放Regions的地方叫做RegionServer。Master进程负责处理不同的RegionServer之间 的Region的分发。在Hbase实现中HRegionServer和HRegion类代表RegionServer和Region。 HRegionServer除了包含一些HRegions之外,还处理两种类型的文件用于数据存储。