一、HBase的存储模式

  1.行式存储与列式存储介绍

Hbase 存储Blob数据 hbase存储原理_大数据



列簇式存储:概念

  • 列簇(多个数据列的组合),HBase表中的每个列都归属于某个列簇
  • 列簇是表的schame的一部分,但是列并不是
  • 创建表时,需要给出列簇的名称,不需要给出列的名称
  • 列名都是以列簇作为前缀
  • 访问控制磁盘和内存的使用统计都是在列簇层面进行
  • HBase准确的说是列簇数据库,而不是列数据库
  • 列簇数据库将列组织为列簇,每列都必须是某个列簇的一部分
  • 访问数据的单元也是列


作者:喵手空空



  2.行式存储与列式存储各自的特点

行式存储

    维护大量的索引;

    存储成本高

    不能够做到线性扩展

    随机读取效率非常高

    对事务的支持非常好

列式存储

根据同一列数据的相似性原理,利于对数据进行压缩

存储成本低

由于每列数据分开存储,可以并行查找多列的数据

  3.行式存储与列式存储场景

行式存储

    表与表之间有关联关系,数据量不大(小于千万量级)

    强事务关联的特性

列式存储

对于单列或者相对比较少的列获取频率较高

针对多列查询,使用并行处理的查询

利于数据压缩和线性扩展的存储

事务使用率不高,读取的场景频率不高,同时数据量非常大

随机更新某一行的频率不高

  4.HBase的列族式存储

列族式存储概念

     列簇(多个数据列的组合),HBase表中的每个列都归属于某个列簇

     列簇是表的schame的一部分,但是列并不是

创建表时,需要给出列簇的名称,不需要给出列的名称

列名都是以列簇作为前缀

访问控制磁盘和内存的使用统计都是在列簇层面进行

准确的说是列簇数据库,而不是列数据库

列簇数据库将列组织为列簇,每列都必须是某个列簇的一部分

访问数据的单元也是列

 

     HBase表的组成

    

Hbase 存储Blob数据 hbase存储原理_Hbase 存储Blob数据_02

:HBase中用RowKey去标识唯一的一行数据,一行数据中包含多个列簇

:多个列簇。每一列簇包含多个列

:列标识符。每一列数据包含了版本和值

:版本。可以理解为时间戳,也可以理解为一个数据的版本

:数据值。数据本身的值

 

 

    数据存储模式

     

Hbase 存储Blob数据 hbase存储原理_git_03

其实就是HBase表反过来看的样子

更抽象一点,其实HBase表数据就是Key-Value结构的



HBase表的组成

  • Table = RowKey + Family + Column + Timestamp + Value
  • RowKey :HBase中用RowKey去标识唯一的一行数据,一行数据中包含多个列簇
  • Family:多个列簇。每一列簇包含多个列
  • Column:列标识符。每一列数据包含了版本和值
  • Timestamp:版本。可以理解为时间戳,也可以理解为一个数据的版本
  • Value:数据值。数据本身的值


作者:喵手空空



       图解

     

Hbase 存储Blob数据 hbase存储原理_数据_04



HBase表的组成

  • Table = RowKey + Family + Column + Timestamp + Value
  • RowKey :HBase中用RowKey去标识唯一的一行数据,一行数据中包含多个列簇
  • Family:多个列簇。每一列簇包含多个列
  • Column:列标识符。每一列数据包含了版本和值
  • Timestamp:版本。可以理解为时间戳,也可以理解为一个数据的版本
  • Value:数据值。数据本身的值


作者:喵手空空



 

列数据属性

Hbase 存储Blob数据 hbase存储原理_git_05

数据存储原型

Hbase 存储Blob数据 hbase存储原理_Hbase 存储Blob数据_06

存储示例

 

Hbase 存储Blob数据 hbase存储原理_git_07

二、HBase数据表解析

建表语句解析

Hbase 存储Blob数据 hbase存储原理_git_08

   关键字说明

     

Hbase 存储Blob数据 hbase存储原理_git_09

   压缩算法

    

Hbase 存储Blob数据 hbase存储原理_Hbase 存储Blob数据_10

数据存储目录解析

    在hbase-site.xml文件中配置或查看存储目录的节点

      <property>

        <name>hbase.rootdir</name>

        <value>/home/hbase_data</value>

       </property>

    进入到HBase系统目录

  • temp

      当对表做创建或删除操作时,将表移动到tmp目录下,然后再进行处理

      临时交换的表,临时存储一些当前需要修改的数据结构

  • WALs

      预写日志,被HLog实例管理的WAL文件

      可以理解为存储HBase的日志,HBase分布式数据库系统的操作日志

  • archive

      存储表的归档和快照

在做分割或合并操作完成后,会将Hfile文件移动到该目录中,然后将之前的Hfile删除掉

      是由Master上的定时任务定期去处理,这个目录的作用可以简单理解为去管理HBase的数据

  • corrupt

       用于存放损坏的日志文件,一般是空的

  • data

存储数据的核心目录

      系统表和用户表数据都存储在这里

  • hbase.id

启动运行后,是集群中的唯一ID,用来标识HBase进程用的

  • hbase.version

      表明了集群的文件格式版本信息

      其实就是表明了Hfile的版本信息

  • oldWALs

      备份WALs中的日志文件

     data目录解析

 

Hbase 存储Blob数据 hbase存储原理_数据_11

元信息表

  

Hbase 存储Blob数据 hbase存储原理_Hbase 存储Blob数据_12

三、HBase存储设计

中的LSM存储思想

    (1)LSM树概念

      LSM日志结构合并树,有两个或两个以上存储数据的结构组成的,每一个数据结构各自对应自己的存储介质

树的简易模型

     

Hbase 存储Blob数据 hbase存储原理_Hbase 存储Blob数据_13

思想在HBase中的实现  

    

Hbase 存储Blob数据 hbase存储原理_大数据_14

数据存储模块简介

    RegionServer = Region + Store + MemStore + StoreFile + HFile + HLog

     

Hbase 存储Blob数据 hbase存储原理_大数据_15

解析

什么是Region

      每一个Region都会存储于确定的RegionServer上

       

Hbase 存储Blob数据 hbase存储原理_Hbase 存储Blob数据_16

特点

  1. 是HBase中分布式存储和负载均衡的最小单元
  2. Region的数据不能低于集群中节点的数量
  3. RegionServer对Region进行拆分  
  4. 尽量让Row key分散到不同的Region

解析

    Store + MemStore + StoreFile

  • Store与列簇是一对一的关系
  • MemStore是一个内存数据结构,保存修改的数据
  • StoreFile是由内存数据写入到文件后形成的

       

Hbase 存储Blob数据 hbase存储原理_数据结构与算法_17

    HFile 文件

  • 是HBase存储数据文件的最基本的组织形式
  • 底层是Hadoop的二进制格式文件
  • 是用户数据的实际载体,存储Key-Value的数据
  • Scanned block section:会被读取,主要是存储用户数据
  • Nonscanned block section:不会被读取,主要包含元数据块
  • Load-on-open section:RegionServer启动时加载,主要是HFile的元数据
  • Trailer:HFile的基本信息,HFile元数据的一部分

 

Hbase 存储Blob数据 hbase存储原理_数据结构与算法_18

    Data Block

  • HBase中数据的最基本的存储单元
  • 是实际存储用户数据的数据结构
  • 包含很多Key-Value

    

Hbase 存储Blob数据 hbase存储原理_Hbase 存储Blob数据_19

解析

介绍(预写日志)

  • WAL最重要的功能就是灾难恢复
  • WAL解决了什么问题:HA(高可用)问题
  • 解决:远程备份

        

Hbase 存储Blob数据 hbase存储原理_大数据_20

     (2)HLog

  • WAL是通过HLog模块实现的
  • HLog是什么:HLog是实现WAL的类,一个RegionServer对应一个HLog实例

     

Hbase 存储Blob数据 hbase存储原理_数据结构与算法_21

    (3)HLogKey

        WAL使用Hadoop的序列化文件将记录存储为Key-Value的数据集,Key就是HLog的Key

       

Hbase 存储Blob数据 hbase存储原理_数据结构与算法_22

(日志同步刷写类)

      

Hbase 存储Blob数据 hbase存储原理_数据_23

    (5)HLogRoller

  • 特点的时间去滚动日志,形成新的日志,避免单个日志文件过大    
  • 根据HLog的序列化的number对比已经持久化的HFile的序列号,删除旧的,不需要的日志

        

Hbase 存储Blob数据 hbase存储原理_大数据_24

解析

介绍

        Compaction会从一个Region的Store中选择一些HFile文件进行合并

作业

        随着系统不停的刷写,会导致存储目录中有过多的数据文件

分类

  • MinorCompaction:小合并    
  • MajorCompaction:大合并     

         

Hbase 存储Blob数据 hbase存储原理_大数据_25

的触发时机

      MemStore 内存数据写入到硬盘上

      

Hbase 存储Blob数据 hbase存储原理_大数据_26

四、Hbase数据存取解析

数据存取流程解析

数据存储

客户端:HBase Client

  • 请求Zookeeper,确定 MetaTable所在RegionServer的地址    
  • 在根据RowKey找到归属的RegionServer    
  • HBase Client Put(Delete)数据,提交到RegionServer     

       

Hbase 存储Blob数据 hbase存储原理_大数据_27

服务器:HBase Server

  • Region Server 去获取行锁,Region更新共享锁    
  • 写HLog,WAL    
  • 写缓存,MemStore    
  • 将日志同步到HDFS    
  • 写满缓存后,启动异步线程将数据写入到硬盘上    
  • 可能触发Compaction或拆分     

       

Hbase 存储Blob数据 hbase存储原理_git_28

数据获取

客户端:HBase Client

  • 请求Zookeeper,确定 MetaTable所在RegionServer的地址    
  • 去对应的RegionServer地址拿到对应数据     

         

Hbase 存储Blob数据 hbase存储原理_git_29

服务端:HBase Server

  • Region Server 构建RegionScanner准备进行检索    
  • 有多少个列簇就构建多少个StoreScanner,用于对确定的列簇数据检索     

       

Hbase 存储Blob数据 hbase存储原理_git_30

 

 

数据存取优化

存储优化

检索(获取)优化

Hbase 存储Blob数据 hbase存储原理_git_31

 

Hbase 存储Blob数据 hbase存储原理_数据_32

数据存取api介绍

存储数据api介绍

Hbase 存储Blob数据 hbase存储原理_git_33