`

[Binospace] HBase Flush操作流程以及对读写服务的影响

阅读更多

HBase Flush操作流程以及对读写服务的影响

 

HBase的Flush操作的触发条件:

1)Manual调用,HRegionInterface#flushRegion,可以被用户态org.apache.hadoop.hbase.client.HBaseAdmin调用flush操作实现,该操作会直接触发HRegion的internalFlush。

2)HRegionServer的一次更新操作,使得整个内存使用超过警戒线。警戒线是globalMemStoreLimit, RS_JVM_HEAPSIZE * conf.getFloat(“hbase.regionserver.global.memstore.upperLimit”),凡是超过这个值的情况,会直接触发FlushThread,从全局的HRegion中选择一个,将其MemStore刷入hdfs,从而保证rs全局的memstore容量在可控的范围。

 

RS上HRegion的选择算法:

步骤1:RS上的Region,按照其MemStore的容量进行排序。

步骤2:选出Region下的Store中的StoreFile的个数未达到hbase.hstore.blockingStoreFiles,并且MemStore使用最多的Region。— bestFlushableRegion

步骤3:选出Region下的MemStore使用最多的Region。— bestAnyRegion

步骤4:如果bestAnyRegion的memstore使用量超出了bestFlushableRegion的两倍,这从另外一个角度说明,虽然当前bestAnyRegion有超过blockingStoreFiles个数的文件,但是考虑到RS内存的压力,冒着被执行Compaction的风险,也选择这个Region,因为收益大。否则,直接使用bestFlushableRegion。

 

指定的Region写入hdfs的过程:

步骤1:获得updatesLock的写锁,阻塞所有对于该Region的更新操作。由此,可知Flush操作会阻塞Region区域内Row的更新操作(Put、Delete、Increment),因为在阻塞更新操作期间,涉及到Memstore的snapshot操作,如果不做限制,那么很可能一个put操作的多个KV,分别落在kvset和snapshot当中,从而与hbase保证row的原子性相悖。

 

步骤2:mvcc推进一次写操作事务。每个Region维护了一个mvcc对象(Multi Version

Consistency Control),用来控制读写操作的事务性。

 

步骤3:从HLog中获取一个新的newSeqNum,更新HLog的lastSeqWritten。由于此时该Region的更新操作会暂停,因此,会暂时删除lastSeqWritten记录的<RegionName,lastSeqNum>,写入<”snp”+RegionName, newSeqNum>到lastSeqWritten中。这里的lastSeqWritten是HLog用来存储每个Regiond到当前时刻最后一次提交操作的SeqNum。

 

步骤4:为Region下的每个Store的MemStore执行snapshot操作。

如上图所示,HRegion上Store的个数是由Table中ColumnFamily的个数确定,每个Store是由一个MemStore和数个StoreFile(HFile)文件组成,在正常的更新操作过程中,更新的内容会写入MemStore里的kvset结构中。HRegion执行Flush操作,实际上是把MemStore的内容全部刷入hdfs的过程。虽然,目前更新操作已经通过加写锁阻塞,可是读操作仍然可以继续,因此,在memstore执行snapshot的过程中,通过reference,snapshot会指向kvset,然后给kvset指向一个全新的内存区域。代码如下:

 

步骤5:释放updatesLock的写锁,此时该HRegion可以接收更新操作。

 

步骤6:更新mvcc读版本到当前写版本号。

这里有一个小插曲,在更新操作时,mvcc. completeMemstoreInsert 的操作在updatesLock的范围之外,这样在多线程高并发情况下,就存在已经写入MemStore的kvset当中,但是事务还未完成提交的情况。该场景相关代码如下:

从4358行,我们可以清晰看到,通过updatesLock保证了更新操作写入了MemStore的kvset,但假定Flush线程在其它更新线程4363行之后,获得了updatesLock写锁,并执行了snapshot操作。那么,这里的mvcc就会出现读写的事务号不一致的情况,因此,在Region的Flush线程就需要使用waitForRead(w),等待更新到目前写版本号。

 

步骤7:将Store内的snapshot写成一个StoreFile临时文件。

步骤8:重命名storefile文件,更新Store里文件和Memstore状态。

在步骤8完成之前,整个Hregion的读请求,是和之前没有影响的。因为在读请求过程中,StoreScanner对于kvset和snapshot进行进行同步读取,即使kvset切换成snapshot,scan的操作仍然可以继续,这部分的内容是由MemStoreScanner来控制。

在读过程中,Store里的scanner有两部份,一个是StoreFileScanner,另外一个是MemStoreScanner,它们都继承了KeyValueScanner接口,并通过StoreScanner中的KeyValueHeap封装起来。于此类似,在RegionScannerImpl也是通过一个KeyValueHeap把每个Store的StoreScanner封装起来,从而直接提供对外的服务。

 

读到这里,可能细心的工程师们,就会有一个疑问:Flush操作对于读的影响究竟有没有呢?

有影响,但比较小。在步骤8以前那些阶段,MemStoreScanner做到了对于kvset与snapshot的自由切换。

 

如上所示,如果kvset被重置,那么theNext将不再等于kvsetNextRow,从而切换成开始从snapshot迭代器中获取数据。

 

因此,在步骤1~7之间,对于读服务影响不大。但是在步骤8操作最后一步时,需要把生成storefile更新到可用的Store中的StoreFile列表,并清除snapshot的内容。

于是,此时ChangedReaderOberver就开始起作用了。

// Tell listeners of the change in readers.

notifyChangedReadersObservers();

这里最为关键的是,将storescanner用来封装全部StoreFileScanner和MemStoreScanner的heap清空,它会触犯的作用是在执行next()操作时,会触发resetScannerStack操作,会重新加载Store下的所有Scanner,并执行seek到最后一次更新的key。这个过程会使得flush操作对于某些next操作变得突然顿一下。

 

文章的脚注信息由WordPress的wp-posturl插件自动生成

 

分享到:
评论

相关推荐

    HbaseTemplate 操作hbase

    而Spring Data Hadoop是Spring框架的一部分,它提供了与Hadoop生态系统集成的工具,包括对HBase的操作支持。本篇文章将详细讲解如何利用Spring Data Hadoop中的HbaseTemplate来操作HBase。 首先,我们需要理解...

    Hbase操作示例 Hbase的读写例子

    本人原创, 1.Hbase连接需要改Hbase包中的两个配置文件,加上Hbase所在机器ip及端口 2.HBaseDMLT初始化环境 3.MapDataIni为建表 4.MapDataInsert为写数据 5.MapDataDelete为删除数据 6.MapDataRead为读数据

    hbase的shell操作

    根据提供的文件信息,本文将详细介绍HBase的Shell操作及其应用场景,包括如何创建表、插入数据、查询数据等关键操作。 ### HBase Shell简介 HBase Shell是HBase提供的一种交互式命令行工具,用于执行HBase操作。它...

    实验三:熟悉常用的HBase操作

    实验的目标是让你理解HBase在Hadoop架构中的地位,以及掌握通过Shell命令和Java API进行基本操作的方法。 首先,让我们来看看实验的平台配置。实验要求的操作系统是Linux,这通常是大数据处理的首选平台,因为它...

    HBASE赋权操作

    HBASE 赋权操作是指对 HBASE 系统中的用户和资源进行权限管理和控制的操作。该操作通常结合 KERBEROS 进行身份认证和授权,以确保 HBASE 系统中的数据安全。 一、Kerberos 操作 在 HBASE 赋权操作中,首先需要在 ...

    hbase shell操作指南

    在HBase中更新数据与插入数据使用相同的`put`命令,因为HBase对每个单元格的操作都是覆写的。当你使用`put`命令时,如果列已存在,其值将被新的值替换。 7. 删除数据 删除数据包括删除整行和删除单列。删除一行使用...

    HBase基本操作 Java代码

    HBase基本操作 增删改查 java代码 要使用须导入对应的jar包

    hbase 完全使用手册

    在使用 HBase 时,用户需要熟悉 HBase Shell 命令行工具或者 HBase 提供的 Java API 来进行数据的读写操作。HBase Shell 提供了一个交互式的界面,允许用户执行数据操作、管理表结构、以及维护集群状态等。Java API ...

    HBASE具体操作指令

    HBase具体操作指令 HBase是一个基于Hadoop的分布式Nosql数据库,提供了多种操作指令来管理和维护数据库。下面将对HBase shell commands进行分类和详细解释。 一、General HBase shell commands 1. status:显示...

    Hbase的安装过程及基本操作

    在本文中,我们将详细讲解Hbase的安装过程以及基本操作,特别针对在Linux环境下使用清华大学镜像进行下载的情况。Hbase是一个分布式的、面向列的数据库,常用于大数据存储,是Apache Hadoop生态系统的一部分。以下是...

    HBase基本操作.pdf

    与传统关系型数据库不同,HBase是分布式存储的,且不使用SQL进行数据操作,它的设计目标是横向扩展并且支持大数据量的实时读写。HBase使用Hadoop的HDFS作为其文件存储系统,能够容忍节点故障,并自动进行数据复制以...

    Java操作Hbase进行建表、删表以及对数据进行增删改查

    Java 操作 Hbase 进行建表、删表以及对数据进行增删改查 一、Hbase 简介 Hbase 是一个开源的、分布式的、基于 column-family 的 NoSQL 数据库。它是基于 Hadoop 的,使用 HDFS 作为其存储层。Hbase 提供了高性能、...

    大数据技术原理及应用课实验3 熟悉常用的HBase操作 林子雨实验

    【大数据技术原理及应用实验3:熟悉常用的HBase操作】 HBase是一种分布式、列式存储的NoSQL数据库,它是构建在Hadoop文件系统(HDFS)之上的,用于处理大规模数据集的应用。在Hadoop生态体系中,HBase提供实时读写...

    hbase的操作数据demo

    Zookeeper用于协调HBase集群的状态,保证服务的高可用性。 总之,"hbase的操作数据demo"这个压缩包可能包含了一些实用的脚本或代码示例,用于演示HBase的基本操作,包括查询、获取和删除数据。通过学习这些示例,...

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

    - **MapReduce集成**:HBase支持MapReduce任务直接对存储在HBase中的数据进行处理,这大大简化了数据处理流程,提高了效率。 #### 四、HBase的关键特性 - **可扩展性**:HBase能够轻松地扩展到数百甚至数千台服务器...

    Hbase 安装与基本使用

    本文将深入探讨HBase的安装过程以及基本使用方法,旨在帮助初学者快速上手。 **一、HBase简介** HBase是Google Bigtable的开源实现,它在Hadoop文件系统(HDFS)之上构建,提供了高度可扩展性和实时读写能力。HBase...

    java操作Hbase之从Hbase中读取数据写入hdfs中源码

    HBase的设计目标是对超大型表进行随机、实时读写操作。而HDFS则是Hadoop的核心组件,作为一个分布式文件系统,它能够跨多台服务器存储和处理大量数据。 在Java中操作HBase,我们需要使用HBase的Java客户端API。首先...

    读写HBase数据.pdf

    下面将详细介绍如何使用Spark及pyspark进行HBase数据的读写,以及HBase的安装配置。 首先,要进行HBase的安装与配置。这通常包括以下几个步骤: 1. 将HBase安装包上传到服务器(如Ubuntu)上,并解压缩。将其移动...

    hbase 资源合集 hbase 企业应用开发实战 权威指南 hbase 实战 hbase 应用架构

    HBase的核心特性包括强一致性、高可扩展性以及实时读写能力,使得它在大数据领域扮演着重要的角色。 《HBase企业应用开发实战》主要面向实际应用开发人员,提供了大量实际案例和解决方案,帮助读者了解如何在企业...

    thrift操作Hbase数据库

    通过上述步骤,我们可以使用C#语言通过Thrift2接口实现对Hbase数据库的全面操作。这个项目中的代码文件`C# thrift2ToHbase`应该包含了实现这些功能的具体代码示例,可以帮助我们深入理解这一过程。学习并实践这个...

Global site tag (gtag.js) - Google Analytics