前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试头条:HBASE 存储设计

面试头条:HBASE 存储设计

作者头像
木野归郎
发布2020-06-12 10:47:18
9180
发布2020-06-12 10:47:18
举报
文章被收录于专栏:share ai happinessshare ai happiness

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OnlyCoding 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档