hbase架构详解及读写流程原理剖析(代码片段)

禅与计算机程序设计艺术 禅与计算机程序设计艺术     2022-12-12     587

关键词:

1、HBase 简介

HBase是 BigTable (架构如下图所示)的开源“山寨”版本,建立在hdfs(对应GFS)之上,提供高可靠性、高性能、列存储、可伸缩、实时读写的数据库系统。

HBase底层依赖于HDFS的。整体架构图如下:

HBase 介于 NoSQL 和 RDBMS 之间,仅能通过主键(row key)主键range来检索数据,仅支持单行事务(可通过hive支持来实现多表join等复杂操作)。主要用来存储非结构化和半结构化的松散数据。

与hadoop一样,Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力

HBase 中的表一般有这样的特点:
1、大数据:一个表可以有上十亿行,上百万列;
2、面向列:面向列(族)的存储和权限控制,列(族)独立检索;
3、稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。

2、HBase 数据储存模型

HBase是建立在 hadoop 之上的, HBase底层依赖于HDFS。

HBase 底层的存储都是基于 Hadoop HDFS 的:

  • Hadoop DataNode 负责存储 Region Server 所管理的数据。所有的 HBase 数据都存储在 HDFS 文件中。Region Server 和 HDFS DataNode 往往是分布在一起的,这样 Region Server 就能够实现数据本地化(data locality,即将数据放在离需要者尽可能近的地方)。HBase 的数据在写的时候是本地的,但是当 region 被迁移的时候,数据就可能不再满足本地性了,直到完成 compaction,才能又恢复到本地。

  • Hadoop NameNode 维护了所有 HDFS 物理 data block 的元信息。

HBase有3个重要的组件:Zookeeper、HMaster、HRegionServer。

其中,

Zookeeper为整个HBase集群提供协助的服务;

HMaster主要用于监控和操作集群的所有RegionServer;

RegionServer主要用于服务和管理分区(Regions)。

1.2 HMaster

HMaster是HBase集群架构中的主节点,通常一个HBase集群存在多个HMaster节点,其中一个为Active Master,其余为Backup Master。

Hbase每时每刻只有一个HMaster主服务器程序在运行,HMaster将region分配给HRegionServer,协调HRegionServer的负载并维护集群的状态。Hmaster不会对外提供数据服务,而是由HRegionServer负责所有regions的读写请求及操作。

由于HMaster只维护表和region的元数据,负责Region的分配及数据库的创建和删除等操作而不参与数据的输入/输出过程,HMaster失效仅仅会导致所有的元数据无法被修改,但表的数据读/写还是可以正常进行的。
备注:region,HRegionServer职责与功能下面内容中会讲解

1.2.1 HMaster的作用:

A、调控Region server的工作

为Region server分配region,负责HRegionServer的负载均衡;

监控集群中的Region server的工作状态, 发现失效的HRegionServer并重新分配其上的Hregion(通过监听zookeeper对于ephemeral node状态的通知)。

备注:
HRegion,习惯把它称为region,表的意思
HRegionServer,习惯把它称为Region server,HRegionServer是HBase集群架构中的从节点

B、管理数据库
提供创建,删除或者更新表格的接口。

1.3、HRegionServer

HRegionServer是HBase集群架构中的从节点,HBase中的表是根据row key的值水平分割成所谓的region的。一个region包含表中所有row key位于region的起始键值和结束键值之间的行。

集群中负责管理Region的结点叫做Region server。Region server负责数据的读写。每一个Region server大约可以管理1000个region。

备注:HRegionServer,习惯把它称为Region server,HRegionServer是HBase集群架构中的从节点。(一些文章写的是Region server、一些写的是HRegionServer,两个意思都是一样的)。

Region Server 组成

Region Server 运行在 HDFS DataNode 上,由以下组件组成:

  • WAL:Write Ahead Log 是分布式文件系统上的一个文件,用于存储新的还未被持久化存储的数据,它被用来做故障恢复。

  • BlockCache:这是读缓存,在内存中存储了最常访问的数据,是 LRU(Least Recently Used)缓存。

  • MemStore:这是写缓存,在内存中存储了新的还未被持久化到硬盘的数据。当被写入硬盘时,数据会首先被排序。注意每个 Region 的每个 Column Family 都会有一个 MemStore。

  • HFile 在硬盘上(HDFS)存储 HBase 数据,以有序 KeyValue 的形式。

HRegionServer组成:一个 HRegionServer 会有多个 HRegion 和一个HLog。

一个HRegionServer可以维护多个 HRegion(习惯称为一个Region Server可以维护多个Region)。

HLog:预写入日志,防止内存中数据丢失。

HRegionServer的职责

维护HMaster分配给它的HRegion,处理对这些HRegion的IO请求,也就是说客户端直接和HRegionServer打交道。

HRegion

Region是HBase数据管理的基本单位,每个HRegion由多个Store构成,每个Store保存一个列族(Columns Family),表有几个列族,则有几个Store,每个Store由一个MemStore和多个StoreFile组成,MemStore是Store在内存中的内容,写到文件后就是StoreFile,StoreFile底层是以HFile的格式保存。
Region相当于数据库中的表

Region/Store/StoreFile/Hfile之间的关系

Region

table在行的方向上分隔为多个Region。Region是HBase中分布式存储和负载均衡的最小单元,即不同的region可以分别在不同的Region Server上,但同一个Region是不会拆分到多个server上。

Region按大小分隔,表中每一行只能属于一个region。随着数据不断插入表,region不断增大,当region的某个列族达到一个阈值(默认256M)时就会分成两个新的region。

Store

每一个region有一个或多个store组成,至少是一个store,hbase会把一起访问的数据放在一个store里面,即为每个ColumnFamily建一个store(即有几个ColumnFamily,也就有几个Store)。一个Store由一个memStore和0或多个StoreFile组成。

HBase以store的大小来判断是否需要切分region。
store的数据存储在两个地方MemStore和StoreFile。

MemStore

写缓存,memStore 是放在内存里的。由于 HFile 中的数据要求是有序的,所以数据是先存储在 MemStore 中,排好序后,等到达刷写时机才会刷写到 HFile(当memStore的大小达到一个阀值【默认64MB】时,memStore会被flush到文件),每次刷写都会形成一个新的 HFile。

StoreFile

memStore内存中的数据写到文件后就是StoreFile(即memstore的每次flush操作都会生成一个新的StoreFile),StoreFile底层是以HFile的格式保存。

HFile

HFile是HBase中KeyValue数据的存储格式,是hadoop的二进制格式文件。一个StoreFile对应着一个HFile。HFile是存储在HDFS之上的。HFile文件格式是基于Google Bigtable中的SSTable,如下图所示:

HFile文件是不定长的,长度固定的只有其中的两块:Trailer和FileInfo。Trailer中又指针指向其他数据块的起始点,FileInfo记录了文件的一些meta信息。

3、HBase 写数据流程

1、客户端先访问zookeeper,获取Meta表位于那个region server。

2、访问Meta表对应的region server服务器,根据请求的信息(namespace:table/rowkey),在meta表中查询出目标数据位于哪个region server的哪个region中。并将该表的region信息以及meta表的位置信息缓存到客户端的meta cache,方便下次访问。

3、与目标数据的region server进行通讯。

4、将数据写入到WAL中。

5、将数据写入到对应的memstore中。

6、向客户端发送写入成功的信息。

7、等达到memstore的刷写时机后,将数据刷写到HFILE中。

4、HBase读流程

1、Client客户端先访问zookeeper,获取 hbase:meta 表位于哪个Region Server
2、访问hbase:meta 表对应的region server服务器,根据请求的信息(namespace,table,rowkey),查询出目标表位于哪个Region Server中的哪个region。
并将该表的region信息,以及meta表的位置信息缓存在客户端的缓存中,以便下次访问。
3、与目标表所在的region server 进行通讯。
4、分别在Block Cache(读缓存)MemStore和 Store File查询目标数据,并将查到的数据进行合并,此处所有数据是指同一条数据的不同版本(time stamp)或者不同的类型(Put/Delete)。
5、 将从文件中查询到的数据块缓存到 block cache。
6、 将合并后的数据返回给客户端。

5、HRegionServer  架构详解

HRegionServer 一般和DN在同一台机器上运行,实现数据的本地性,如图B。HRegionServer 包含多个HRegion,由WAL(HLog)、BlockCache、MemStore、HFile组成,如图A,其中图A是0.94-的架构图,图B是0.96+的新架构图

图A

 图B

  • WAL(Write Ahead Log):它是HDFS上的一个文件,所有写操作都会先保证将数据写入这个Log文件后,才会真正更新MemStore,最后写入HFile中

  • 采用这种模式,可以保证HRegionServer宕机后,依然可以从该Log文件中读取数据,Replay所有的操作,来保证数据的一致性

  • 一个HRegionServer只有一个WAL实例,即一个HRegionServer的所有WAL写都是串行,这当然会引起性能问题,在HBase 1.0之后,通过HBASE-5699实现了多个WAL并行写(MultiWAL),该实现采用HDFS的多个管道写,以单个HRegion为单位

  • Log文件会定期Roll出新的文件而删除旧的文件(那些已持久化到HFile中的Log可以删除)。WAL文件存储在/hbase/WALs/$HRegionServer_Name的目录中

  • BlockCache(图B):是一个读缓存,将数据预读取到内存中,以提升读的性能

  • HBase中提供两种BlockCache的实现:默认on-heap LruBlockCache和BucketCache(通常是off-heap)。通常BucketCache的性能要差于LruBlockCache,然而由于GC的影响,LruBlockCache的延迟会变的不稳定,而BucketCache由于是自己管理BlockCache,而不需要GC,因而它的延迟通常比较稳定,这也是有些时候需要选用BucketCache的原因

  • HRegion:是一个Table中的一个Region在一个HRegionServer中的表达,是Hbase中分布式存储和负载均衡的最小单元

  • 一个Table拥有一个或多个Region,分布在一台或多台HRegionServer上

  • 一台HRegionServer包含多个HRegion,可以属于不同的Table

  • 见图A,HRegion由多个Store(HStore)构成,每个HStore对应了一个Table在这个HRegion中的一个Column Family,即每个Column Family就是一个集中的存储单元

  • HStore是HBase中存储的核心,它实现了读写HDFS功能,一个HStore由一个MemStore 和0个或多个StoreFile组成

  • MemStore:是一个写缓存(In Memory Sorted Buffer),所有数据的写在完成WAL日志写后,会 写入MemStore中,由MemStore根据一定的算法将数据Flush到底层HDFS文件中(HFile),通常每个HRegion中的每个 Column Family有一个自己的MemStore

  • HFile(StoreFile): 用于存储HBase的数据(Cell/KeyValue)。在HFile中的数据是按RowKey、Column Family、Column排序,对相同的Cell(即这三个值都一样),则按timestamp倒序排列

  • 小结:

  1. Table中的所有行都按照row key的字典序排列,Table 在行的方向上分割为多个Hregion,如下图1

  2. region按大小分割的,每个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阀值的时候,Hregion就会等分会两个新的Hregion,如下图2

图1

 

图2

        3、HRegion是Hbase中分布式存储和负载均衡的最小单元。最小单元就表示不同的Hregion可以分布在不同的HRegion server上。但一个Hregion是不会拆分到多个server上的,如下图

        4、HRegion虽然是分布式存储的最小单元,但并不是存储的最小单元。事实上,HRegion由一个或者多个Store组成,每个store保存一个columns family,每个Strore又由一个memStore和0至多个StoreFile组成,如下图,说明:StoreFile以HFile格式保存在HDFS上

nameSpace:


  • 在HBase中,namespace命名空间指对一组表的逻辑分组,类似RDBMS中的database,方便对表在业务上划分。

  • Apache HBase从0.98.0, 0.95.2两个版本开始支持namespace级别的授权操作,HBase全局管理员可以创建、修改和回收namespace的授权

  • HBase系统默认定义了两个缺省的namespace,见如下图的目录结构:

  1. hbase:系统内建表,包括namespace和meta表

  2. default:用户建表时未指定namespace的表都创建在此


参考资料:

https://www.jianshu.com/p/cf316eb80137

https://www.cnblogs.com/laoqing/p/12091471.html

大数据(5b)hbase架构读写流程(代码片段)

文章目录架构写数据流程读数据流程StoreFileCompaction(HBase文件合并精简)RegionSplit(Region切分机制)架构简单架构图每个RegionServer有多个Region每个Region有多个Store每个Store有多个StoreFile详细架构图StoreFile保存实际数... 查看详情

hbase详解(代码片段)

文章目录HBase简介HBase特点HBase架构MasterRegionServerRegionMemstore&StorefileHLogHBase数据模型RowKey(行键)ColumnFamily&Qualifier(列簇和列)TimeStamp(时间戳)Cell(存储单元)HBase读写流程HBaseShellHBaseAPI常用java类示例代码HBase过... 查看详情

hbase数据存储原理与读写详解(代码片段)

1、HBase的数据存储原理一个HRegionServer会负责管理很多个region一个*region包含很多个store一个列族就划分成一个store**如果一个表中只有1个列族,那么每一个region中只有一个store如果一个表中有N个列族,那么每一个region中有N个store一... 查看详情

kafkaconsumer架构设计剖析和源码全流程详解(代码片段)

Kafka作为一个分布式事件暂存和中转系统,最重要的两个功能便是,往Kafka生产数据的生产者KafkaProducer,和从Kafka拉取数据消费的消费者KafkaConsumer。今天我们主要讲解消费者,KafkaConsumer。我习惯从最朴素的问题开... 查看详情

总索引

...的代码辅助优化和改善7、走向云计算之HBase的基本原理和架构介绍8、走向云计算之HBase的shell命令和JavaAPI详解9、走向云计算之HBase模式设计及表设计案例10、走向云计算之HBase实际案例分析11、走向云计算之Zookeeper简介和使用场景... 查看详情

hbase基本架构及原理(代码片段)

简述    HadoopDatabases基于Hadoop存储,是一个高可靠性、高性能、面向列、可伸缩、实时读写的分布式数据库。利用HadoopHDFS作为其文件存储系统,利用HadoopMapReduce来处理HBase中的海量数据,利用Zookeeper作为其分布式协同服务主要... 查看详情

详解hbase读写性能优化(代码片段)

一、HBase读优化1.HBase客户端优化和大多数系统一样,客户端作为业务读写的入口,姿势使用不正确通常会导致本业务读延迟较高实际上存在一些使用姿势的推荐用法,这里一般需要关注四个问题:1)scan缓存是否设... 查看详情

hbase原理架构与安装部署教程(代码片段)

...所有的数据在HBase中是以==字节数组==进行存储2、Hbase整天架构2.1Client客户端Client是操作HBase集群的入口对于管理类的操作,如表的增、删、改操纵,Client通过RPC与HMaster通信完成对于表数据的读写操作,Client通过RPC与RegionServer交互... 查看详情

apachetomcat(代码片段)

Tomcat讲解第⼀部分:Tomcat系统架构与原理剖析第1节浏览器访问服务器的流程第2节Tomcat系统总体架构2.1Tomcat请求处理⼤致过程2.2TomcatServlet容器处理流程2.3Tomcat系统总体架构第3节Tomcat连接器组件Coyote3.1Coyote简介3.2Coyote的内部组... 查看详情

apachetomcat(代码片段)

Tomcat讲解第⼀部分:Tomcat系统架构与原理剖析第1节浏览器访问服务器的流程第2节Tomcat系统总体架构2.1Tomcat请求处理⼤致过程2.2TomcatServlet容器处理流程2.3Tomcat系统总体架构第3节Tomcat连接器组件Coyote3.1Coyote简介3.2Coyote的内部组... 查看详情

sparkstreaming架构原理详解!(代码片段)

目录一、SparkStreaming功能介绍(1)概述(2)DStream概述(3)Storm和SparkStreaming比较二、SparkStreaming服务架构及工作原理三、StreamingContext原理详解四、DStream和Receiver详解五、SparkStreaming基于HDFS的实时计算 查看详情

图文详解hbase的数据模型与架构原理详解

HBase简介https://hbase.apache.org/HBase,HadoopDatabase,是一个高可靠性、高性能、面向列、可伸缩、实时读写的分布式开源NoSQL数据库,面向列存储。主要用来存储非结构化和半结构化的松散数据。HBase的设计思想,来源... 查看详情

hbase万字详细原理解析(代码片段)

...RegionServer核心模块3.1HLog3.2MemStore3.3HFile3.4BlockCache四、HBase读写流程4.1HBase写入流程4.2HBase读取流程五、HBase负载均衡(Reg 查看详情

图文详解hbase的读写流程

前言本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见1000个问题搞定大数据技术体系正文... 查看详情

hbase框架基础

*HBase框架基础(二)上一节我们了解了HBase的架构原理和模块组成,这一节我们先来聊一聊HBase的读写数据的过程。*HBase的读写流程及3个机制HBase的读数据流程:1、HRegionServer保存着meta表以及表数据,要访问表数据,首先Client先... 查看详情

唯一插件化replugin源码及原理深度剖析--唯一hook点原理(代码片段)

...ClassLoader和插件的加载没有说,那么我们这一篇就来详解的来分析一下Hook这块,本章我们讲从 查看详情

hdfs原理详解(代码片段)

...、HDFS的设计原理二、什么是零拷贝三、什么是DMA四、HDFS架构剖析     HDFS架构整体概述     HDFS架构图五、HDFS集群角色介绍1.主角色:namenode2从角色:datanode3主角色辅助角色:secondarynamenode 六、HDFS重要特性--主从架构 七、HDFS... 查看详情

kafkaconsumer架构设计剖析和源码全流程详解(代码片段)

Kafka作为一个分布式事件暂存和中转系统,最重要的两个功能便是,往Kafka生产数据的生产者KafkaProducer,和从Kafka拉取数据消费的消费者KafkaConsumer。今天我们主要讲解消费者,KafkaConsumer。我习惯从最朴素的问题开... 查看详情