面试头条:HBASE 存储设计

2020-06-12 10:47:18 浏览数 (1)

先简单介绍下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,可以手动触发合并。

0 人点赞