HBase|HBase 之工作原理
借用HBase官网对其的介绍来初步认识一下HBase,当你需要对大量的数据进行随机,实时的读/写访问时,请使用Apache HBase?。这个项目的目标是在非常大的表中,存储管理亿级别的行和百万级别的列。Apache HBase是一个开源的、分布式的、版本化的、非关系数据库。在此借鉴网络,来去帮助自己再去理解理解HBase是什么?在此记录下来,便于自己后期翻看。 HBase特性
- 海量存储:单表可以存储百亿级别的量级,不用担心读取的性能下降;
- 面向列:数据在表中是按某列的数据聚集存储,数据即索引,只访问查询涉及的列时,可以降低系统的I/O;
- 稀疏性:传统行式存储的数据存在大量的空值的列,需要占用存储空间,造成存储空间的浪费,而HBase为空的列并不占用空间,因此表可以设计的很稀疏;
- 扩展性:HBase底层基于HDFS,支持快速扩展,可以随时添加或者减少节点数;
- 高可靠:基于Zookeeper的协调服务,能够保证服务的高可用。HBase使用WAL和replication机制,前者保证数据写入是不会因为集群异常而导致写入数据的丢失,后者保证集群出现严重的问题时,数据不会发生丢失和损坏;
- 高性能:底层的LSM数据结构,使得HBase具备非常高的写入性能。RowKey有序排列,主键索引和缓存机制使得HBase具备一定的随机读写性能。
文章图片
图1
- Table(表)
- Row Key
- Column Family (列簇) & qualifier(列)
- Cell(单元格)
- Timestamp(时间戳)
HBase物理存储
文章图片
图2
- HRegion
- Store
- MemStore
- StoreFile
- HFile
- HLog(WAL log)
每个HRegionServer维护一个HLog。HLog文件就是一个普通的Hadoop Sequence File,Sequence File的Key是HLogKey对象,HLogKey中记录了写入数据的归属馨馨,除了Table和Region名字外,同事还包括Sequence number和timestamp,timestamp是写入时间,sequence number的起始值是0。HLog Sequence File的Value是HBase的KeyValue对象,即对应HFile中的KeyValue。
HBase读写流程 HBase读流程
文章图片
图3 1.Client先访问Zookeeper,从meta表读取Region的位置,然后读取meta表中的数据。meta中又存储了用户表的Region信息;
2.根据namespace,表名和RowKey在meta表中找到对应的Region信息;
3.找到这个Region对应的RegionServer;
4.查找对应的Region;
5.先从BlockCache找数据,如果没有,再到MemStore里面读;
6.MemStore如果没有,再到StoreFile上读(为了读取的效率);
7.如果是从StoreFile里面读取的数据,不是直接返回给客户端,而是先写入BlockCache里,再返回给客户端。
HBase写流程
文章图片
图4 1.客户端向ZK发送请求,获取meta表所在的RegionServer;
2.客户端通过RegionServer获取到meta表的数据;
3.然后客户端向集群中的RegionServer发送写入数据的请求;
4.RegionServer收到写数据的请求后,将数据写到HLog中,这一步是为了数据的持久化和恢复;
5.RegionServer将数据写入内存(MemStore);
6.然后通知客户端数据写入成功。
HBase Region Flush MemStore中的数据Flush到HDFS上的触发条件有哪些呢?HBase会在如下几种情况下触发flush操作,需要注意的是MemStore的最小flush单元是HRegion而不是单个MemStore。可想而知,如果一个HRegion中MemStore过多,每次flush的开销必然会很大,因此建议进行表设计的时候尽量减少ColumnFamily的个数。下面设置的参数可以移步官网,在HBase Default Configuration这个小节里查找???
- MemStore级别限制:当Region中任意一个MemStore的大小达到了上限(hbase.hregion.memstore.flush.size,默认128MB),会触发MemStore刷新;
- Region级别限制:当Region中所有MemStore的大小总和达到了上限(hbase.hregion.memstore.block.multiplier * hbase.hregion.memstore.flush.size,默认 4* 128M = 512M),会触发MemStore刷新;
- 【HBase|HBase 之工作原理】RegionServer 级别限制:当一个RegionServer中所有MemStore的大小总和达到了上限(hbase.regionserver.global.memstore.upperLimit * hbase_heapsize,默认40%的JVM内存使用量),会触发部分MemStore刷新。Flush顺序是按照MemStore由大道小执行,先Flush MemStore最大的Region,再执行次大的,直至总体MemStore内存使用量低于阀值(hbase.regionserver.global.memstore.lowerLimit * hbase_heapsize,默认 38%的JVM内存使用量);
- 当一个RegionServer中HLog数量达到上限(可以通过参数hbase.regionserver.maxlogs配置)时,系统会选取最早的一个HLog对应的一个或者多个Region进行flush;
- HBase定期刷新MemStore:默认周期为1小时,确保MemStore不会长时间没有持久化。为避免所有的MemStore在同一时间都进行flush导致有问题,定期的flush操作有20000左右的随机延迟;
- 手动执行flush:用户可以通过shell命令flush 'tablename' 或者 flush 'region name'分别对一个表或者一个Region进行flush。
文章图片
图5 HBase文件合并 MemStore每次Flush会创建新的HFile,而过多的HFile会引起读的性能问题,那么如果解决这个问题呢?HBase采用Compaction机制来解决这个问题,在HBase中Compaction分为两种:Minor Compaction和Major Compaction。
文章图片
图6
- Minor Compaction
Minor Compaction是指选取一些小的,相邻的StoreFile将它们合并成一个更大的StoreFile,在这个过程中不会处理已经Deleted和Expired的Cell。一次Minor Compaction的结果是更少并且更大的StoreFile。 - Major Compaction
Major Compaction是指将所有的StoreFile合并成一个StoreFile,在这个过程中,标记为Deleted的Cell会被删除,而那些已经TTL(time-to-live)的Cell会被丢弃。一次Major Compaction的结果是一个HStore只有一个StoreFile存在。Major Compaction可以手动或自动触发,然而由于它会引起很多的I/O操作而引起性能问题,因而它一般会被安排在比较闲的时间进行。
文章图片
图7
推荐阅读
- PMSJ寻平面设计师之现代(Hyundai)
- 太平之莲
- 闲杂“细雨”
- 七年之痒之后
- 深入理解Go之generate
- 由浅入深理解AOP
- 7.9号工作总结~司硕
- 期刊|期刊 | 国内核心期刊之(北大核心)
- 生活随笔|好天气下的意外之喜
- 感恩之旅第75天