`

HBase存储结构

 
阅读更多

一、 Hbase存储框架

 

 

1  Hbase存储架构图 

 

1、  结构

HBase中的每张表都通过行键按照一定的范围被分割成多个子表(HRegion),默认一个HRegion超过256M就要被分割成两个,由HRegionServer管理,管理哪些HRegion由HMaster分配。

HRegionServer存取一个子表时,会创建一个HRegion对象,然后对表的每个列族(Column Family)创建一个Store实例,每个Store都会有0个或多个StoreFile与之对应,每个StoreFile都会对应一个HFile, HFile就是实际的存储文件。因此,一个HRegion有多少个列族就有多少个Store。

另外,每个HRegion还拥有一个MemStore实例。

(发现上图中一个错误,一个HRegionServer只对应一个HLog,也就是说同个HRegionServer中的HRegion共享一个HLog

2、  流程

a)        Client发起了一个HTable.put(Put)请求给HRegionServer

b)        HRegionServer会将请求匹配到某个具体的HRegion上面

c)         决定是否写WAL logWAL log文件是一个标准的Hadoop SequenceFile,文件中存储了HLogKey,这些Keys包含了和实际数据对应的序列号,主要用于崩溃恢复。

d)        Put数据保存到MemStore中,同时检查MemStore状态,如果满了,则触发Flush to Disk请求。

e)        HRegionServer处理Flush to Disk的请求,将数据写成HFile文件并存到HDFS上,并且存储最后写入的数据序列号,这样就可以知道哪些数据已经存入了永久存储的HDFS中。

二、 Hbase存储格式

HBase是基于BigTable的面向列的分布式存储系统,其存储设计是基于Memtable / SSTable设计的,主要分为两部分,一部分为内存中的MemStore (Memtable),另外一部分为磁盘(这里是HDFS)上的HFile (SSTable)。还有就是存储WAL的log,主要实现类为HLog.

MemStore

MemStore源码:private final ConcurrentNavigableMap<KeyValue, KeyValue> delegatee;  

本质上MemStore就是一个内存里放着一个保存KEY/VALUE的MAP,当MemStore(默认64MB)写满之后,会开始刷磁盘操作。

HFile结构

 

2  HFile结构图 

HFile是基于HADOOP TFile的,如图2,文件长度为变长,仅FILE INFO/Trailer定长,Trailer中有指针指向其他数据块的起始点。Index数据块记录了每个Data块和Meta块的起始点。Data块和Meta块都是可有可无的,但对于大多数HFile,你都可以看到Data块。

Data块中,除了头部的MAGIC之外,就是一对对KEY/VALUE对,结构如下:

3  Data KEY/VALUE对结构

关于文件块的大小:

默认块大小64KB,在创建表时可以通过HColumnDescriptor设定每个Family的块大小。

大数据块:适合顺序查找,不适合随机查找。

小数据块,适合随机查找,需要更多内存保存Data Index,创建文件慢,更多的flush操作

 

4  HFile总体结构图

当key的value大小超过BLOCK SIZE时,那么查找这些value就无法通过索引去快速查找,而是需要通过遍历进行。

另外,针对目前针对现有HFile的两个主要缺陷:

a)        暂用过多内存

b)        启动加载时间缓慢

提出了HFile Version2设计:

https://issues.apache.org/jira/secure/attachment/12478329/hfile_format_v2_design_draft_0.1.pdf

HLog

HLog是HBase的日志类,在写入时进行write-ahead-log(WAL),主要为数据恢复。每个HRegionServer会对应一个HLog实例,HRegion在初始化的时候HRegionServer会将该HLog的实例作为构造函数传入其中。HLog的核心函数是其append()函数。

HLog File 是一个Sequence File,只能在文件的末尾添加内容。除了文件头以外,HLog File 由一条条HLog.Entry构成。Entry是HLog的基本组成部分,也是Read /Write的基本单位。

 

Entry由两个部分组成:HLogKey和WALEdit。

HLogKey主要包含以下几个变量:

private byte           [] encodedRegionName;

private byte           [] tablename;

private long           logSeqNum;            // Time at which this edit was written.
private long           writeTime;

private byte           clusterId;

 

logSeqNum是HLog 类的一个属性,AtomicLong类型。每写一个Entry就自动加1. 由于RS和HLog是一一对应的,所以logSeqNum是在RegionServer范围内的自增量。

WALEdit的主体是一个KeyValue的List。在旧的版本中WALEdit只包含一个KeyValue,然而新的版本可以包含多个KeyValue,而且这些KeyValue可以拥有不同的RowKey。

 

 

图5  HLog文件结构图

 

 

 

三、  HBase 预写日志 (WAL)

WAL最重要的作用是灾难恢复,一旦服务器崩溃,通过重放log,我们可以恢复崩溃之前的数据。如果写入WAL失败,整个操作也将认为失败。

6  WAL

 

基本流程:首先,客户端初始化一个可能对数据改动的操作,如put(Put),delete(Delete) 和 incrementColumnValue()。这些操作将被封装在一个KeyValue对象实例中,发送给HRegionServer。 一旦达到一定大小,HRegionServer 将其发送给HRegion。这个过程中,数据会首先会被写入WAL,之后将被写到实际存放数据的MemStore中。

 

HLog是实现WAL的类。一个HRegionServer对应一个HLog实例。当HRegion初始化时,HLog将作为一个参数传给HRegion的构造函数。

WAL中几个重要的类:

1.      HLog

HLog最核心的是调用doWrite的append() 方法,任何对数据改动的操作都就将首先调用这个方法。

出于性能考虑,put(), delete() 和incrementColumnValue()可通过开关函数setWriteToWAL (boolean) 禁用WAL。运行MapReduce Job时,可通过关闭WAL获得性能提升。

HLog另一个重要特性是将通过sequence number追踪数据改变。它内部使用AtomicLong保证线程安全。

2.      HLogKey

上一部分的存储格式中有提到,HLogKey包含的一些主要变量,主要用于记录Key/Value对的归属信息。

3.      LogFlusher

数据以KeyValue形式到达HRegionServer,将写入WAL,之后写入一个SequenceFile。由于数据流在写入文件时经常会缓存以提高性能,因此,有时数据实际保存在内存中。

LogFlusher调用HLog.optionalSync(),后者根据hbase. regionserver. optionallogflushinterval (默认10秒)定期调用Hlog.sync()。HLog.doWrite()也根据hbase.regionserver.flushlogentries  (默认100秒)定期调用Hlog.sync()。Sync() 本身调用HLog.Writer.sync(),它由SequenceFileLogWriter实现。

4.      LogRoller

Log的大小通过$HBASE_HOME/conf/hbase-site.xml 的hbase.regionserver.logroll.period限制,默认是一个小时。所以每60分钟,会打开一个新的log文件。久而久之,会有一大堆的文件需要维护。LogRoller主要完成日志的清理。

首先,LogRoller调用HLog.rollWriter(),定时滚动日志,之后,利用HLog.cleanOldLogs()可以清除旧的日志。它首先取得存储文件中的最大的sequence number,之后检查是否存在一个log所有的条目的”sequence number”均低于这个值,如果存在,将删除这个log。

5.      Replay

旧日志往往由RegionServer 崩溃产生。当HMaster启动或者检测到RegionServer 崩溃,它将日志文件拆分为多份文件,存储在region所属的文件夹。之后,将日志重放。

重放过程:HRegionServer启动,打开所管辖的Region,检查是否存在剩余的log文件,如果存在,调用Store.doReconstructionLog()。重放一个日志只是简单地读入一个日志,将日志中的条目加入到Memstore中。最后,flush操作将Memstore中数据flush到硬盘中。

四、 HBase 索引

目前的HBase新版本没有实现二级索引,以前hbase的版本有过二级索引,实现时也是写写数据再写索引,索引放到后台队列中异步地写。实现最终一致。

HBase移走这块代码的一个原因就是索引到底落后数据多少时间是不确定的,特别是在异常的情况下。这样就导致在清理HLog时无法确定一个HLog是否真正全部写入数据了。

关于HBase二级索引的一篇讨论文章,参考:http://rdc.taobao.com/team/jm/archives/951

 

问题:为什么一个RegionServer 对应一个HLog,而不是一个region对应于一个log file

BigTable论文答:如果每一个”tablet”(对应于HBaseregion)都提交一个日志文件,会需要并发写入大量的文件到GFS(对应HDFS),这样,根据每个GFS server所依赖的文件系统,写入不同的日志文件会造成大量的磁盘操作。

 

HBase依照这样的原则。在日志被回滚和安全删除之前,将会有大量的文件。如果改成一个region对应于一个文件,将会不好扩展,会引发问题。

 
分享到:
评论

相关推荐

    HBase存储架构详解

    HBase最隐秘的问题之一就是它的数据是如何存储的。虽然大多数用户都不会因为这个问题向你抱怨,但是如果你想学习哪些高级的配置选项并了解它们的意思,你可能就需要来了解一下这个存储问题了

    hbase应用架构指南

    Hbase全称为Hadoop Database,即Hbase是Hadoop的数据库,是一个分布式的存储系统。...本篇文章将重点介绍Hbase三个方面的内容:Hbase体系结构(架构)的介绍、Hbase shell的操作、Hbase的Java api的客户端操作

    阿里云大规模结构化云存储HBase架构特性解析

    阿里云技术专家、架构师 专注在大数据领域,有6年分布式引擎研发经验 先后研发上万台Hadoop、ODPS集群 先后负责阿里YARN、spark及自主研发内存计算引擎 目前为广大公共云用户提供专业的云Hadoop服务及 云HBase服务. ...

    HBase海量数据存储实战视频教程

    从HBase的集群搭建、HBaseshell操作、java编程、架构、原理、涉及的数据结构,并且结合陌陌海量消息存储案例来讲解实战HBase 课程亮点 1,知识体系完备,从小白到大神各阶段读者均能学有所获。 2,生动形象,化繁为...

    hbase安装与hbase架构说明

    HBase是Google Bigtable的开源实现,类似Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统;Google运行MapReduce来处理Bigtable中的海量数据,HBase同样利用HadoopMapReduce来...

    HBase 实战

    HBase实战 HBase in Action HBase实战 HBase in Action

    关于hbase表结构的知识点

    hbase表结构设计,新建表,查询表语句,删除表数据,删除表的例子。

    HBase分布式架构处理大数据量(高并发和实时处理)

    本文来自于csdn,介绍了Hadoop的原理,HBase的特点,HBase 的高并发和实时处理数据,数据模型,工作流程等。(一)HDFS主要是用于做什么的?HDFS(HadoopDistributedFileSystem)分布式文件管理系统、是Hadoop项目的...

    HBase数据库设计.doc

    7 3)HBase的内部结构管理状况: 7 4)HBase的使用示例: 8 6. HBase与Cassender的比较 8 7:几个关键概念: 9 行键(RowKey) 9 列族(ColumnFamily) 9 时间戳(TimeStamp) 9 单元格(Cell) 9 区域(Reg

    HBase(hbase-2.4.9-bin.tar.gz)

    HBase(hbase-2.4.9-bin.tar.gz)是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System...

    Hbase_存储结构.pptx

    Apache HBase是一个开源的,分布式的,版本化的非关系数据库,模仿Google的Bigtable结构化数据分布式存储系统。 正如Bigtable利用Google文件系统提供的分布式数据存储一样,Apache HBase在Hadoop和HDFS之上提供类似...

    FlinkSQL实战:HBase的结合应用

    HBase作为Google发表BigTable论文的开源实现版本,是一种分布式列式存储的数据库,构建在HDFS之上的NoSQL数据库,非常适合大规模实时查询,因此HBase在实时计算领域使用非常广泛。可以实时写HBase,也可以利用...

    HBase.docx

    4.HBASE的架构 6 5.apache的下载地址 7 二、HBase安装部署与简单应用 7 一:下载安装 7 1.下载安装 7 2.开启hadoop与zookeeper 7 3.修改配置文件hbase-env 7 4.修改配置hbase-site 7 5.修正版本 8 6.启动 9 二:访问...

    Hbase学习分享资料

    本文首先简单介绍了HBase,然后重点讲述了HBase的高并发和实时处理数据 、HBase数据模型、HBase物理存储、HBase系统架构,HBase调优、HBase Shell访问等。

    Hbase权威指南(HBase: The Definitive Guide)

     ■了解hbase架构的细节,包括存储格式、预写日志、后台进程等等  ■在hbase中集成用于海量并行数据处理任务的hadoop的mapreduce框架  ■了解如何调节集群、设计模式、拷贝表、导入批量数据、删除节点以及其他更...

    Hbase与zookeeper文档

    HBase即Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在普通的PC Server上搭建起大规模结构化存储集群。 HBase是Google Bigtable的开源实现,类似Google Bigtable利用...

    Hbase+Spring boot实战分布式文件存储

    2-1 HBase简介及其在大数据生态圈的位置 2-2 HBase数据存储模型及与关系型数据库的区别 2-3 Hadoop伪分布式集群安装 2-4 HBase伪分布式集群安装 2-5 HBase基础架构 2-6 HBase阶段小结 第3章 HBase原理与实战 介绍...

    论文研究-基于HBase的气象结构化数据查询优化.pdf

    首先,根据HBase存储特性设计表结构;然后,利用协处理器建立和维护辅助索引,将字段查询转化为对索引表的行键查询,使得HBase4M在具备HBase可扩展性、低延迟的特性上可以支持结构化气象数据的灵活查询。实验结果...

    Hbase2.2.4.rar

    Hbase2.2.4安装包,HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供...

Global site tag (gtag.js) - Google Analytics