先简单介绍下HBASE:
HBASE是一个数据库,可以提供数据的实时随机读写。
HBASE和其他关系型数据库不同,它是一个Nosql数据库(非关系型数据库)
1、Hbase的表模型与关系型数据库的表模型不同:
2、Hbase的表没有固定的字段定义;
3、Hbase的表中每行存储的都是一些key-value对
4、Hbase的表中有列族的划分,用户可以指定将哪些kv插入哪个列族
5、Hbase的表在物理存储上,是按照列族来分割的,不同列族的数据一定存储在不同的文件中
6、Hbase的表中的每一行都固定有一个行键(RowKey),而且每一行的行键在表中不能重复
7、Hbase中的数据,包含行键,包含key,包含value,都是byte[ ]类型,hbase不负责为用户维护数据类型
8、HBASE对事务(transaction)的支持很差
HBASE和其他Nosql数据库相比较:
hbase的表数据存储在hdfs文件系统中。
从而,hbase具备如下特性:存储容量可以线性扩展; 数据存储的安全性可靠性极高!
下面这张图是HBASE的表中的数据放到一行中的表信息。
HBASE数据模型:
Name Spase:
命名空间,类似于关系型数据库的database概念,每个命名空间下有多个表,HBASE两个自带的命名空间,分别是HBASE和default,HBASE中存放的内置的表,default表是用户默认使用的命名空间。
Table:
类似于关系型数据库中表的概念。不同的是,HBASE定义表时只需要声明列族即可,不需要声明具体的列。意味着往HBASE写入数据时,字段可以动态、按需指定。
Row:
HBASE表中的每行数据都由一个RowKey和多个Column组成,数据是按照RowKey的字典顺序存储的,并且查询数据时只能根据RowKey进行检索,所以Rowkey设计十分重要。
Column:
HBASE中的每个列都由列族和列进行限定。建表时只需指明列族,而列限定符无需预先定义。
Time Stamp:
用于标识数据的不同版本(version),每条数据写入时,系统会自动为其加上该字段,其值为写入HBASE的时间。
Cell:
由{rowkey,column Family:column Qualifier,time stamp}唯一确定的单元。cell中的数据时没有类型的,全部是字节码形式存储。
HBASE存储设计介绍
1、HRegion是HBASE存储数据的最小单元。一个Table可以有一个或多个Region,他们可以在一个相同的HRegionServer上,也可以分布在不同的HRegionServer上,一个HRegionServer可以有多个HRegion,他们分别属于不同的Table。HRegion由多个Store构成,每个Store对应了一个Table在这个HRegion中的一个Column Family,即每个Column Family就是一个集中的存储单元。
2、Store是HBase中存储的核心,它实现了读写HDFS功能,一个Store由一个MemStore 和0个或多个StoreFile组成。
3、MemStore是一个写缓存(In Memory Sorted Buffer),所有数据会先写入WAL日志,后写入MemStore中,由MemStore根据一定的算法将数据Flush到地层HDFS文件中(HFile),通常每个HRegion中的每个 Column Family有一个自己的MemStore。
4、HFile(StoreFile是HFile的简单封装,即StoreFile底层就是HFile) 用于存储HBase的数据(Cell/KeyValue)。在HFile中的数据是按RowKey、Column Family、Column排序,对相同的Cell(即这三个值都一样),则按timestamp倒序排列。
5、WAL即Write Ahead Log,在早期版本中称为HLog,它是HDFS上的一个文件,如其名字所表示的,所有写操作都会先保证将数据写入这个Log文件后,才会真正更新MemStore,最后写入HFile中。WAL文件存储在/hbase/WALs/${HRegionServer_Name}的目录中
上面图中还有一个BlockCache:读缓存,每次新查询的数据会缓存在BlockCache中。
HBASE的LSM存储思想
LSM树(Log-Structured Merge Tree),它的核心思路就是假定内存足够大,因此不需要每次有数据更新就必须将数据写入到磁盘中,等达到指定的大小限制后将这些修改操作批量写入磁盘。
LSM简易模型
HBASE中的LSM存储思想
1) 客户端在写入数据的是为了提升数据写入性能,Hbase首先会将数据写入到Level 0内存中;
2) 为了防止数据丢失,以及内存资源紧张,Hbase会对Level 0内存中的数据flush到磁盘;
3) 随着flush次数的增多,Level 1会产生很多的小文件,小文件过多不利于管理及数据的检索;
4) Hbase会对Level 1的小文件做合并,合并成大的文件;
FLUSH详述
① 每一次Put/Delete请求都是先写入到MemStore中,当MemStore满后会Flush成一个新的StoreFile(底层实现是HFile),即一个HStore(Column Family)可以有0个或多个StoreFile(HFile)。
② 当一个HRegion中的所有MemStore的大小总和超过了hbase.hregion.memstore.flush.size的大小,默认128MB。此时当前的HRegion中所有的MemStore会Flush到HDFS中。
③当全局MemStore的大小超过了hbase.regionserver.global.memstore.upperLimit的大小,默认40%的内存使用量。此时当前HRegionServer中所有HRegion中的MemStore都会Flush到HDFS中,Flush顺序是MemStore大小的倒序,直到总体的MemStore使用量低于hbase.regionserver.global.memstore.lowerLimit,默认38%的内存使用量。
④ 当前HRegionServer中WAL的大小超过了
hbase.regionserver.hlog.blocksize * hbase.regionserver.max.logs
的数量,当前HRegionServer中所有HRegion中的MemStore都会Flush到HDFS中,
Flush使用时间顺序,最早的MemStore先Flush直到WAL的数量少于
hbase.regionserver.hlog.blocksize * hbase.regionserver.max.logs
这里说这两个相乘的默认大小是2GB,查代码,hbase.regionserver.max.logs默认值是32,而hbase.regionserver.hlog.blocksize默认是32MB。但不管怎么样,因为这个大小超过限制引起的Flush不是一件好事,可能引起长时间的延迟
HBASE Region解析
什么是Region?
Hbase存储数据的最小单元,每个region会存储在确定的RegionServer上,即不会出现一个Region出现在两个RegionServer上。
HBASE表数据会在水平方向上被切分成N个Region;
Region有哪些特点?
Region是HBASE分布式存储的和负载均衡的最小单元;默认是10G
Region数目太多会造成HBASE的性能下降,文件太多查找耗时;
Region数目太少会影响HBASE的扩展能力,会导致压力不够分散,用户请求都会命中到一个RegionServer上,造成热点问题;综合考虑,当数据规模大到一定程度,Region的数量不能少于集群节点的数量;
随着写入数据的增加,Region会发生拆分,Master不会参与其中;
RegionServer拆分Region的步骤:
先将Region进行下线,然后对其进行拆分;
将拆分后的子Region加入到hbase:meta表中,然后加入到原本的regionserver上;
将该信息同步到Master上,让Master也知道,由Master来进行负载均衡;
HABSE WAL解析
客户端的PUT/DELETE/INCR操作都会通过RPC方式调用LogSyncer先写HLog;
HLog的文件会有一个后台线程LogRoller进行文件的滚动;
HLog是HBASE实现记录的日志的一个模块,HLog会在Regoin在实例化的时候会通过构造参数传递给Region,这样Region就获得了HLog的引用实现了打日志功能;
HLog最核心的就是其append方法,HLog通过序列化的Number追踪数据的改变,内部使用原子类AtomicLong来保证数据线程安全;
HLog日志为SequenceFile二进制文件, 数据格式KV格式,K为HLogKey,数据结构如下:
HLogKey中记录了客户端PUT/DELETE/INCR操作REGION、TableName、SequenceNumber、WriteTime;
KeyValue为操作的数据信息;
HBASE的Compaction:
1、将小的storefile合并成大的storefile
2、从内存flush到磁盘后,在磁盘上会产生很多小文件,而小文件不利于文件的管理及数据的检索。
3、MinorCompaction,MajorCompaction
尽量避免大合并,将默认的合并参数修改、关闭掉。hbase shell中tools中有compaction,可以手动触发合并。