1.Hbase中的LSM存储思想
1.1 什么是LSM树?
LSM树是日志结构合并树,是由两个或两个以上的存储结构组成的,各自对应自己的存储介质。
LSM树的简易模型描述:
![](https://img.haomeiwen.com/i7803976/065809405d636959.png)
第一层数据往往存储在内存当中,以快速插入为目标;第二层则是对第一层数据持久化的表现,当第一层中数据存储超过内存存储阈值,会将第一层数据刷写到硬盘上;第三层则是对第二层产生的在硬盘上的小文件的聚合合并。
1.2 LSM思想在HBase中的实现
结合下图说明:
![](https://img.haomeiwen.com/i7803976/7db9ce82413c0309.png)
<1> Level 0:日志/内存
用户数据达到了regionserver,为了加速随机写,并不会直接将数据刷写到硬盘上,是写入log和memstore,即wal机制和写入内存。
<2> Level 1:日志/内存
将数据写入内存有存在阈值的概念,当超过阈值时会被异步线程刷写到硬盘中,生成硬盘中的文件,即storefile
<3> Level 2:合并
硬盘上存在很多的小文件,会在合适的时候会将按顺序将小文件合并成大文件。
2.HBase存储模块简介
![](https://img.haomeiwen.com/i7803976/c4595af9015914c7.png)
思考:storefile和hfile之间的关系???
RegionServer=Region+Store+MemStore+StoreFile+HFile+HLog
每个RegionServer是由多个Region组成成的,Region之间的数据是互斥的,并不会产生重复。
Store则对应列族,有多少个列族就有多少个Store。每个Store里面只有1个Memstore,每个Store里面有多个HFile(StoreFile是HFile的抽象对象,所有如果说到StoreFile就是等于HFile)。每次Memstore的刷写(flush)就产生一个新的HFile出来。
数据存储的流程基本为:
用户数据 ====> Hlog ====> HRegion ====> MemStore ====> StoreFile ====> 合并封装成HFile
====》 向HDFS上刷写文件
所以,Hlog(wal机制)+MemStore构成了LSM中的c0,保证数据可以快速随机写入,降低存储延迟,同时保证了高可用性;
StoreFile+HFile构成了LSM中的c1,实现了不可靠数据的持久化。
2.1 Region解析
<1> 什么是Region?
多个行构成Region,每一个Region会存储到确定的RegionServer,(是如何确定的呢???)
Region是HBase分布式存储的最小单元。
当Region变大达到阈值后,Region就会被拆分成两个Region,每个Region有三个标识,tableName,startRowkey和createTime。
<2> Region的特点
Region是HBase进行分布式存储和负载均衡的最小单元。存储的最小单元是HFile。
Region的数量一定不能低于集群中节点的数量,Region在进行切分之后,会将Region信息重新写回到hbase:meta元信息表中(通过zookeeper找到元信息表在哪一个节点上)
2.2 HFile解析
HBase实际以HFile格式将数据保存在HDFS上。
- Store + MemStore + StoreFile
Store就是一个列族,设置了几个列族,对于任意一个Region来说,就有几个Store。
所以HBase被称为列式数据库,把一起访问的数据放在一个store里面。内存阈值默认是64M。
2、HFile文件
HFile的组成部分:
![](https://img.haomeiwen.com/i7803976/48357dd0048d6bb8.png)
HFile的区域:
![](https://img.haomeiwen.com/i7803976/50a6bdbf6661e2b5.png)
Data数据块:
![](https://img.haomeiwen.com/i7803976/a37d47bf7daa40bd.png)
Data数据块的第一位存储的是块的类型,后面存储的是多个KeyValue键值对,也就是单元格(Cell)的实现类。Cell是一个接口,KeyValue是它的实现类。
![](https://img.haomeiwen.com/i7803976/d107b7d2a5084253.png)
2.3 KeyValue类
单元格Cell最重要的实现类
![](https://img.haomeiwen.com/i7803976/72ba86bce3c28dd7.png)
KeyValue类里面最后一个部分是存储数据的Value,而前面的部分都是存储跟该单元格相关的元数据信息。如果你存储的value很小,那么这个单元格的绝大部分空间就是rowkey,column family,column等的元数据,所以如果列族和列的名字如果很长,大部分的空间都被拿来存储这些元数据了。
注意:如果存储的数据主要是归档数据,不太要求读写性能,可以使用压缩算法,极大地节省列簇,列等信息的空间。
3.Hbase中的增删改查
HBase:支持随机读写
HDFS:要么新增,要么整个删除,不能修改
其实HBase几乎总是在做新增操作。
![](https://img.haomeiwen.com/i7803976/b9b9ab1dc17dd552.png)
KeyValue类中keyType的标识,可以用来标识是否是删除的数据,HBase中的删除操作并不是将数据真正的删除,而是进行标记,等到再次scan的时候,就不会查询出来。
在之后运行的某个时间点,hbase会确定将标识为删除的数据给删除掉。但并不是在插入的过程中就直接删除掉了。
真正删除数据发生在合并(Compaction)过程中
HBase每隔一段时间会进行一次Compaction,合并的文件是HFile文件,合并分为minor compaction和major compaction。
在HBase进行major compaction的时候,会将多个HFile合并成1个HFile,在这个过程中,一旦检测到被打上墓碑标记的记录,在合并的过程中就忽略这条记录。这样在新产生的HFile中,就没有这条记录了。
网友评论