一文带你读懂Hbase概念、架构及原理

目录

0. 前言

1. 初识Hbase

1.1 Hbase的定义

1.2 Hbase的逻辑结构

1.3 HBase物理存储结构

1.4 HBase数据模型

2 Hbase与关系型数据库之间的对比

3 Hbase的优势

4 Hbase基本架构及原理                                                

4.1 架构角色

4.2 核心模块组成

5. HBase写入数据的流程

5.1 写入流程分析

5.2 刷写时机分析

5.3 合并过程分析

5.4 Region切分分析

5.5 meta存储位置寻找

6. HBase读流程分析

6.1 基本流程

6.2 HBase读取流程的详细流程

6.2.1构建scanner体系--组件施工队

6.2.2 scan查询-层层建楼

7 HBase 常见疑问问题总结

7.1 HBase是如何实现增删改查的?

7.2 一个表要设置多少个列族比较合适?

8 HBase优化

8.1 预分区

8.2 RowKey设计

8.3 内存优化

8.4 基础优化

9 小结



0. 前言

    Hbase在大数据领域中起着重要角色,在处理海量数据时候能达到秒级响应,很多公司都有自己的Hbase集群,在存储处理数据方面有着明显的优势。本文从Hbase的基本概念及架构原理进行深入解读,旨在帮助读者能从整体上认识Hbase,并对Hbase基本架构原理有个深入了解。

   通过本文你可以获取如下几方面知识:

  • (1)Hbase是什么
  • (2)Hbase与关系型数据库之间的区别
  • (3)Hbase的特点
  • (4)Hbase架构及原理
  • (5)Hbase读写流程
  • (6)storefile合并过程
  • (7)region切分过程

 适合场景单表超千万,上亿,且高并发!

 不适合场景:主要需求是数据分析,比如做报表。数据量规模不大,对实时性要求高 

1. 初识Hbase

1.1 Hbase的定义

    HBase 是一种分布式、可扩展、支持海量数据存储的 NoSQL 数据库。一句话概括为:hbase是hadoop的数据库,是构建在hadoop之上的分布式数据库。逻辑上,HBase 的数据模型同关系型数据库很类似,数据存储在一张表中,有行有列。但从 HBase 的底层物理存储结构(K-V)来看,HBase 更像是一个 multi-dimensional map(可以理解为多维map结构)。

1.2 Hbase的逻辑结构

     如上图所示反映了Hbase逻辑结构,如字段name下的小眼睛数据是如何被定位的呢?首先每一条数据都有一个rowkey,rowkey类似于mysql表中的主键具有唯一性。其次有一个列族(列簇)这里我们就叫为列族吧,正确的应该是列簇,但是呢很多程序员也都这么叫,错误的叫的多了也便是正确的了,(哈哈,所以说这个世界上在人类所能认知的范围内,真理还是掌握在大多数人手中,因为少数人服从多数人。),列族其实就是列的集合,一个列族对应物理存储上一个文件夹。为什么要设计列族这个概念呢?我想可能是对表的一种切分吧,当一个列族所能容纳字段越来越多的时候,此时表越来越宽就需要对表进行纵向切分,便有了列族的概念。当表的记录数越来越多的时候,表变得越来越高(高表),此时就需要对表进行横向切分,横向切分后得到的切片就是region,所以列族是对表的垂直切分,region是对表的横向切分。   一张表一条数据实际上是K-V结构,只不过这个key是多维的。

1.3 HBase物理存储结构

     由上图可以看出,对比关系型数据库中表结构,一条数据被当成了多条记录存储,每一个value值前面都对应rowkey->column family->column qualifier->timestamp作为一个key,不同数据的版本需要timestamp进行标记,从上面也可以看出hbase存储相对于关系型数据库结构化表来讲,数据存在一定膨胀,因此在使用时候需要进行压缩。在表中我们也可以看到Type类型,他标记着这条数据操作行为,put为插入数据,delete为删除数据。

1.4 HBase数据模型

(1)Name Space

        Name Space命名空间,类似于关系型数据库中的数据库的概念(database),每个命名空间下有多张表。HBase有两个自带的命名空间,分别是 hbase 和 default,hbase 中存放的是 HBase 内置的表,default 表是用户默认使用的命名空间,当希望数据进行分库管理时可使用命名空间。表命名空间主要是用于对表分组,那么我们对表分组有啥用呢?命 名空间可以填补HBase无法在一个实例上分库的缺憾。通过命名空间我 们可以像关系型数据库一样将表分组,对于不同的组进行不同的环境设 定,比如配额管理、安全管理等。

(2)Region

     Region相当于一个数据分片,是表下面的一个概念。每一个Region都有起 始rowkey和结束rowkey,代表了它所存储的row范围。HBase是一个会自动分片的数据库,一个Region就相当于关系型数据库中分区表的一个分区,或者 MongoDB的一个分片。

一个Region包含有:多个Store,每一个Region内都包含有多个Store实例。一个 Store对应一个列族的数据,如果一个表有两个列族,那么在一 个Region里面就有两个Store。在最右边的单个Store的解剖图 上,我们可以看到Store内部有MemStore和HFile这两个组成部 分。Region内部解剖图如下:

(3) Row
     HBase 表中的每行数据都由一个 RowKey 和多个  Column(列)组成,数据是按照 RowKey的字典顺序存储的,并且查询数据时只能根据 RowKey 进行检索,所以 RowKey 的设计十分重要。每一个行都有一个类似主键的rowkey,而这个 rowkey在HBase中是严格按照字典排序的,也就是说11比2小,row11会 排在row1和row2中间。
(4) Column
     HBase 中的每个列都由 Column Family(列族)和 Column Qualifier(列限定符)进行限定,例如 info:name,info:age。

   列族是多个列的集合其实列式数据 库只需要列就可以了,为什么还需要有列族呢?因为HBase会尽 量把同一个列族的列放到同一个服务器上,这样可以提高存取性能,并且可以批量管理有关联的一堆列。所有的数据属性都是定 义在列族上。在HBase中,建表定义的不是列,而是列族,列族 可以说是HBase中最重要的概念。

  Column Qualifier(列):多个列组成一个行。列族和列经常用 Column Family: Column Qualifier来一起表示。建表时,只需指明列族,而列限定符无需预先定义,也就是定义一个hbase表时候只需要指定列族即可,不像关系型数据库建表时候字段类型是固定的,列是可以随意 定义的,一个行中的列不限名字、不限数量,只限定列族,这也说明了Hbase的灵活性。。

(5) Timestamp
    用于标识数据的不同版本(version),每条数据写入时,如果不指定时间戳,系统会自动为其加上该字段,其值为写入 HBase 的时间。

(6) Cell
     由{rowkey, column Family:column Qualifier, time Stamp} 唯一确定的单元。cell 中的数据是没有类型的,全部是字节码形式存贮。一个列中可以存储多个版本的数据,而每个版 本就称为一个单元格(Cell),所以在HBase中的单元格跟传统 关系型数据库的单元格概念不一样。HBase中的数据细粒度比传 统数据结构更细一级,同一个位置的数据还细分成多个版本。

2 Hbase与关系型数据库之间的对比

表1:Hbase与RMDBS数据之间的对比
Hbase  RDBMS                           
结构上 数据库以region的形式存在 数据库以表的形式存在
构建在HDFS之上 支持FAT、NTFS、EXT、文件系统
使用WAL(Write-Ahead Logs)存储日志 使用Commit log存储日志
借助Zookeeper系统 参考系统是坐标系统
使用行键(row key) 使用主键(PK)
支持分片 支持分区
使用行、列、列族和单元格 使用行、列、单元格
功能上 支持向外扩展 支持向上扩展
使用API和MapReduce来访问HBase表数据 使用SQL查询
面向列,即每一列都是一个连续的单元 面向行,即每一行都是一个连续单元
数据总量不依赖具体某台机器,而取决于机器数量 数据总量依赖于服务器配置
HBase不支持ACID(AtomicityConsistencyIsolationDurability 支持ACID
适合结构化数据和非结构化数据 适合结构化数据
一般都是分布式的 传统关系型数据库一般都是中心化的
HBase不支持事务 支持事务
不支持Join 支持Join

3 Hbase的优势

图1:Hbase优势

(1)横向扩展

        HBase支持横向扩展,也就是说如果现有服务器硬件性能出现瓶颈,不需要停现有的集群提升硬件配置,而只需要在现有的正在运行的集群中添加新的机器节点即可,而且新的RegionServer一旦建立完毕,集群会开始重新调整。

(2)列式存储

        HBase是面向列存储的,每个列都单独存储,所以在HBase中列是连续存储的,而行不是。并且列可以动态增加,列为空时就不存储数据,节省存储空间,RDBMS的行有多少列是固定的,若某一列为null时就浪费了存储空间。HBase为null的列不会被存储,这样既节省了空间又提高了读性能。

(3)半结构化或非结构化数据

      Hbase支持半结构化或非结构化的数据存储,对于数据结构字段不够确定或杂乱无章非常难按一个概念去进行抽取的数据适合用HBase,因为HBase支持动态添加列。

(4)高并发、随机读写

        HBase采用LSMT(log-structured merge-tree)架构进行设计,这种架构会周期性地将小文件合并成大文件以减少磁盘访问同时减少NameNode压力。本质上解决了HDFS不能随机读写的问题,在写入(插入)数据方面具有很大优势,特别在PB级以上数据优势明显,适用于插入比查询操作更频繁的情况,写比查询更高效。(强调写的能力)

(5)自动切分

        HBase表是由分布在多个RegionServer中的region组成的,这些RegionServer又分布在不同的DataNode上,如果一个region增长到了一个阈值,为了负载均衡和减少IO,HBase可以自动或手动干预的将region切分为更小的region,也称之为subregion。

(6)自动故障处理和负载均衡

        HBase运行在HDFS上,所以HBase中的数据以多副本形式存放,数据也服从分布式存放,数据的恢复也可以得到保障。另外,HMaster和RegionServer也是多副本的。

4 Hbase基本架构及原理                                                

   图1反映了Hbase集群间各个服务角色之间的关系,其服务之间的关系及作用如下描述:

4.1 架构角色

   1)Region Server(RS)

   Region Server 为 Region 的管理者,其实现类为 HRegionServer,主要作用如下:

  •   对于数据的操作:get, put, delete;
  •   对于 Region 的操作:splitRegion、compactRegion。

   总结:RS其实实现的是类似于关系型数据库中的DML操作,实现对数据的管理

   2)Master

    Master 是所有 Region Server 的管理者,其实现类为 HMaster,主要作用如下:

  •     对于表的操作:create, delete, alter.(类似于关系型数据库的DDL操作,实现的是对表的管理);
  •     对于RegionServer的操作:分配regions到每个RegionServer;监控每个RegionServer的状态;负载均衡和故障转移;发  现失效的RegionSercer重新为他们分配自己负责的region。
  •    hdfs上的垃圾文件回收(标记为删除的且经过major compact的文件)

  3)zookeeper

    HBase 通过 Zookeeper 来做 Master 的高可用、RegionServer 的监控、元数据的入口以及集群配置的维护等工作。

  • 负责Master高可用时候切换工作
  • 降低Master的负担,承担Master部分工作

  4)HDFS

     HDFS 为 HBase 提供最终的底层数据存储服务,同时为 HBase 提供高可用的支持,底层的最终存储是构建在HDFS之上的,这也是为什么Hbase是hadoop的数据库的缘由

4.2 核心模块组成

     图2反映了Hbase的架构原理图,其原理如下所示:

      一个RegionServer由一个(或多个)HLog(默认是一个,1.1版本可以开启MultiWAL功能,允许多个HLog)、一个BlockCache以及多个Region组成。其中,HLog用来保证数据写入的可靠性;BlockCache可以将数据块缓存在内存中以提升数据读取性能;Region是HBase中数据表的一个数据分片(分区表),一个RegionServer上通常会负责多个Region的数据读写。一个Region由多个Store(列存储仓库)组成,每个Store存放对应列簇的数据,比如一个表中有两个列簇,这个表的所有Region就都会包含两个Store。每个Store有且仅有一个MemStore和多个HFile,用户数据写入时会将对应列簇数据写入相应的MemStore,一旦写入数据的内存大小超过设定阈值,系统就会将MemStore中的数据落盘形成HFile文件。HFile存放在HDFS上,是一种定制化格式的数据存储文件,方便用户进行数据读取。具体物理结构关系图如下图所示:

HBse物理结构关系视图

    1)Storefile

         保存实际数据的物理文件,StoreFile以 HFile 的形式存储在 HDFS 上。每个 Store 会有一个或多个 StoreFile(HFile),数据在每个 StoreFile 中都是有序的。HFile可以理解为一种文件格式,与orc,txt等是一样的概念,只不过是以key,value的形式存储。

    2)MemStore

      写缓存,由于HFile中数据要求是有序的,所以数据是先存储在MemStore中,排好序后,等到达刷写时机才会刷写到Hflie,每次刷写都会形成一个新的HFile

    3) HLog
    由于数据要经 MemStore 排序后才能刷写到 HFile,但把数据保存在内存中会有很高的概率导致数据丢失,为了解决这个问题,数据 在写MemStore 的同时,也会写在一个叫做 Write-Ahead logfile 的文件中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。WAL类似于Mysql的binlog,用来做灾难恢复。Hlog记录所有数据的变更,一旦数据修改,就可以从Hlog恢复,每个HRegionSever维护一个HLog.

 疑问,为什么是HRegionSever维护一个HLog,而不是HRgeion维护一个HLog?
 解释:这样不同region(不同表)的日志会混在一起,这样做的目的不断追加单个文件相对于同时写多个文件而言,可以减少磁盘的寻址次数,可以提高对table的写性能。
 缺点:如果一台HRegionSever下线了,为了恢复其上的region,需要将HRegionSever上的log进行拆分,然后分发到其他HRegionSever进行恢复。

   4) HRegion  

      HRegion也就是我们所说的Region,  一个Table由一个或者多个Region组成,一个Region中可以看成是Table按行切分且有序的数据块数据分片),每个Region都有自身的StartKey、EndKey。一个Region由一个或者多个Store组成,每个Store存储该Table对应Region中一个列簇的数据,相同列簇的列存储在同一个Store中。同一个Table的Region会分布在集群中不同的RegionServer上以实现读写请求的负载均衡。故,一个RegionServer中将会存储来自不同Table的N多个Region。

    Store、Region与Table的关系可以表述如下:多个Store(列簇)组成Region,多个Region(行数据块、数据分片,类似kakfa的partition概念)组成完整的Table。

     其中,Store由Memstore(内存)、StoreFile(磁盘)两部分组成。

5. HBase写入数据的流程

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
HBase是一个分布式的、可扩展的、面向列的NoSQL数据库,它基于Hadoop分布式文件系统(HDFS)进行数据存储和处理。以下是HBase架构和组件以及运行原理的概述: 1. HBase架构: - Master节点:负责管理和协调整个HBase集群,包括表的创建、Region的分配和负载均衡等任务。 - RegionServer节点:负责存储和管理数据的实际节点,每个RegionServer可以管理多个Region。 - ZooKeeper:HBase使用ZooKeeper来进行分布式协调和元数据的管理。 - HDFS:HBase使用HDFS来存储数据和日志文件。 2. HBase组件: - 表(Table):HBase中的数据以表的形式进行组织,表由多个行和列族构成。 - 行(Row):表中的每一行都有一个唯一的RowKey来标识,行由多个列组成。 - 列族(Column Family):表中的列被组织成列族,每个列族可以包含多个列。 - 列(Column):表中的每个列都由列族和列限定符(Qualifier)组成,用于存储实际的数据。 3. HBase运行原理: - 数据存储:HBase将数据按照RowKey的字典顺序进行分区,每个RegionServer负责管理一些连续的行范围,将数据存储在HDFS上的HFile文件中。 - 写入流程:当客户端进行写入操作时,数据首先会被写入WAL(Write-Ahead Log)文件,然后异步地写入内存中的MemStore。当MemStore达到一定阈值时,数据会被刷写到磁盘上的HFile文件。 - 读取流程:当客户端进行读取操作时,HBase会先从MemStore中查找数据,如果没有找到,则从磁盘上的HFile文件中进行查找。为了加速查询,HBase还使用了Block Cache(缓存)来缓存常用的数据块。 - 负载均衡和自动故障恢复:HBase在Master节点上运行负载均衡算法,通过移动Region来平衡集群的负载。同时,HBase使用ZooKeeper来监控RegionServer的状态,当某个RegionServer宕机时,Master节点会重新分配该Region的副本。 通过以上架构和组件,以及基于HDFS的数据存储和协调机制,HBase能够实现高可靠性、高扩展性和高性能的分布式数据存储和查询。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值